Скрипт условия действия по событию

Описание скрипта

Скрипт задает и проверят условия выполнения действия по событию.

Для одного действия по событию может быть задано одно или несколько условий выполнения действия по событию.

Место настройки скрипта

Форма добавления условия и форма редактирования условия, вызванные из карточки действия по событию, см. Условия выполнения действия по событию.

Когда выполняется скрипт

Скрипт выполняется при наступлении события, инициирующего действие.

Если задано несколько скриптов проверки условий, то скрипты выполняются в произвольном порядке при наступлении события, инициирующего действие.

Результат выполнения скрипта

Скрипт возвращает значение "null" (пустую строку) или выводит сообщение об ошибке, если оно задано в скрипте.

Если все скрипты вернули "null" (пустую строку), то действие по событию выполняется.

Если хотя бы один скрипт вернул сообщение об ошибке, то действие по событию не выполняется. Сообщение об ошибке записывается в лог.

Переменные и их значения

Глобальные переменные:

  • user — пользователь, инициализировавший событие. Является объектом класса "Сотрудник" (employee).

    Если событие инициализировал суперпользователь, то user=null.

    Если событие инициализировано скриптом (скриптовое действие по событию, скрипт на вход в статус), то переменная user берется из контекста инициировавшего его скрипта.

    Пример: пользователь выполнил изменение атрибута → произошло изменение статуса объекта (действие по событию) → произошло изменение ответственного (действие на вход в статус) → произошло оповещение (действие по событию) .Во всех скриптах этой цепочки переменная user должна содержать сотрудника, выполнившего первоначальное изменение атрибута.

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

    Пример цепочки: пользователь изменяет статус объекта → инициируется событие "Смена статуса" → выполняется редактирование объекта (скрипт действия при входе в статус редактирует переменную subject через utils.edit) → инициируется событие "Изменение объекта" → отправляется оповещение (скрипт действия по событию "Изменение объекта"). Если в данной цепочке в переменную utils.edit не передать значение user, то в скрипте действия по событию user=null.

    Пример: Передача значения переменной user в следующий скрипт цепочки действий редактировании объекта.

    def serviceCall = utils.get('serviceCall$3801');
    utils.edit(serviceCall, ['title' : 'qwerty', '@user' : user]);
  • ip — ip-адрес рабочего места пользователя user. Если действие выполняется автоматически системой (а не пользователем), то переменная не определяется.
  • appVersion — версия приложения.
  • api — используется для обращения к методам api, например api.utils, api.ldap, api.timing, см. Методы API;
  • modules — используется для обращения к скриптовому модулю и конкретному методу, определенному в нем, с помощью конструкции: modules.{код модуля}.{имя метода}({параметры метода}...), см. Скрипт текста модуля;
  • logger — используется для отладки скриптов и позволяет вывести в лог на указанный уровень переданную строку, см. Оформление и отладка скриптов.
  • utils — синоним api.utils.

Переменные контекста:

  • sourceObject — в действиях по событиям на добавление объекта в системе (объект / комментарий / файл) sourceObject это добавленный объект / комментарий / файл.
  • escalationLevel — уровень эскалации (целое число, начинается с 1). Уровень эскалации характеризует текущую стадию выполнения процедуры эскалации для данного объекта, см. Эскалация.
  • subject — текущий объект, над которым производится действие (значение переменной может быть null). В переменной subject хранятся значения атрибутов объекта на момент создания действия по событию.
  • oldSubject — объект до выполнения события, в случаях если происходило его изменение (редактирование атрибутов, смена статуса, изменения объекта, изменение признака массовости для запроса), иначе значение переменной null.

    При использовании переменной значение атрибутов типа "Обратная ссылка" всегда будет равно null.

  • currentSubject — объект, над которым производится действие. В переменной currentSubject хранятся значения атрибутов объекта на момент обработки действия по событию. Переменная currentSubject недоступна для пользовательских действий по событию.
  • changedAttributes — список кодов атрибутов, значения которых изменились при редактировании объекта.
  • cardObject — объект, из карточки которого было инициировано действие.

    Если действие инициировано НЕ из карточки объекта, то cardObject = null.

  • params — значения параметров действия по событию, заполняемых в интерфейсе на форме выполнения пользовательского действия по событию, см. Настройка параметров пользовательского действия.

    До версии 4.7 переменная "params" могла использоваться в скриптах для любых целей. С версии 4.7 и старше скрипты с переменной "params" работают по указанной системной логике (обращение к параметрами на форме), другая логика переменной игнорируется.

    Чтобы использовать другую логику переменной params, необходимо заменить в существующих скриптах название своей переменной "params" на какое-то другое.

Особенности использования переменных subject, currentSubject и oldSubject в скриптах на действия по событиям:

  • В зависимости от типа обрабатываемого события, значение переменных может быть "null". Например, в действии по событию "Добавление объекта" есть subject, а oldSubject = null, в действии по событию "Удаление объекта" subject = null, но есть oldSubject, т.к.при удалении объекта уже не существует текущего объекта.
  • При добавлении объектов subject существует (subject!= null), однако многие его атрибуты еще не заполнены (subject['attr_code']== null). Поэтому в скриптах на вход в первый статус "Зарегистрирован" (registered), следует получать начальные значения атрибутов с формы добавления, используя переменную initialValues.
  • Любое действие по событию, даже синхронное, при добавлении объекта срабатывает только после окончания создания объекта, поэтому сама переменная subject и все ее атрибуты будут существовать.

Особенности скрипта

Скрипт-условие действия по событию выполняется в той же транзакции, что и само действие по событию.

Если включена локализация, то при выполнении скрипта "Условие действия по событию" для действий типа "Оповещение", "Уведомление в интерфейсе", "Уведомление в МК", "Уведомление в Портале" вместо одного оповещения формируется несколько экземпляров оповещений — по одному на каждый язык. Проверка условий выполняется отдельно для каждого языка — скрипты условий по событию выполняются в той локали, которая используется в формируемом оповещении.

Примеры скрипта

1. Скрипт проверяет, что запрос находится в статусе, отличном от заданного, и не находится в персональной ответственности:

//ПАРАМЕТРЫ-----------------------------------------------
// Код статуса
def STATE  = 'registered'   
//ОСНОВНОЙ БЛОК-------------------------------------------
if (subject.responsibleEmployee != null || subject.state == STATE)
{
return "Заданные условия не выполнились."
}

2. Скрипт проверяет, был ли добавлен комментарий в рамках смены статуса:

//ПАРАМЕТРЫ-----------------------------------------------
// логическая переменная,
//если значение true, то проверяем добавление в рамках смены статуса,
// если false, то не в рамках смены статуса.
def IN_CHANGE_STATE = true
//ОСНОВНОЙ БЛОК--------------------------------------------
if(IN_CHANGE_STATE == (comment != null))
{
return ""
}
return "условие не выполнилось"

3. Скрипт проверяет, что объект находится или не находится в одном из перечисленных статусов:

//ПАРАМЕТРЫ------------------------------------------------------------
// Коды статусов
def STATES = [ 'resolved', 'state2'] 
// логическая переменная: содержит или не содержит
def CONTAINS = true 
//ОСНОВНОЙ БЛОК--------------------------------------------------------
return STATES.contains(subject.state) == CONTAINS ? "" : "Статус не соответствует."

4. Скрипт проверяет, изменились ли определенные атрибуты при редактировании:

// service - код атрибута "Услуга", 
//respRule - код атрибута "Правило"
if (changedAttributes.contains('service') || changedAttributes.contains('respRule'))
{
return ''
}
else {
return 'Условие не выполнено. Услуга и правило не изменялись'
}