Бизнес-правило – это действие, которое запускается на серверной стороне при создании, обновлении или удалении записи. Бизнес-правила выполняются в рамках транзакции с базой данных (БД), вне зависимости от интерфейса, через который была инициирована транзакция (отправка формы пользователем, выполнение серверного скрипта, REST запрос, выполнение блока Workflow Activity). Действие правила может выполнятся как в отношении текущей записи, так и в отношении других записей.

Бизнес-правила могут использовать скрипты для выполнения действий с записями в базе данных. Также доступны возможности действий скриптов в клиентских скриптах и UI-действиях.

Бизнес правила используются для:

  • изменения значений в полях записи, которая соответствовала определенным условиям для срабатывания правила.
  • выполнения серверного скрипта правила.
  • выведения сообщений на сторону клиента.
  • создания системных событий для отправки уведомлений по электронной почте или выполнения других серверных скриптов;
  • прерывания выполнения транзакции с БД.

Для просмотра всех бизнес-правил, в навигаторе перейдите в Настройка системы → Бизнес-правила.

Для просмотра бизнес-правил, относящихся к конкретной таблице, выполните следующие действия:

  1. Перейдите к списку или форме таблицы. 
  2. Выберите НастроитьБизнес-правила в бургер-меню.

Типы бизнес-правил


В зависимости от выполняемой бизнес-задачи, вы можете использовать один из следующих типов бизнес-правил:

  • перед
  • после
  • после (асинхронно)

Условия запуска правил типа перед:

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

Условие запуска правил типа после:

  • После выполнения системой обновления на сервере.

Условие запуска правил типа после (асинхронно):

  • После всех бизнес-правил других типов.

Бизнес-правила типа после (асинхронно) срабатывают после бизнес-правил типов перед и после. Благодаря этому, пользователь сначала получает форму со всеми изменениями, а затем срабатывают правила типа после (асинхронно). Таким образом вы можете оптимизировать время отклика системы – используйте правила типа после (асинхронно) для ресурсоемких скриптов, выполнение которых занимает много времени.

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

Процесс начинается с действия на форме: если это действие обновления, источником данных является база данных, поэтому у записи есть блок previous. Блок previous представляет состояние формы до совершения действия (отправка формы – создание, обновление или удаление), а блок current представляет состояние формы после завершения действия. Отправка формы может выполняться пользователем, скриптом или запросом REST API.

Создание бизнес-правила


Требуемая роль: admin.

Чтобы создать новое бизнес-правило, выполните следующие действия:

  1. Перейдите в Настройка системы → Бизнес-правила.
  2. Нажмите Создать и заполните поля.
  3. Нажмите Сохранить или Сохранить и выйти, чтобы применить изменения.

Поля формы Бизнес-правило

ПолеОбязательноОписание
НаименованиеДаВведите наименование бизнес-правила.
ТаблицаДаВыберите таблицу, в которой будет выполняться бизнес-правило.
ОписаниеНетВведите краткое описание действия.
АктивноНетУстановите флажок, чтобы активировать бизнес-правило.
НаследуемоеНетУстановите флажок, чтобы применять данное бизнес-правило ко всем дочерним таблицам указанной Таблицы.
Расширенная настройкаНетУстановите флажок для отображения поля Скрипт и расширенных настроек, таких как тип бизнес-правила (поле Когда во вкладке Когда запустить).
Вкладка Когда запустить
КогдаНет

Выберите момент выполнения бизнес-правила:

  • перед – выполняется перед действием, инициирующим запуск бизнес-правила (до создания,  обновления или удаления записи);
  • после – выполняется после действия, инициирующего запуск бизнес-правила (после создания, обновления или удаления записи);
  • после (асинхронно) – выполняется после завершения всех предшествующих бизнес-правил: система возвращает форму со всеми изменениями и запускает бизнес-правила типа после (асинхронно) в фоновом режиме.
ПорядокНет

Укажите порядок выполнения бизнес-правила. При наличии нескольких бизнес-правил одного типа (перед, после, после (асинхронно)), они выполняются в порядке возрастания.

Поле доступно, когда установлен флажок Расширенная настройка и установлено значение перед или после в поле Когда.

ПриоритетНет

Укажите приоритет бизнес-правила. При наличии нескольких бизнес-правил с одинаковым Порядком, они выполняются в порядке убывания Приоритета

Поле доступно, когда установлен флажок Расширенная настройка и установлено значение перед или после в поле Когда.

СозданиеНет Установите флажок, чтобы бизнес-правило срабатывало при добавлении новой записи.
ОбновлениеНетУстановите флажок, чтобы бизнес-правило срабатывало при обновлении записи.
УдалениеНет

Установите флажок, чтобы бизнес-правило срабатывало при удалении записи.

Поле доступно, когда установлен флажок Расширенная настройка.

Условия фильтраНет

Задайте условия для срабатывания бизнес-правила. После указания Таблицы, все ее поля доступны для построения условий.

Используйте динамические условия фильтра, такие как равно (динамическое) или не равно (динамически) при составлении условий, чтобы ваши бизнес-правила были более гибкими.

Вкладка Действие

Вкладка Действие недоступна для бизнес-правил типа после (асинхронно).

Установить значениеНет

Выберите колонку и определите нужное вам значение. Доступные колонки зависят от выбранной Таблицы.

  • Значения из поля Установить значение применяются в момент запуска правила. Состояние объекта current в скрипте равно состоянию после применения шаблона Установить значение.
  • Шаблон Установить значение применяется автоматически в бизнес-правилах типа перед. Чтобы использовать шаблон в бизнес-правилах типа после, добавьте в скрипт вызов update() для объекта current:

    (function executeRule(current, previous /*null when async*/) {
        current.update();
    })(current, previous);

    Во избежание рекурсии, объект current.update() следует использовать только в бизнес-правилах типа после. Подробнее см. ниже.

Прервать действие 

Нет

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

Хорошей практикой считается указывать причину отмены действия. Установите флажок Добавить сообщение и введите текст в поле Сообщение.

Если сообщение не указано, при отмене действия отображается стандартное сообщение:

Если условия отмены не удается создать при помощи поля Условия фильтра, вы можете использовать скрипт с применением методов setAbortAction и ss.addErrorMessage. В этом случае флажок Прервать действие должен быть снят.

Помните, что при использовании метода setAbortAction() для отмены транзакции, скрипт, следующий за вызовом этой функции, не будет исполнен.

Добавить сообщениеНетУстановите флажок, чтобы отобразить поле Сообщение, если вам нужно показать пользователю сообщение при выполнении бизнес-правила.
СообщениеНет

Введите текст сообщения, которое вы хотите показать пользователю при выполнении бизнес-правила. Оно будет выведено на экран как всплывающее сообщение.

Вы также можете использовать значение записи Исходное сообщение (source_message) из категории app (значение в колонке Категория). Подробнее читайте в статье Локализация и многоязыковая поддержка.

Не используйте переменные или динамические ссылки на другие записи в этих сообщениях. Чтобы добавить сообщение с переменными или динамическими ссылками, установите флажок Расширенная настройка и настройте скрипт в появившейся одноименной вкладке. 

Поле Сообщение доступно, когда установлен флажок Добавить сообщение.

Вкладка Расширенная настройка
СкриптНет

Введите скрипт, определяющий действия, которые будут выполнены при запуске бизнес-правила. Доступны переменные previous и current:

  • previous – состояние объекта записи перед созданием, обновлением или удалением. Объект previous доступен только для действия обновления.
  • current – состояние записи, которая будет создана, обновлена или удалена. Объект current доступен даже после удаления записи.
При создании записи
  • previous является пустой.
  • current равна объекту SimpleRecord, который будет создан.
При обновлении записи
  • previous равна объекту SimpleRecord, каким он был до начала транзакции.
  • current равна объекту SimpleRecord на момент начала выполнения правила.
При удалении записи
  • previous является пустой.
  • current равна объекту SimpleRecord на момент начала выполнения правила.

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

В момент срабатывания бизнес-правила типа после (асинхронно), действие правила отправляется в очередь. Поэтому возможна незначительная задержка между срабатыванием бизнес-правила и выполнением действия. Объекты current и previous в бизнес-правилах типа после (асинхронно) содержат состояние объекта на момент выполнения действия бизнес-правила.

  • Избегайте использования функции current.update() в скриптах бизнес-правил типов перед или после (асинхронно), поскольку это может привести к рекурсии. Если использования current.update() не избежать, добавьте к правилу условие запуска, которое перестает выполняться после первого запуска правила. В противном случае рекурсия неизбежна.
  • Избегайте использования метода setAbortAction в бизнес-правилах типа после (асинхронно).
  • Если скрипт бизнес-правила создает или обновляет записи в других таблицах, используйте тип запуска после. В противном случае, если бизнес-правило выполняется с ошибкой в процессе исполнения транзакции, правило типа перед создает/обновляет запись в другой таблице, что приводит к неконсистентности данных.

Поле доступно, когда установлен флажок Расширенная настройка.

Запуск серверной бизнес-логики может не выполняться для системных таблиц, если создание или обновление записей инициируется стороной backend. Например, создание Элементов набора в рамках загрузки Источника импорта или создание Электронной почты в результате срабатывания правила уведомления, и другое.

Пример таблиц, для которых может не срабатывать серверная бизнес-логика:

  • Основной журнал (sys_log)
  • Журнал работы скриптов (sys_log_script)
  • Журнал исключений (sys_log_exception)
  • Журнал удаления записей (sys_record_deletion_log)
  • Наборы для импорта (sys_import_set)
  • Объекты ленты активности (sys_activity_feed_item)
  • Электронная почта (sys_email)

Прерывающие бизнес-правила


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

Чтобы бизнес-правило прерывало последующие процессы, выполните следующие действия:

  1. Откройте нужное бизнес-правило.
  2. Во вкладке Когда запустить определите условия отмены.
  3. Во вкладке Действие установите флажок Прервать действие .
  4. Во вкладке Когда запустить убедитесь, что в поле Когда установлено значение перед.

  5. Нажмите Сохранить или Сохранить и выйти, чтобы применить изменения.

Переназначение коробочных правил 


При необходимости, часть коробочных бизнес-правил может быть переопределена.

  • Для приложений, кроме Simple, достаточно скопировать коробочное правило при помощи действия Создать копию и деактивировать его. После этого вы сможете задать необходимую логику в копии правила.
  • В случае приложения Simple большинство правил поставляется с Политика защиты = Защищена, поэтому просто деактивировать их не удастся. Тем не менее правила с типом Когда = перед могут быть переопределены правилами с аналогичными условиями запуска с большим порядком. Например, коробочное правило типа перед формирует значение в поле Тема [subject]. Порядок правила – 999. Для изменения логики формирования значения достаточно создать копию правила при помощи действия Создать копию, задать необходимую логику и указать Порядок  = 1000. Если значение в поле не должно меняться, используйте правило на событие Обновление со следующим скриптом:
Пример
(function executeRule(current, previous = null /*not null only when action is update*/) {
  if (previous) {
    current.subject = previous.subject;
  }
})(current, previous);

  • No labels