Дерево страниц
Skip to end of metadata
Go to start of metadata

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 7 Следующий »

SpEL-выражения вычисляются в контексте текущего основного объекта. В SpEL-выражениях можно использовать константы, математические и логические операции, операции сравнения, условные операторы, роли текущего пользователя. В SpEL-выражениях можно обратиться к любому атрибуту текущего объекта.

Статус

В РАБОТЕ

КомментарийИсточник

Основные правила

Строковые константы задаются в одинарных кавычках.  Для использования одинарных кавычек внутри строковой константы, знак одинарной кавычки удваивается.

'Раздел', 'Тема: ''Для согласования'''

Для обозначения того, что значение атрибута не определено, используется специальное значение null.

Пример. Признак "Зарегистрирован документ"
registration == null ? false : true

Обращение к атрибуту объекта происходит по названию соответствующего Свойства схемы объекта (например, registration). Для обращения к атрибутам комплексных свойств указывается иерархический путь к атрибуту (например, registration.number.prefix).

Пример. Вычисление рег. номера
'№' + registration.number.prefix + registration.number.number + registration.number.suffix

Однако, если РКК не зарегистрирована, то значение атрибута registration.number будет неопределенно, и такое выражение может привести к ошибке. Чтобы этого избежать, можно использовать условный оператор, который вернет пустую строку, если номер не определен:

Пример. Вычисление рег. номера (обработка ошибок)
registration ==null ? '': registration.number==null ? '' : '№' + registration.number.prefix + registration.number.number + registration.number.suffix

Другой способ избежать ошибок, если значения атрибутов не определены – использование «безопасной адресации». Тогда если неопределенно значение объекта, к атрибуту которого нужно обратиться, вместо ошибки будет возвращено значение Null. Для «безопасной адресации» перед точкой добавляется знак вопроса:

Пример. Вычисление рег. номера (обработка ошибок 2)
'№' + registration?.number?.prefix + registration?.number?.number + registration?.number?.suffix


Операции сравнения

Операция

Равно

Не равно

Меньше

Меньше или равно

Больше

Больше или равно

Знак

==

!=

<=

>=

Буквенное выражение

eq

ne

lt

le

gt

ge

Дополнительно могут использоваться:

  • оператор проверки типа instanceof;
  • оператор сравнения с шаблоном (регулярным выражением) matches.


Математические операции

Операция

Сложение

Вычитание

Умножение

Деление

Остаток от деления

Степень

Знак

+

-

*

/

%

^

Буквенное выражение




div

mod


Сложение может использоваться как для чисел, так и для строк. Остальные операции – только для чисел. Поддерживается стандартный порядок выполнения математических операций в выражениях.


Логические операции

Операция

И

Или

Отрицание

Знак

&&

||

!

Буквенное выражение

and

or


Условный оператор

<Условие> ? <Значение, если условие выполнено> : <Значение, если условие не выполнено>

Специальные зарегистрированные функции и переменные

Здесь описаны наиболее востребованные переменные и функции. Дополнительные возможности использования зарегистрированных функций нужно уточнять у разработчиков.

#this

Переменная для обращения к контекстному объекту, над которым вычисляется SpEL-выражение.

#hasRole(<объект>, <идентификатор_роли>)

Функция, определяющая наличие указанной роли у текущего пользователя в контексте указанного объекта. В качестве объекта в данный момент допустимо использовать переменную #this. Идентификатор роли передается как строковая константа. Функция возвращает значение «true» или «false».

Пример. Проверка наличия у пользователя роли ACL «Supervisor»
#hasRole(#this, 'Supervisor')


#isClerk(<объект>, <иерархический_путь_к_атрибуту>)

Функция, определяющая наличие у текущего пользователя системной роли «Делопроизводитель» для указанного  в параметрах функции подразделения в контексте указанного объекта. В качестве объекта в данный момент допустимо использовать переменную #this. Иерархический путь к атрибуту должен указывать на атрибут с типом SOBeard, соответствующий подразделению. Если в качестве значения параметра передать значение null, то будет определено наличие роли «Делопроизводитель» для места регистрации. Функция возвращает значение «true» или «false».

Пример. Проверка наличия у пользователя роли «Делопроизводитель» для места регистрации
#isClerk(#this,null)
Пример. Проверка наличия у пользователя «Делопроизводитель» для подразделения, указанного в атрибуте sending.department
#isClerk(#this,'sending.department')


#getUserDepartment()

Функция для вычисления подразделения текущего пользователя.

#hasLink(<объект>, <идентификатор_типа_отношения>)

функция, проверяющая наличие у объекта ссылки с указанным типом отношения. В качестве объекта в данный момент допустимо использовать переменную #this. Возможные типы отношения для объекта нужно уточнять у разработчика. Функция возвращает значение «true» или «false».

Например, наличие у объекта ссылки с типом отношения «verification», говорит о том, что документ был заверен ЭП.

#hasLink(#this,'verification')


При использовании функции нужно учесть, что могут существовать нестандартные ссылки, для которых использование функции недопустимо.

Примеры

Текущий пользователь

T(ru.intertrust.cmj.af.core.AFSession).get().currentUser().getBeard()

Текущая дата

T(ru.intertrust.cmj.af.misc.AFDate).createCurrent()

Увеличение / уменьшение даты

функции rollYears, rollMounths, rollDays класса AFDate изменяют дату на указанное в параметре количество лет, месяцев, дней соответственно. Отрицательный параметр уменьшает дату. Доступны с версии 4.6

Пример: в поле соответствующее свойству схемы, устанавливается значение на месяц раньше текущей даты

T(ru.intertrust.cmj.af.misc.AFDate).createCurrent().rollMounths(-1)

Первый элемент %-имени пользователя, указанного в свойстве схемы SDepartment с типом SOBeard

не массив

SDepartment != null ? SDepartment.toString(T(ru.intertrust.cmj.af.so.SOBeard.ToStringFormat).CMDOMINO_STD).split('%')[0] : ''

массив, берем первый элемент списка

SDepartment != null ? T(com.google.common.collect.Lists).transform(SDepartment, T(ru.intertrust.cmj.rest.vcards.VCardResource).vcardTobeard).get(0).toString(T(ru.intertrust.cmj.af.so.SOBeard.ToStringFormat).CMDOMINO_STD).split('%')[0] : ''

  • Нет меток