На схеме процесса после проверки условий два маршрута могут запускаться одновременно. Какую семантику развилки следует выбрать и почему?
Следует выбрать включающую развилку (OR, inclusive gateway), если каждый маршрут запускается по собственному условию и могут быть активированы оба. Исключающая развилка (XOR) подходит только тогда, когда должен выполняться ровно один маршрут, а параллельная (AND) — когда должны запускаться все маршруты независимо от условий.
Нотации моделирования процессов появились, чтобы единообразно описывать не только последовательность действий, но и логику ветвления. На практике ошибки в выборе типа развилки приводили к тому, что модель процесса не отражала реальные правила принятия решений.
Семантика развилки отделяет три разных случая: выбор одного пути, выбор одного или нескольких путей по условиям и безусловный запуск всех путей. Это важно для анализа длительности, ресурсов, стоимости и обязательности работ.
Предположим, после проверки заявки нужно выполнить дополнительную проверку риска для крупных заказов и проверку документов для международных заказов. Для крупной международной заявки должны запуститься обе проверки.
Если показать такую логику как XOR, модель заставит выбрать только один маршрут и скроет часть обязательных работ. Если использовать AND, обе проверки будут запускаться даже для заявок, которым они не нужны. В обоих случаях исказятся трудозатраты, сроки и требования к исполнителям.
Для каждого исходящего маршрута нужно сформулировать отдельное условие. Если истинно одно условие, запускается один путь; если истинны несколько условий, запускаются все соответствующие пути. Именно такую семантику передаёт inclusive gateway.
После выполнения выбранных ветвей обычно требуется синхронизация. Она должна дождаться только тех ветвей, которые действительно были запущены, а не ожидать все потенциальные маршруты. Иначе процесс может зависнуть, ожидая выполнение ветви, которая не была активирована.
Выбор типа развилки можно проверить вопросом: «Могут ли одновременно выполняться несколько исходов?» Если нет — используется XOR. Если да, но каждый исход зависит от отдельного условия — OR. Если должны выполняться все исходы безусловно — AND.
Важно не выбирать тип развилки только по внешнему виду схемы. Нужно проверить бизнес-правила, взаимоисключаемость условий и поведение после слияния ветвей. При этом включающая развилка сложнее для анализа: число возможных комбинаций маршрутов растёт, поэтому условия и точки синхронизации должны быть явно документированы.
В процессе обработки заказа существовали два правила: для дорогих заказов требовалась ручная проверка лимита, а для заказов с международной доставкой — проверка экспортных документов. Один заказ мог одновременно удовлетворять обоим условиям.
Рассматривались три варианта. XOR упрощал схему, но ошибочно исключал одну из проверок. AND делал модель предсказуемой, но назначал обе проверки каждому заказу, увеличивая ненужные задержки. OR точно отражал правила: запускалась одна или обе проверки в зависимости от характеристик заказа.
Выбрали включающую развилку и явно описали условия каждой ветви. После этого расчёт загрузки сотрудников учитывал реальные комбинации проверок, а приёмочные сценарии стали проверять не только отдельные маршруты, но и их совместный запуск.
Параллельная развилка означает безусловный запуск всех исходящих ветвей. Включающая запускает только те ветви, чьи условия истинны, поэтому при определённых данных может выполниться одна ветвь, несколько ветвей или, если это допускает модель, ни одна.
Даже корректный тип развилки не спасает модель от пересекающихся или неполных условий. Нужно проверить, какие комбинации входных данных возможны, покрывают ли условия все допустимые случаи и не создают ли они нежелательный маршрут. Иначе ошибка будет находиться не в нотации, а в формализации бизнес-правил.
Слияние должно учитывать фактически запущенные ветви. Оно не должно безусловно ждать маршруты, которые условия развилки не активировали, иначе процесс может заблокироваться. При этом следует проверить, действительно ли дальнейший шаг допустим после любой комбинации завершившихся ветвей или ему нужны дополнительные условия.