При проектировании бизнес-процессов в платформе 1С:Предприятие разработчики часто сталкиваются с задачей разделения обработки на несколько независимых потоков. Типичный сценарий: по одному общему документу или событию необходимо запустить однотипные цепочки задач для нескольких предметов (например, для каждого контракта или позиции из списка) так, чтобы каждый поток продвигался по маршруту самостоятельно, не блокируя остальные.
Разберем, почему стандартные точки действия не подходят для этой цели и как правильно реализовать динамическое параллельное выполнение с помощью точки вложенного бизнес-процесса.
Проанализируем поведение базовых элементов схемы бизнес-процесса:
ТочкаРазделения и ТочкаСлияния требуют жестко заданного на этапе конфигурирования количества параллельных веток. Если количество предметов или параллельных потоков определяется динамически во время выполнения, стандартные ветки использовать нельзя.Для создания динамического количества независимых параллельных потоков используется специальный элемент карты маршрута — Точка вложенного бизнес-процесса. При прохождении этой точки платформа позволяет запустить произвольное количество отдельных бизнес-процессов (по одному на каждый предмет).
Каждый вложенный процесс обладает собственной картой маршрута и продвигается по цепочке задач автономно. При этом родительский процесс будет ожидать завершения всех сформированных вложенных процессов, после чего продолжит движение по основному маршруту.
Посмотрим на пример реализации. Для точки вложенного бизнес-процесса необходимо назначить обработчик события ПередСозданиемВложенныхБизнесПроцессов. В теле процедуры мы получаем список предметов и формируем необходимые экземпляры бизнес-процессов.
Процедура КонтрольКонтрактаПередСозданиемВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ)
// Получаем перечень предметов, по которым нужно запустить параллельные процессы
СписокКонтрактовТЗ = ПолучитьСписокКонтрактов(Предмет);
Для Каждого СтрокаКонтракт Из СписокКонтрактовТЗ Цикл
// Создаем экземпляр вложенного бизнес-процесса
ВложенныйБП = БизнесПроцессы.Т_КонтрольКонтракта.СоздатьБизнесПроцесс();
ВложенныйБП.Дата = ТекущаяДата();
ВложенныйБП.Предмет = СтрокаКонтракт.Ссылка;
ВложенныйБП.Исполнитель = Исполнитель;
ВложенныйБП.Автор = Пользователи.ТекущийПользователь();
ВложенныйБП.Записать();
// Обязательно добавляем созданный процесс в формируемую коллекцию
ФормируемыеБизнесПроцессы.Добавить(ВложенныйБП.Ссылка);
КонецЦикла;
КонецПроцедуры
Разберем технические особенности работы этого механизма:
ФормируемыеБизнесПроцессы: Созданные объекты обязательно должны быть записаны и добавлены в массив, переданный в параметре ФормируемыеБизнесПроцессы. Только в этом случае платформа зарегистрирует их как дочерние по отношению к текущей точке.ВедущаяЗадача. Создавать ведущие задачи вручную в коде не требуется.В зависимости от требований системы можно рассмотреть и другие варианты организации логики:
ВедущаяЗадача, а контроль выполнения вести через регистры сведений или реквизиты объектов-оснований.ТочкаУсловия (проверка, остались ли необработанные строки) → переход к следующему предмету либо выход из цикла.