Приветствуем всех разработчиков и аналитиков, работающих с механизмом бизнес-процессов в конфигурации 1С:Документооборот! При настройке сложных процессов (например, когда внутри одного комплексного процесса последовательно или параллельно запускаются несколько согласований, ознакомлений и регистраций) часто возникает необходимость выполнить определенные действия перед записью конкретной задачи. Для этого стандартно используется подписка на событие для объекта ЗадачаОбъект.ЗадачаИсполнителя.
Однако здесь мы сталкиваемся с архитектурной трудностью: стандартный реквизит задачи ТочкаМаршрута указывает лишь на точку вложенного (дочернего) процесса (например, конкретный шаг внутри процесса "Согласование"). Как же нам подняться на уровень выше и определить, какому именно блоку или действию на карте комплексного бизнес-процесса соответствует текущая задача? Давайте разберем эту проблему по шагам и рассмотрим все доступные механизмы платформы 1С:Предприятие и логики «1С:Документооборот».
При проектировании вложенных бизнес-процессов платформа 1С автоматически связывает дочерний процесс с родительской точкой маршрута через механизм ведущих задач. Когда комплексный процесс доходит до шага, требующего запуска вложенного процесса, создается специальная задача комплексного процесса. Она становится ведущей для запущенного подчиненного процесса.
Мы можем использовать эту связь, чтобы быстро и изящно дотянуться до точки маршрута комплексного процесса верхнего уровня. Рассмотрим пример кода, который можно внедрить в подписку на событие перед записью задачи:
БизнесПроцессВложенный = ЗадачаОбъект.БизнесПроцесс;
ВедущаяЗадачаРодителя = БизнесПроцессВложенный.ВедущаяЗадача;
Если ЗначениеЗаполнено(ВедущаяЗадачаРодителя) Тогда
// Получаем точку маршрута на карте комплексного процесса верхнего уровня
ТочкаКартыКомплексного = ВедущаяЗадачаРодителя.ТочкаМаршрута;
// Проверим, действительно ли родительский процесс является комплексным
Если ТипЗнч(ВедущаяЗадачаРодителя.БизнесПроцесс) = Тип("БизнесProcessСсылка.КомплексныйПроцесс") Тогда
// Здесь мы можем выполнять свои действия в зависимости от точки маршрута
ИмяТочки = ТочкаКартыКомплексного.Имя;
// Например: Если ИмяТочки = "СогласованиеСБ" Тогда ... КонецЕсли;
КонецЕсли;
КонецЕсли;
Этот способ является наиболее простым, быстрым и производительным, так как использует прямые ссылки объектов, находящиеся в кэше платформы.
Важно помнить, что в «1С:Документооборот» редакции 2.1 комплексный процесс может проектироваться разработчиками и пользователями двумя принципиально разными способами:
ВедущаяЗадача.ТочкаМаршрута отработает безупречно, так как у процесса есть физическая карта маршрута на уровне метаданных.Если мы столкнулись со вторым вариантом (настройкой по таблице действий), нам необходимо обратиться к табличной части родительского комплексного процесса. Проанализируем, как это сделать программно с помощью запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КомплексныйПроцессЭтапы.Ссылка КАК КомплексныйПроцесс,
| КомплексныйПроцессЭтапы.НаименованиеЭтапа КАК НазваниеШага,
| КомплексныйПроцессЭтапы.ПорядокСортировки КАК ПорядокЭтапа,
| КомплексныйПроцессЭтапы.ШаблонДействия КАК ШаблонДействия
|ИЗ
| БизнесПроцесс.КомплексныйПроцесс.Этапы КАК КомплексныйПроцессЭтапы
|ГДЕ
| КомплексныйПроцессЭтапы.ЗапущенныйБизнесПроцесс = &ТекущийБизнесПроцесс";
Запрос.УстановитьПараметр("ТекущийБизнесПроцесс", ЗадачаОбъект.БизнесПроцесс);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Мы нашли конкретную строку этапа в таблице действий комплексного процесса
Сообщить("Текущая задача относится к этапу: " + Выборка.НазваниеШага);
КонецЕсли;
Благодаря этому запросу мы можем точно сопоставить задачу с конкретной строкой настройки комплексного процесса, получить ее название, порядок выполнения и даже шаблон, по которому она была создана.
Иногда обращение к тяжелым объектам бизнес-процессов или чтение табличных частей может приводить к снижению производительности системы, особенно при высокой интенсивности документооборота. Чтобы избежать этого, мы можем использовать специализированные регистры сведений, которые система «1С:Документооборот» обновляет автоматически при создании процессов.
Основным связующим звеном здесь выступает регистр РегистрСведений.ДочерниеБизнесПроцессы. Напишем запрос, который вернет нам всю необходимую информацию одной транзакцией:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДочерниеБизнесПроцессы.РодительскийПроцесс КАК РодительскийПроцесс,
| ДочерниеБизнесПроцессы.РодительскийПроцесс.ВедущаяЗадача КАК ВедущаяЗадача,
| ДочерниеБизнесПроцессы.РодительскийПроцесс.ВедущаяЗадача.ТочкаМаршрута КАК ТочкаКартыРодителя
|ИЗ
| РегистрСведений.ДочерниеБизнесПроцессы КАК ДочерниеБизнесПроцессы
|ГДЕ
| ДочерниеБизнесПроцессы.ДочернийПроцесс = &ТекущийВложенныйПроцесс";
Запрос.УстановитьПараметр("ТекущийВложенныйПроцесс", ЗадачаОбъект.БизнесПроцесс);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Получаем прямую ссылку на точку карты комплексного процесса
ТочкаКарты = Выборка.ТочкаКартыРодителя;
КонецЕсли;
Этот метод гарантирует стабильную работу подписки на событие и исключает вероятность получения ошибок из-за незаполненных ссылок в памяти при транзакционной записи задач.
Если вы планируете переход на новую редакцию 3.0 или уже ведете в ней разработку, важно знать, что архитектура процессов претерпела колоссальные изменения. Концепция разрозненных комплексных бизнес-процессов уступила место единой системе «Обработка документов».
В третьей редакции больше нет необходимости искать "родительский" бизнес-процесс через иерархию ведущих задач. Вместо этого:
ХодОбработкиДокументов.Поэтому при миграции кода на версию 3.0 обязательно перепишите логику поиска этапов, ориентируясь на регистры хода обработки документов.