Как организовать запись и отслеживание статусов в бизнес-процессах 1С?

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

При разработке подсистем автоматизации бизнес-процессов (БП) часто возникает необходимость не просто запустить процесс, но и детально отслеживать его состояние на каждом этапе. Стандартных механизмов БП иногда недостаточно, особенно когда требуется хранить историю: кто, когда и с каким результатом выполнил задачу. Разберем основные подходы к решению этой задачи, проанализируем ошибки новичков и выберем оптимальную архитектуру для вашей конфигурации.

Проблема пустой ссылки в событии ПередСозданиемЗадач

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

Выясним причину, почему это критично. Если мы хотим записать статус процесса в привязке к конкретной задаче в сторонний регистр, нам необходима эта ссылка. Для решения этой проблемы рассмотрим метод УстановитьСсылкуНового(). Мы можем программно сгенерировать ссылку для новой задачи еще до ее фактической записи.

Посмотрим на пример реализации в коде:


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

Использование регистра сведений для хранения истории статусов

Проанализируем ситуацию, когда заказчику недостаточно видеть только текущую точку маршрута, а требуется полная история согласования. Использование только стандартных таблиц задач может быть неудобным для построения сложных отчетов. Оптимальный вариант — создание вспомогательного Регистра сведений (например, ИсторияСтатусовБП).

Разберем структуру такого регистра:

  1. Измерения: БизнесПроцесс (тип: ссылка на ваш БП, обязательно установите свойство "Ведущее"), Исполнитель (тип: СправочникСсылка.Пользователи), ДатаСобытия (тип: Дата).
  2. Ресурсы: Статус (тип: ПеречислениеСсылка.СтатусыСогласования или Строка).
  3. Реквизиты: Задача (тип: ЗадачаСсылка).

Запись в этот регистр следует выполнять в точках маршрута БП или в модуле задачи при ее выполнении. Рассмотрим подробнее, почему стоит использовать именно Ведущее измерение для поля БизнесПроцесс. Это гарантирует, что при удалении экземпляра бизнес-процесса (например, при очистке тестовых данных), вся история его статусов в регистре будет удалена автоматически системными механизмами 1С.

Вычисление статуса по задачам "на лету"

Если ваша задача — не хранить историю, а просто понимать текущее состояние, создание регистра может быть избыточным. Мы можем получить статус программно, анализируя созданные задачи, привязанные к БП. Все задачи имеют реквизит БизнесПроцесс, по которому их легко отфильтровать.

Проанализируем пример запроса, который позволяет собрать информацию о текущем состоянии процесса:


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

Запрос.УстановитьПараметр("БП", СсылкаНаБизнесПроцесс);
Результат = Запрос.Выполнить().Выгрузить();

Важно помнить, что у одного экземпляра бизнес-процесса в один момент времени может быть несколько активных (невыполненных) задач, если маршрут предполагает параллельное исполнение. В этом случае "статус" бизнес-процесса будет совокупностью состояний всех его активных задач.

Оптимизация производительности: реквизит "Текущее состояние"

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

Как это работает на практике:

  1. При переходе БП в новую точку маршрута (в обработчиках ПриСозданииЗадач или ПриВыполнении), мы обновляем этот реквизит.
  2. В динамическом списке мы просто выводим это поле. Система не тратит ресурсы на сложные соединения (JOIN) с другими таблицами.
  3. Если нужна детальная история — пользователь открывает форму и там уже данные подтягиваются из регистра сведений.

Использование механизмов БСП

Если вы разрабатываете в современной конфигурации на базе БСП (Библиотека стандартных подсистем), обратите внимание на подсистему "Бизнес-процессы и задачи". В ней уже реализован регистр сведений ДанныеБизнесПроцессов. Посмотрим на его возможности: он хранит текущее состояние, дату завершения, важность и автора. Вместо создания своих велосипедов, мы можем расширить этот регистр или использовать его логику для записи собственных статусов. Это обеспечит бесшовную интеграцию с типовыми отчетами и формами мониторинга задач.

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

← На главную