Сервис «Управление бизнес-правилами»

Содержание

Сервис «Управление бизнес-правилами»#

1. Введение#

1.1. Назначение интерфейса#

Интерфейс «Управление бизнес-правилами» предназначен для:

  • централизованного хранения бизнес-логики;

  • настройки правил без изменения кода приложения;

  • выполнения правил в едином контексте (пространстве правил);

  • отладки и тестирования логики через встроенные инструменты.

Примечание

По функциональности система соответствует подходу BRF+ (Business Rule Framework plus) в SAP:

  • правила выносятся из кода в базу данных;

  • поддерживаются различные типы условий (фильтры, JEXL-скрипты);

  • доступно версионирование, логирование и разграничение доступа.

1.2. Где находится интерфейс#

Путь в приложении:
Приложение "Настройка системы" > основное меню, раздел "Настройки и сервисы" > "Сервисы JEXL" > "Управление бизнес-правилами"

2. Основные понятия#

2.1. Пространство правил (Rule Space)#

Пространство правил — это контейнер, объединяющий:

  • параметры;

  • источники данных;

  • функции;

  • наборы правил.

Пространство имеет уникальный код, по которому оно вызывается извне.

2.2. Bts-процедура#

Bts-процедура — это именованный блок JEXL-кода, который:

  • хранится отдельно от пространства;

  • может быть переиспользован в разных пространствах;

  • автоматически создаётся при первом добавлении JEXL-функции или правила;

  • редактируется как в справочнике процедур, так и непосредственно в интерфейсе пространства.

2.3. Контекст выполнения (rop)#

rop — это объект контекста, который передаётся в пространство при вызове.
Через rop доступны:

  • параметры вызова (например, gid объекта);

  • ранее вычисленные значения;

  • вспомогательные сервисы (логирование, доступ к БД).

2.4. Жизненный цикл выполнения пространства#

  1. Вызов Bts_RuleSpacePkg.execute(код, параметры).

  2. Загрузка конфигурации пространства.

  3. Выполнение запроса инициации (если есть) → формирование строк-итераций.

  4. Для каждой строки:

    • выполняются все наборы правил (если активны и попадают в даты);

    • внутри набора — последовательное выполнение правил до первого false (если не настроено иное).

  5. Возврат результата (лог, изменённые параметры).

3. Структура интерфейса#

3.1. Панель навигации (слева)#

  • Дерево всех пространств правил, доступных пользователю.

  • Внутри каждого пространства — разделы:

    • Параметры

    • Источники данных

    • Функции

    • Наборы правил (с индикацией активности)

  • Для наборов и правил отображается иконка состояния (действует / не действует).

3.2. Рабочая область (справа)#

  • Отображает выбранный в навигации элемент.

  • Позволяет:

    • создавать/редактировать параметры;

    • настраивать источники данных;

    • писать JEXL-код;

    • конфигурировать условия универсального фильтра;

    • управлять доступом и логированием.

3.3. Операция «Тестирование документа»#

  • Расположена на панели инструментов пространства.

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

  • Результат выполнения отображается в виде лога и итоговых значений параметров.

4. Настройка пространства правил#

4.1. Управление доступом#

  • Настройка ведётся в разрезе пользователей.

  • Для каждого пользователя или группы задаётся признак «Редактирование»:

    • если признак установлен — пользователь может изменять пространство;

    • если снят — доступ только на чтение и выполнение.

4.2. Уровень логирования#

Определяет, какая информация будет записываться в лог выполнения пространства:

  • Блокировка — логируются только критические ошибки, останавливающие выполнение.

  • Информация — записываются все шаги выполнения (рекомендуется для отладки).

  • Критическая ошибка — только ошибки, влияющие на корректность результата.

  • Дополнительные уровни могут быть добавлены в зависимости от конфигурации системы.

Важно: Уровень логирования влияет на производительность — для продуктивной среды рекомендуется использовать «Блокировка» или «Критическая ошибка».

4.3. Параметры пространства#

  • Переменные, доступные всем функциям и правилам пространства.

  • Для каждого параметра задаётся:

    • Тип данных (число, строка, дата, логический и др.);

    • Значение по умолчанию;

    • Источник заполнения (можно указать, из какого источника данных подставлять значение).

  • Признак «Доступен для фильтра»:

    • если установлен — параметр появляется в списке доступных полей при настройке Условия универсального фильтра как для функций, так и для правил наборов.

5. Источники данных#

5.1. Назначение#

Источники данных — это SQL-запросы, которые:

  • выполняются до основной логики пространства;

  • могут предоставлять данные для параметров;

  • могут использоваться по имени внутри JEXL-процедур.

5.2. Запрос инициации выполнения правил#

  • Признак: отмечается один из источников как «Запрос инициации».

  • Особенности:

    • может быть только один на пространство;

    • количество строк, возвращённых запросом, определяет число итераций выполнения пространства;

    • каждая строка становится отдельным контекстом выполнения (параметры наполняются значениями из полей запроса).

5.3. Дополнительные источники данных#

  • Не имеют признака инициации.

  • К ним можно обратиться по имени из любого JEXL-кода внутри пространства (например, dataSource.get("mySource")).

5.4. Необязательность источников#

Если запрос инициации отсутствует, пространство выполняется один раз при условии, что все необходимые параметры переданы через rop в методе execute().

6. Функции пространства#

6.1. Назначение#

Функции — это переиспользуемые блоки логики, которые можно вызывать:

  • из правил внутри наборов (тип правила «Функция»);

  • из других функций (при необходимости).

6.2. Типы функций#

6.2.1. JEXL-код#

  • Представляет собой ссылку на Bts-процедуру.

  • При создании новой функции:

    • автоматически создаётся связанная Bts-процедура;

    • в рабочей области доступен редактор JEXL для написания кода.

  • При редактировании существующей функции:

    • код процедуры обновляется в новой версии (сохраняется история).

  • Также возможно вручную выбрать Bts-процедуру из справочника.

6.2.2. Условие универсального фильтра#

  • Настраивается графически на закладке «Условие».

  • Доступные поля для условий:

    • колонки из источников данных пространства;

    • параметры пространства с признаком «Доступен для фильтра».

  • Пользователь выбирает:

    • поле;

    • оператор сравнения (=, <, >, LIKE, IN, и др.);

    • значение (константа или параметр).

  • Система автоматически генерирует JEXL-код, который можно посмотреть на закладке «JEXL» (только для чтения).

7. Наборы правил#

7.1. Определение#

Набор правил — это логическая группа правил, выполняемая последовательно в рамках пространства.

7.2. Собственные параметры набора#

  • В наборе можно создавать локальные параметры.

  • Глобальные параметры пространства также отображаются (с пометкой о принадлежности).

  • Локальные параметры видны только внутри данного набора.

7.3. Ограничения действия#

Для каждого набора можно задать:

  • Временной диапазон (дата начала и дата окончания действия);

  • Признак «Действует» — если снят, набор не выполняется (в навигации отображается специальный индикатор).

7.4. Порядок выполнения правил#

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

  • По умолчанию выполнение набора останавливается, если какое-либо правило вернуло false.

7.5. Типы правил в наборе#

7.5.1. Условие универсального фильтра#

  • Полностью аналогично функции того же типа (п. 6.2.2), но действует только в рамках данного набора.

  • Настройка условий — через тот же графический конструктор.

7.5.2. JEXL-код#

  • Полностью аналогично функции JEXL, но локально для набора.

  • Также привязывается к Bts-процедуре (автоматически или вручную).

7.5.3. Функция#

  • Вызов глобальной функции пространства (см. раздел 6).

  • Позволяет переиспользовать общую логику в нескольких наборах без дублирования кода.

7.6. Дополнительные атрибуты правил#

  • Описание — текстовое пояснение (рекомендуется для документирования).

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

  • Условие выполнения правила — отдельное условие (также через Bts-процедуру), которое определяет, будет ли правило выполняться в текущем контексте (см. раздел 8.2).

8. Управление выполнением и ветвлением логики#

8.1. Базовое правило остановки набора#

  • Если правило типа «Условие» или «JEXL» возвращает false, выполнение набора прерывается.

  • Последующие правила в этом наборе не выполняются.

  • Пространство переходит к следующему набору (если он активен).

8.2. Условие входа в правило (ветвление)#

  • Для каждого правила можно настроить «Условие входа» — это Bts-процедура, которая возвращает true или false.

  • Если условие возвращает false, правило пропускается (не выполняется).

  • Это позволяет реализовать конструкции «Если … То …»:

    • в первом правиле проверяется условие;

    • во втором — действие, но оно выполняется только если первое правило изменило параметр-флаг.

  • Важно: условие входа вычисляется до выполнения самого правила.

8.3. Пример остановки всего пространства#

  • Создаётся параметр пространства, например, found.

  • В первом правиле каждого набора проверяется found == true — если да, правило пропускается (через условие входа).

  • В функции записи результата, после нахождения нужного значения, параметр found устанавливается в true.

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

9. Вызов пространства правил извне#

9.1. Пакет Bts_RuleSpacePkg и метод execute()#

Для вызова пространства из любого места системы (включая точки расширения, JEXL-операции) используется:

Bts_RuleSpacePkg.execute(<код пространства>, <параметры>)

9.2. Параметры вызова#

  • <код пространства> — строковый идентификатор.

  • <параметры> — объект, содержащий:

    • контекст выполнения (rop);

    • значения для параметров пространства;

    • дополнительные переменные.

9.3. Пример использования в точке расширения#

В точке расширения Stm_ActInApi.setidStateMC() вызов может выглядеть так:

Bts_RuleSpacePkg.execute("PRICE_CALC", rop)

Где rop уже содержит gid документа, на основе которого будут выполнены правила расчёта цены.

9.4. Вызов через интерфейс (Тестирование документа)#

  • В интерфейсе пространства нажать кнопку «Тестирование документа».

  • Откроется диалог ввода параметров (можно подставить тестовые значения).

  • После выполнения система покажет:

    • лог выполнения (с учётом установленного уровня логирования);

    • итоговые значения всех параметров пространства.

10. Приложения#

10.1. Глоссарий терминов#

Термин

Определение

Пространство правил

Контейнер для параметров, источников, функций и наборов правил.

Bts-процедура

Именованный блок JEXL-кода, хранящийся в системе для переиспользования.

JEXL

Java Expression Language — язык для написания выражений и скриптов.

rop

Объект контекста выполнения, передаваемый в пространство.

Запрос инициации

SQL-запрос, определяющий количество итераций выполнения пространства.

Условие универсального фильтра

Графически настраиваемое условие, конвертируемое в JEXL.

Набор правил

Группа последовательно выполняемых правил с собственными параметрами.

Условие входа

Bts-процедура, определяющая, будет ли правило выполнено в текущем контексте.

10.2. Типовые сценарии использования#

Сценарий

Реализация

Расчёт цены по сложной формуле

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

Валидация документа перед сохранением

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

Динамическое назначение статуса

В зависимости от значений полей (сумма, дата, контрагент) набор правил устанавливает параметр status в нужное значение.

Маршрутизация заявки

Использовать условие входа для пропуска наборов, если заявка уже направлена в определённый отдел.

10.3. Рекомендации по производительности и отладке#

  • Источники данных:

    • Оптимизируйте SQL-запросы (индексы, фильтрация) источника данных — они выполняются до всех правил;

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

    • Источник данных не является обязательным элементом пространства. Можно получить необходимые значения напрямую от объекта (через rop).

  • JEXL-код:

    • Избегайте рекурсии;

    • Используйте функции;

    • Используйте конструкции try-catch;

    • Bts-процедуры - версионный объект, при внесении изменений создавайте новую версию процедуры.

  • Отладка:

    • Используйте «Тестирование документа» с уровнем логирования «Информация» для пошагового анализа выполнения;