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