Скрипт вычисления значения атрибута с признаком "Вычислимый"

Категория скрипта "Вычислимые атрибуты".

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

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

В скрипте для вычисления значения атрибута не допустимо обращаться к внешнему источнику.

Для взаимодействия с внешними системами необходимо использовать действие по событию типа "Скрипт" с признаком "Взаимодействие с внешней системой" (см. Скриптовое действие по событию) или/и задачу планировщика (см. Планировщик задач).

Использование вычислимых атрибутов может привести к снижению производительности приложения.
Пример 1: задана сложная логикой расчета значения атрибута.
Пример 2: вычислимые атрибуты выведены в списки объектов, и расчет их значений выполняется по всем объектам списка.

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

Форма добавления пользовательского атрибута, см. Настройка атрибутов класса и типа объектов.

Скрипт настраивается при добавлении пользовательского атрибута с признаком "Вычислимый"=да, см. Типы атрибутов и их параметры.

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

При вычислении значения атрибута: при отрисовке контента, содержащего данный атрибут, например "Параметры объекта" или "Список объектов".

Если включены параметры оптимизации получения данных, то скрипт выполняется только для видимых на форме атрибутов, см. dbaccess.properties.

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

Скрипт возвращает значение атрибута, которое зависит от типа атрибута.

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

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

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

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

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

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

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

  • ip — ip-адрес рабочего места пользователя user. Переменная не определяется, если действие выполняется автоматически системой (а не пользователем);
  • appVersion — версия приложения;
  • api — используется для обращения к методам api, например api.utils, api.ldap, api.timing, см. Методы API;
  • modules — используется для обращения к скриптовому модулю и конкретному методу, определенному в нем, с помощью конструкции: modules.{код модуля}.{имя метода}({параметры метода}...), см. Скрипт текста модуля;
  • logger — используется для отладки скриптов и позволяет вывести в лог на указанный уровень переданную строку, см. Отладочные сообщения.
  • utils — синоним api.utils.

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

  • subject — текущий объект над которым производится действие (владелец атрибута).

    Если атрибут добавлен в класс "Отдел" (ou), то subject — это объект класса "Отдел" (ou), для которого будет вычисляться данный атрибут.

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

    Переменная не поддерживается в мобильном приложении.

    Для быстрой формы добавления/редактирования, открытой с формы добавления/редактирования, которая в свою очередь открыта с карточки объекта, значение переменной cardObject будет содержать этот объект.

  • origin — тип месторасположения.

    Переменная не поддерживается в мобильном приложении.

    Возможные значения:

    • readForm — скрипт вычисляется на карточке объекта, на сложной форме добавления и редактирования связей (расширенная форма редактирования), в списке по ссылке на отдельной странице, в списке на странице результатов поиска, при нажатии на кнопку вызова действий в строке списка;
    • addForm — скрипт вычисляется на форме добавления, на быстрой форме добавления;
    • editForm — скрипт вычисляется на форме редактирования объекта, на форме редактирования атрибутов, вызванной из контента "Параметры объекта", на форме редактирования в ячейке списка, на форме быстрого редактирования, на форме массового редактирования, на форме смены типа; на форме смены ответственного, на форме смены привязки (переклассификации), на форме работы с массовостью (управление массовостью запроса), на форме смены статуса, на форме перемещения (смены родителя);
    • addFormComment/editFormComment — скрипт вычисляется на форме добавления/редактирования комментария;
    • addFormFile/editFormFile — скрипт вычисляется на форме добавления/редактирования файла.

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

В скрипте не должны использоваться методы, направленные на модификацию данных (создание, копирование, удаление и прочие).

В скрипте не рекомендуется использовать "тяжелые" операции, который получают множество объектов из базы данных, например, utils.find по слабому критерию.

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

1. Скрипт для вычислимого атрибута типа "Целое число". Скрипт выводит количество файлов, прикрепленных к объекту.

return utils.count('file', ['source' : subject.UUID])

2. Скрипт для вычисления суммы значений атрибута типа "Целое число" для объектов, которые указаны в атрибуте "Набор элементов справочника"

//ПАРАМЕТРЫ--------------------------------------
//Код атрибута типа "Набор элементов справочника"
def RER_LINKS_ATTR = 'attrCode'
//Код атрибута типа "Целое число"
def AMOUNT_ATTR = 'amountAttrCode' 
//ОСНОВНОЙ БЛОК----------------------------------      
def allCost = 0;
def containObjects = subject[RER_LINKS_ATR];
for (def item : containObjects) 
{
    allCost += item[AMOUNT_ATTR]?: 0;
}
return allCost