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