Как связать задачу исполнителя и точку маршрута комплексного бизнес-процесса в 1С:Документооборот

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

Приветствуем всех разработчиков и аналитиков, работающих с механизмом бизнес-процессов в конфигурации 1С:Документооборот! При настройке сложных процессов (например, когда внутри одного комплексного процесса последовательно или параллельно запускаются несколько согласований, ознакомлений и регистраций) часто возникает необходимость выполнить определенные действия перед записью конкретной задачи. Для этого стандартно используется подписка на событие для объекта ЗадачаОбъект.ЗадачаИсполнителя.

Однако здесь мы сталкиваемся с архитектурной трудностью: стандартный реквизит задачи ТочкаМаршрута указывает лишь на точку вложенного (дочернего) процесса (например, конкретный шаг внутри процесса "Согласование"). Как же нам подняться на уровень выше и определить, какому именно блоку или действию на карте комплексного бизнес-процесса соответствует текущая задача? Давайте разберем эту проблему по шагам и рассмотрим все доступные механизмы платформы 1С:Предприятие и логики «1С:Документооборот».

Решение 1. Использование платформенного реквизита «ВедущаяЗадача»

При проектировании вложенных бизнес-процессов платформа 1С автоматически связывает дочерний процесс с родительской точкой маршрута через механизм ведущих задач. Когда комплексный процесс доходит до шага, требующего запуска вложенного процесса, создается специальная задача комплексного процесса. Она становится ведущей для запущенного подчиненного процесса.

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


БизнесПроцессВложенный = ЗадачаОбъект.БизнесПроцесс;
ВедущаяЗадачаРодителя = БизнесПроцессВложенный.ВедущаяЗадача;

Если ЗначениеЗаполнено(ВедущаяЗадачаРодителя) Тогда
    // Получаем точку маршрута на карте комплексного процесса верхнего уровня
    ТочкаКартыКомплексного = ВедущаяЗадачаРодителя.ТочкаМаршрута; 
    
    // Проверим, действительно ли родительский процесс является комплексным
    Если ТипЗнч(ВедущаяЗадачаРодителя.БизнесПроцесс) = Тип("БизнесProcessСсылка.КомплексныйПроцесс") Тогда
        // Здесь мы можем выполнять свои действия в зависимости от точки маршрута
        ИмяТочки = ТочкаКартыКомплексного.Имя;
        // Например: Если ИмяТочки = "СогласованиеСБ" Тогда ... КонецЕсли;
    КонецЕсли;
КонецЕсли;

Этот способ является наиболее простым, быстрым и производительным, так как использует прямые ссылки объектов, находящиеся в кэше платформы.

Решение 2. Обход специфики «Таблицы действий» в 1С:Документооборот 2.1

Важно помнить, что в «1С:Документооборот» редакции 2.1 комплексный процесс может проектироваться разработчиками и пользователями двумя принципиально разными способами:

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КомплексныйПроцессЭтапы.Ссылка КАК КомплексныйПроцесс,
    |	КомплексныйПроцессЭтапы.НаименованиеЭтапа КАК НазваниеШага,
    |	КомплексныйПроцессЭтапы.ПорядокСортировки КАК ПорядокЭтапа,
    |	КомплексныйПроцессЭтапы.ШаблонДействия КАК ШаблонДействия
    |ИЗ
    |	БизнесПроцесс.КомплексныйПроцесс.Этапы КАК КомплексныйПроцессЭтапы
    |ГДЕ
    |	КомплексныйПроцессЭтапы.ЗапущенныйБизнесПроцесс = &ТекущийБизнесПроцесс";

Запрос.УстановитьПараметр("ТекущийБизнесПроцесс", ЗадачаОбъект.БизнесПроцесс);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    // Мы нашли конкретную строку этапа в таблице действий комплексного процесса
    Сообщить("Текущая задача относится к этапу: " + Выборка.НазваниеШага);
КонецЕсли;

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

Решение 3. Использование служебных регистров сведений (Оптимальный путь)

Иногда обращение к тяжелым объектам бизнес-процессов или чтение табличных частей может приводить к снижению производительности системы, особенно при высокой интенсивности документооборота. Чтобы избежать этого, мы можем использовать специализированные регистры сведений, которые система «1С:Документооборот» обновляет автоматически при создании процессов.

Основным связующим звеном здесь выступает регистр РегистрСведений.ДочерниеБизнесПроцессы. Напишем запрос, который вернет нам всю необходимую информацию одной транзакцией:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДочерниеБизнесПроцессы.РодительскийПроцесс КАК РодительскийПроцесс,
    |	ДочерниеБизнесПроцессы.РодительскийПроцесс.ВедущаяЗадача КАК ВедущаяЗадача,
    |	ДочерниеБизнесПроцессы.РодительскийПроцесс.ВедущаяЗадача.ТочкаМаршрута КАК ТочкаКартыРодителя
    |ИЗ
    |	РегистрСведений.ДочерниеБизнесПроцессы КАК ДочерниеБизнесПроцессы
    |ГДЕ
    |	ДочерниеБизнесПроцессы.ДочернийПроцесс = &ТекущийВложенныйПроцесс";

Запрос.УстановитьПараметр("ТекущийВложенныйПроцесс", ЗадачаОбъект.БизнесПроцесс);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    // Получаем прямую ссылку на точку карты комплексного процесса
    ТочкаКарты = Выборка.ТочкаКартыРодителя;
КонецЕсли;

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

Как эти механизмы изменились в «1С:Документооборот 3.0»?

Если вы планируете переход на новую редакцию 3.0 или уже ведете в ней разработку, важно знать, что архитектура процессов претерпела колоссальные изменения. Концепция разрозненных комплексных бизнес-процессов уступила место единой системе «Обработка документов».

В третьей редакции больше нет необходимости искать "родительский" бизнес-процесс через иерархию ведущих задач. Вместо этого:

Поэтому при миграции кода на версию 3.0 обязательно перепишите логику поиска этапов, ориентируясь на регистры хода обработки документов.

← На главную