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