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

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

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

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

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

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

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

  • непосредственно в момент открытия формы добавления (один раз), если атрибут с вычислимым значением по умолчанию выведен на форму добавления объекта;
  • после создания объекта (один раз), если атрибут с вычислимым значением по умолчанию не выведен на форму добавления объекта;
  • при редактировании определяющего атрибута таблицы соответствий, когда для определяемого атрибута не находится соответствий, если атрибут с вычислимым значением по умолчанию определяется по таблице соответствий.

Если скрипт выведен на форму в контент "Параметры объекта", то он срабатывает дважды при открытии формы и при сохранении объекта.

Если включены параметры оптимизации получения данных, то скрипт срабатывает только один раз и только для видимых на форме атрибутов, см. 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 — владелец атрибута, т.е. текущий объект, над которым производится действие. subject.UUID = null.

    НЕ рекомендуется использовать:

    • subject — в качестве результата вычисления значения по умолчанию для ссылочных атрибутов;
    • subject.UUID — для вычисления значения по умолчанию для атрибутов любого типа.
  • attrCode — код атрибута, для которого вычисляется значение по умолчанию.
  • sourceForm — если скрипт выполняется при открытии формы быстрого добавления и редактирования, то переменная содержит значения полей формы, с которой была открыта текущая форма. В остальных случаях переменная имеет значение null.

    Если атрибут, для которого вычисляется значение по умолчанию, не выведен на форму быстрого добавления, то скрипт вычисления значения по умолчанию выполняется после сохранения и закрытия быстрой формы добавления, и, следовательно, sourceForm=null.

    Пример использования: sourceForm.title

    На форме быстрого добавления предпочтительно использовать прямое сравнение вместо использования sourceForm как условия сравнения (в конструкциях проверки true/false, null/ not null).

    Пример 1. Вместо

    return sourceForm ? sourceForm?.printFormRule?.UUID

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

    return sourceForm != null ? sourceForm?.printFormRule?.UUID

    Пример 2. Вместо

    if (sourceForm)

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

    if (sourceForm == true)

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

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

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

    Пример: если с карточки объекта вызвана форма редактирования связанного объекта, то cardObject — это класс объекта, с карточки которого вызвана форма редактирования.

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

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

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

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

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

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

    Пример: для агрегирующего атрибута initiator (с агрегируемыми атрибутами initiator_em и initiator_ou) в скрипте вычислимого значения по умолчанию какого-либо другого атрибута initiator = %значение, выбранное на форме добавления объекта% (т.е. сотрудник или отдел), а initiator_em = null, initiator_ou = null.

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

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

    /**
    * Вариант 1 (проблемный)
    */
    utils.create('ou$OU', ['title':'test1', 'catalogAttr':'CatalogElementCode'])
    /**
    * Вариант 2 (работающий)
    */
    def cat = utils.get('catalogCode', ['code':'catalogElementCode'])
    utils.create('ou$OU', ['title':'test2', 'catalogAttr':cat])

При использовании скрипта:

  • На форме добавления объекта, в момент открытия формы агрегируемые атрибуты переменной subject будут принимать значение null, если они не выведены на форму. Для получения значений агрегируемых атрибутов в следует использовать метод utils.getAggrValueMap().
  • Для корректного получения FQN объекта предпочтительно использоваться метод subject.getMetainfo(), чем использовать subject.metaClass.code.
  • На форме добавления запроса определенного типа, при изменении значения поля "Контрагент" будут пересчитываться значения полей, связанных с атрибутом "Контрагент", только в том случае, если у выбранного контрагента в параметре "Привязка запроса по умолчанию" тип запроса совпадает с типом добавляемого запроса.

Скрипт вычисления значения по умолчанию не рекомендуется использовать для определения значения системных атрибутов запроса "Контактное лицо", "Контактный email", "Контактный телефон" при добавлении запроса. Чтобы указать значения указанных атрибутов при добавлении запроса рекомендуется использовать скрипт на вход в статус "Зарегистрирован" или скрипт действия по событию (Добавление объекта).

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

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

    Copy
    //ПАРАМЕТРЫ------------------------------------------------------------
    def //получаем компанию
    ROOT = utils.get('root', [:]);
    def TIMEZONE = subject?.clientEmployee?.city?.timeZone ?: ROOT.dTimeZone
    //ОСНОВНОЙ БЛОК--------------------------------------------------------
    return TIMEZONE
  2. Скрипт проставляет контрагента связанного запроса в значение по умолчанию

    Copy
    //ПАРАМЕТРЫ------------------------------------------------------------
    //код атрибута, ссылающегося на Запрос
    def SERVICE_CALL = 'serviceCall'
    //код атрибута "Контрагент(сотрудник)" класса "Запрос"
    def CLIENT_EMPLOYEE = 'clientEmployee'
    //ОСНОВНОЙ БЛОК--------------------------------------------------------
    return subject?.SERVICE_CALL?.CLIENT_EMPLOYEE