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