Перейти к основному содержимому
Версия: 1.20.1

Бизнес-правила

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

примечание

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


подсказка

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

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

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

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

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

Запуск серверной бизнес-логики может не выполняться для системных таблиц, если создание или обновление записей инициируется стороной 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);