Перейти к содержимому

Документация Corta

Область видимости бизнес‑процесса: подробно

Область видимости (scope) определяет, к каким данным текущий шаг процесса Corta может получить доступ и какие данные он может изменять.

В большинстве стандартных сценариев это не принципиально, но при проектировании больших и сложных бизнес‑процессов понимание механизма области видимости становится особенно важным.

Составные типы данных передаются между шагами процесса по указателю. Это означает, что любое изменение такого объекта в одной области видимости автоматически отразится на всех остальных областях, где этот объект присутствует.

Пример:
Один и тот же пользователь есть в двух разных областях видимости. Если в одной из них изменить имя пользователя, эти изменения будут видны и в другой области.

Схематично: оба шага работают с одним и тем же пользователем:

Шлюзы

Когда выполнение бизнес‑процесса доходит до шага шлюза (gateway), для каждой ветки (соединителя) создаётся новая область видимости на основе родительской (обычно — глобальной).

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

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

Главные действия на приведённой схеме:

  • Установка переменной global_v1 = 1 в глобальной области.
  • В первой ветке (branch 1) создаётся переменная local_v1 = 1.
  • Во второй ветке (branch 2) создаётся переменная local_v2 = 1.
  • Логируются переменные текущей области.

Ниже показана трассировка стека выполнения с аннотированными областями (тёмные блоки с номерами):

В данном примере используется "разветвляющий" шлюз.

  1. При старте процесса глобальная область содержит переменную global_v1 = 1.
  2. При входе в шлюз для каждой ветки создаётся новая область: "branch 1 scope" и "branch 2 scope".
  3. При выполнении первой ветки создаётся/меняется только локальная переменная области этой ветки (local_v1 = 1), глобальная область не изменяется.
  4. Аналогично, во второй ветке (local_v2 = 1), глобальная область не затрагивается.
  5. После завершения обеих ветвей, на этапе объединения ("join"), области всех ветвей сливаются обратно в глобальную область в исходном порядке. Если первой объединяется ветка 1, её данные берут приоритет.

Итераторы

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

По окончании работы итератора (когда перебрали все элементы или цикл был прерван), область итератора сливается обратно в область-родитель (все изменения и новые переменные переносятся в родительский scope).

Основные шаги примера:

  • Инициализация переменной global_v1 = 1 в глобальной области.
  • Итератор 1 выполняется 1 раз.
    • Внутри него: увеличивается global_v1 на 1, создаётся local_v1 = 1.
  • Итератор 2 выполняется 1 раз.
    • Внутри него: снова увеличивается global_v1 на 1, создаётся local_v2 = 1.
  • Логируется состояние переменных.

Трассировка выполнения с отмеченными областями — на изображении ниже:

Подробно по шагам:

  1. При старте процесса в глобальном scope: global_v1 = 1.
  2. При входе в первый итератор формируется новая область на основе глобальной.
  3. При увеличении global_v1 и добавлении local_v1, меняется только область текущего итератора (глобальный scope вне итератора остаётся без изменений).
  4. При входе во второй итератор формируется вторичная область на основе предыдущей области итератора 1.
  5. Аналогично: увеличение global_v1 и создание local_v2 меняют только scope текущего итератора (предыдущий итератор не затрагивается).
  6. После завершения второго итератора области сливаются: области второго и первого итератора объединяются, состояние итератора 1 обновляется.
  7. После завершения первого итератора его область объединяется с глобальной. Глобальный scope обновлён с учётом всех изменений.