Как программно создать вложенный бизнес-процесс в 1С:Документооборот?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

При разработке сложных маршрутов в 1С:Документооборот часто возникает задача программного запуска подчиненных процессов внутри Комплексного процесса. Стандартный запуск нового процесса через метод Старт() приводит к тому, что процесс запускается параллельно, а не вложенно. Давайте разберем, как правильно реализовать вложенность, чтобы система корректно отображала дерево процессов и управляла их жизненным циклом. Для комплексного ознакомления с архитектурой и кодом таких маршрутов подойдёт пример программного управления бизнес-процессами в 1С:Документооборот.

Понимание проблемы

Когда мы создаем процесс в 1С:Документооборот, для системы важно понимать, кто является «родителем». Простое заполнение реквизита ВедущаяЗадача не дает нужного результата, так как система ожидает наличия технической записи в регистре задач, которая связывает новый процесс с конкретной ТочкойМаршрута родительского Комплексного процесса.

Пошаговое решение задачи

Для реализации вложенности нам необходимо выполнить следующие шаги:

  1. Получить параметры действий схемы родительского процесса.
  2. Подготовить шаблон действия, который будет использоваться как основа для дочерних процессов.
  3. Для каждого исполнителя программно создать задачу-оболочку типа Задача.ЗадачаИсполнителя.
  4. Привязать эту задачу к ТочкеМаршрута родительского процесса.
  5. Заполнить реквизит ВедущаяЗадача у создаваемого процесса ссылкой на сформированную задачу-оболочку.

Реализация кода

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


Документ = Процесс.Предметы[0].Предмет;
ПараметрыДействийСхемы = Справочники.СхемыКомплексныхПроцессов.ПараметрыДействийСхемы(Процесс.Схема);
ДействиеСхемы = ПараметрыДействийСхемы.Найти("ЗакупкаПоЗаявке"); 
ШаблонДействия = ДействиеСхемы.ШаблонПроцесса.ПолучитьОбъект;

// Инициализируем исполнителей
// Допустим, мы получили список исполнителей в переменную Выборка
Пока Выборка.Следующий Цикл
    ВедущаяЗадачаДействия = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
    ВедущаяЗадачаДействия.Дата = ТекущаяДатаСеанса();
    ВедущаяЗадачаДействия.БизнесПроцесс = Процесс.Ссылка;
    // Указываем точку маршрута родительского процесса
    ВедущаяЗадачаДействия.ТочкаМаршрута = БизнесПроцессы.КомплексныйПроцесс.ТочкиМаршрута.ВложенныйПроцесс;
    ВедущаяЗадачаДействия.Записать();

    НовыйПроцесс = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
    НовыйПроцесс.Заполнить(Новый Структура("Предметы, Шаблон", Документ, ШаблонДействия.Ссылка));
    НовыйПроцесс.Автор = Процесс.Автор;
    // Связываем процесс с созданной задачей
    НовыйПроцесс.ВедущаяЗадача = ВедущаяЗадачаДействия.Ссылка;
    
    // Устанавливаем исполнителя
    НовыйПроцесс.Исполнители[0].Исполнитель = Выборка.Ответственный;
    
    НовыйПроцесс.Записать();
    НовыйПроцесс.Старт();
КонецЦикла;

Ключевые моменты при реализации

Обратите внимание на объект ВедущаяЗадачаДействия. Без его создания и корректной привязки к ТочкеМаршрута типа ВложенныйПроцесс, процесс не будет отображаться в иерархическом дереве Комплексного процесса.

Основные нюансы:

Используя этот алгоритм, вы сможете создавать сложные динамические процессы в 1С:Документооборот, которые будут полностью подчиняться правилам родительского Комплексного процесса, корректно отображаться в задачах исполнителей и автоматически завершаться при прерывании родительского БП.

← На главную