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

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

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

Выясняем, где хранится статус бизнес-процесса

Прежде всего, проанализируем важный архитектурный аспект: на уровне платформы «1С» у объекта БизнесПроцесс нет стандартного реквизита Статус. Есть системные поля, такие как Завершен, Старт и Номер, но привычные пользователю понятия «На согласовании», «Утверждено» или «На доработке» — это всегда плод логики конкретной конфигурации.

Для того чтобы понять, откуда берется статус в вашей форме, выполним следующие шаги:

  1. Проверим реквизиты объекта: Откроем конфигуратор и посмотрим на состав реквизитов конкретного бизнес-процесса. Если разработчик предусмотрел хранение статуса непосредственно в БП, мы увидим там реквизит с типом ПеречислениеСсылка или Строка.
  2. Изучим связанные регистры сведений: В типовых решениях (например, «1С:Документооборот» или «1С:ERP») информация о состояниях процессов часто выносится в отдельные регистры сведений (РС). Посмотрим, нет ли в системе регистра с именем вроде СостоянияБизнесПроцессов или ИсторияСтатусов. Проверим ведущее измерение — если это ссылка на ваш бизнес-процесс, значит, данные нужно брать оттуда.
  3. Проанализируем карту маршрута: Если статус меняется динамически в зависимости от того, в какой точке находится процесс, значит, «статус» — это просто строковое представление текущей точки маршрута.

Как получить текущую точку маршрута через задачи

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

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


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

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

В этом примере мы обращаемся к таблице задач, которые породил данный процесс. Свойство ТочкаМаршрута (тип ТочкаМаршрутаБизнесПроцессаСсылка) однозначно указывает на этап, на котором сейчас «стоит» выполнение.

Определение даты прохождения точки маршрута

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

Разберем, как получить дату достижения определенной точки маршрута через запрос к задачам:


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

Запрос.УстановитьПараметр("БПСсылка", СсылкаНаПроцесс);
Запрос.УстановитьПараметр("ЦелеваяТочка", СсылкаНаТочкуМаршрута);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Сообщить("Точка была пройдена: " + Выборка.ДатаДостиженияТочки);
КонецЕсли;

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

Использование обработчиков событий для фиксации статусов

Если в вашей конфигурации не хватает данных для отчетов, рассмотрим, как правильно организовать логирование изменений статусов «на лету». Для этого проанализируем модуль бизнес-процесса и его основные события:

Посмотрим на пример записи состояния в произвольный Регистр Сведений:


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

Дополнительные инструменты анализа

Если вы не являетесь разработчиком или вам нужно быстро проверить историю изменений без написания кода, проанализируем альтернативные способы:

  1. Версионирование объектов: Если в базе подключена БСП (Библиотека стандартных подсистем), проверьте кнопку «История изменений» на панели формы бизнес-процесса. Если версионирование включено для этого типа объектов, вы увидите пошаговое изменение всех реквизитов.
  2. Журнал регистрации: В крайнем случае, можно отфильтровать Журнал регистрации по объекту бизнес-процесса или связанным задачам. Там будут зафиксированы события Данные.Изменение с точностью до секунды, что позволит восстановить хронологию событий, даже если специализированное логирование не настроено.

Таким образом, для понимания статуса бизнес-процесса нам необходимо либо найти реквизит/регистр, куда разработчик записывает логическое состояние, либо анализировать таблицу Задача, ориентируясь на поля ТочкаМаршрута и ДатаЗавершения. Это наиболее надежный и универсальный подход для платформы «1С:Предприятие 8».

← На главную