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