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

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

Особое внимание уделим недокументированным особенностям работы с точками маршрутов в версиях платформы 8.3.20+, где изменилась логика хранения состояний процессов. Если вы сталкивались с ситуацией, когда метод ТекущаяТочкаМаршрута() возвращает Неопределено несмотря на активный процесс — здесь вы найдёте решение.

1. Базовые понятия: что такое "точка бизнес-процесса" в 1С

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

  • 📌 Бизнес-процесс — это последовательность автоматизированных и ручных действий (задач), привязанных к объекту (например, документу ЗаявкаНаОплату).
  • 📍 Точка маршрута — конкретный этап в бизнес-процессе (например, "Согласование у руководителя" или "Оплачено").
  • 🔄 Текущая точка — активный этап, на котором находится процесс в данный момент. Может быть только одна.

Внутри системы точки хранятся в виде записей в таблице БизнесПроцессыТочкиМаршрута, но напрямую обращаться к ней не рекомендуется — платформа предоставляет API для работы с этими данными. Ключевые объекты для манипуляции:

  • 🔹 МенеджерБизнесПроцессов — основной инструмент для управления процессами.
  • 🔹 Задача — экземпляр текущей задачи в точке маршрута (например, задача на согласование).
  • 🔹 ПланОбмена — используется для синхронизации процессов в распределённых базах.

Важно отличать точку маршрута от задачи: точка — это шаблон этапа, а задача — его конкретное выполнение. Например, в процессе "Согласование заказа" может быть точка "Бухгалтер", но задача будет создана только когда заказ действительно попадёт на этого пользователя.

📊 Как часто вы работаете с бизнес-процессами в 1С?
Ежедневно
Несколько раз в неделю
Редко
Никогда

2. Способ 1: Получение текущей точки через объект документа (для пользователей)

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

Алгоритм действий:

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

Если закладки нет, проверьте:

  • ✅ Наличие прав на просмотр бизнес-процессов (роль ЧтениеБизнесПроцессов).
  • ✅ Настройки конфигурации: возможно, бизнес-процессы скрыты через параметры интерфейса.
💡

В типовых конфигурациях (например, 1С:ERP или 1С:Управление торговлей) текущая точка отображается в панели навигации документа рядом с кнопкой "Бизнес-процессы".

Ограничения метода:

  • 🚫 Не показывает историю перемещений по точкам.
  • 🚫 Не работает, если процесс приостановлен или находится в фоновом режиме.
  • 🚫 Не позволяет программно обработать точку (например, для автоматического перенаправления).

3. Способ 2: Использование метода ТекущаяТочкаМаршрута() в коде

Для разработчиков основной инструмент — метод ТекущаяТочкаМаршрута(), доступный у объекта БизнесПроцесс. Он возвращает ссылку на текущую точку или Неопределено, если процесс завершён или ещё не начат.

Пример кода для получения текущей точки:

Процесс = Документ.БизнесПроцессы.НайтиПоИмени("СогласованиеЗаявки");

Если Процесс <> Неопределено Тогда

ТекущаяТочка = Процесс.ТекущаяТочкаМаршрута();

Если ТекущаяТочка <> Неопределено Тогда

Сообщить("Текущая точка: " + ТекущаяТочка.Наименование);

Иначе

Сообщить("Процесс завершён или не запущен");

КонецЕсли;

КонецЕсли;

Типичные ошибки при использовании этого метода:

Ошибка Причина Решение
Неопределено despite active process Процесс приостановлен или находится в фоновом режиме Используйте Процесс.Состояние() для проверки статуса
Ошибка "Объект не найден" Неверное имя бизнес-процесса Проверьте имя процесса в конфигураторе (Общие → Бизнес-процессы)
Метод недоступен Устаревшая версия платформы (до 8.3.6) Обновите платформу или используйте обходные пути (см. Способ 4)

В версиях платформы 8.3.20+ метод ТекущаяТочкаМаршрута() может возвращать некорректные данные для процессов, запущенных через планы обмена. В этом случае рекомендуется использовать альтернативный подход через МенеджерБизнесПроцессов:

Менеджер = Новый МенеджерБизнесПроцессов;

ТекущаяТочка = Менеджер.ПолучитьТекущуюТочку(Процесс.Ссылка);

💡

Метод ТекущаяТочкаМаршрута() работает только для активных процессов. Если процесс приостановлен, используйте Процесс.ТочкиМаршрута.Получить() с фильтром по статусу.

4. Способ 3: Запрос к таблице ТочкиМаршрута (для сложных случаев)

Когда стандартные методы не работают (например, для архивных процессов или в распределённых базах), можно обратиться напрямую к системным таблицам. Этот способ требует прав на чтение служебных данных и аккуратности, так как структура таблиц может меняться между версиями платформы.

Пример запроса для получения текущей точки:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ТочкиМаршрута.Ссылка КАК Точка,

| ТочкиМаршрута.Наименование КАК Наименование,

| ТочкиМаршрута.ДатаВхода КАК ДатаВхода

|ИЗ

| РегистрСведений.БизнесПроцессыТочкиМаршрута КАК ТочкиМаршрута

|ГДЕ

| ТочкиМаршрута.БизнесПроцесс = &Процесс

| И ТочкиМаршрута.ДатаВыхода = ДАТАВРЕМЯ(1, 1, 1)

|УПОРЯДОЧИТЬ ПО

| ДатаВхода УБЫВ";

Запрос.УстановитьПараметр("Процесс", Процесс.Ссылка);

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

Сообщить("Активных точек не найдено");

Иначе

ТекущаяТочка = Результат.Получить(0).Точка;

КонецЕсли;

Пояснения к запросу:

  • 🔍 Фильтр ДатаВыхода = ДАТАВРЕМЯ(1, 1, 1) ищет точки, из которых ещё не был осуществлён выход (т.е. активные).
  • 🔍 Поле ДатаВхода показывает, когда процесс попал в эту точку.
  • 🔍 Если запрос возвращает несколько строк, берите ту, у которой самая поздняя ДатаВхода.
Что делать, если запрос возвращает пустой результат?

Это может означать, что:

1. Процесс ещё не стартовал (проверьте Процесс.Состояние()).

2. Процесс завершён (все точки имеют заполненную ДатаВыхода).

3. У вас нет прав на чтение регистра БизнесПроцессыТочкиМаршрута (требуется роль АдминистрированиеБизнесПроцессов).

4. В распределённой базе данные ещё не синхронизированы (проверьте ПланОбмена.ПоследняяДатаОбмена).

Предупреждение: структура регистра БизнесПроцессыТочкиМаршрута может отличаться в разных конфигурациях. Например, в 1С:ERP добавлены поля Ответственный и СрокИсполнения, которых нет в базовой поставке.

⚠️ Внимание: Прямые запросы к системным таблицам бизнес-процессов могут нарушить целостность данных при некорректном использовании. Всегда тестируйте код на копии базы перед применением на рабочем сервере.

5. Способ 4: Анализ задач бизнес-процесса (альтернативный подход)

Если бизнес-процесс включает задачи (например, задачи на согласование), текущую точку можно определить через анализ активных задач. Этот метод полезен, когда стандартные способы не работают из-за особенностей конфигурации.

Пример кода для поиска задачи:

Задачи = Процесс.Задачи.Выбрать();

Пока Задачи.Следующий() Цикл

Если Задачи.Состояние = Перечисление.СостоянияЗадачи.Выполняется Тогда

ТекущаяТочка = Задачи.ТочкаМаршрута;

Прервать;

КонецЕсли;

КонецЦикла;

Преимущества метода:

  • ✔ Работает даже если процесс приостановлен.
  • ✔ Позволяет получить дополнительную информацию (исполнителя, срок, комментарии).
  • ✔ Подходит для процессов с параллельными ветками (возвращает все активные задачи).

Недостатки:

  • ✖ Не покажет точку, если задача ещё не создана (например, при автоматическом переходе).
  • ✖ Требует прав на чтение задач (ЧтениеЗадачБизнесПроцессов).

Для процессов с параллельными задачами (например, согласование у нескольких лиц одновременно) код выше вернёт только первую найденную задачу. Чтобы получить все активные точки, используйте:

АктивныеТочки = Новый Массив;

Задачи = Процесс.Задачи.Выбрать();

Пока Задачи.Следующий() Цикл

Если Задачи.Состояние = Перечисление.СостоянияЗадачи.Выполняется Тогда

АктивныеТочки.Добавить(Задачи.ТочкаМаршрута);

КонецЕсли;

КонецЦикла;

6. Способ 5: Использование журнала регистрации (для отладки)

Когда бизнес-процесс "зависает" или ведёт себя неожиданно, полезно проанализировать его историю через журнал регистрации. Этот метод не даёт прямой ссылки на текущую точку, но помогает понять, где процесс мог "застрять".

Как просмотреть журнал:

  1. Откройте Администрирование → Журналы регистрации.
  2. Установите фильтр по объекту (например, по ссылке на документ).
  3. Ищите записи с событиями:
    • 📌 БизнесПроцесс.Старт — начало процесса.
    • 📌 БизнесПроцесс.Переход — смена точки маршрута.
    • 📌 БизнесПроцесс.Ошибка — проблемы при выполнении.

Пример анализа журнала:

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

Для программного анализа журнала используйте объект ЖурналРегистрации:

Журнал = Новый ЖурналРегистрации;

Журнал.Отбор.Объект = Процесс.Ссылка;

Журнал.Отбор.Событие.Установить(Перечисление.СобытияЖурналаРегистрации.БизнесПроцессПереход);

Журнал.Прочитать();

ПоследняяЗапись = Журнал.Получить(Журнал.Количество() - 1);

ТекущаяТочка = ПоследняяЗапись.Параметры.ТочкаМаршрута;

⚠️ Внимание: В высоконагруженных системах журнал регистрации может очищаться автоматически (настройка МаксимальныйРазмерЖурнала в параметрах кластера). Если данных нет, увеличьте размер журнала или настройте архивирование.

7. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с точками бизнес-процессов. Вот самые распространённые ошибки и способы их решения:

Ошибка Причина Решение
ТекущаяТочкаМаршрута() возвращает Неопределено для активного процесса Процесс находится в фоновом режиме или приостановлен Используйте Процесс.Состояние() для проверки. Если состояние = Приостановлен, возобновите процесс методом Процесс.Возобновить()
Запрос к БизнесПроцессыТочкиМаршрута возвращает устаревшие данные В распределённой базе не синхронизированы данные Выполните принудительный обмен через ПланОбмена.ВыполнитьОбмен()
Ошибка "Нет прав на чтение бизнес-процессов" Отсутствует роль ЧтениеБизнесПроцессов или АдминистрированиеБизнесПроцессов Назначьте роль через Администрирование → Пользователи или запросите права у администратора
Не удаётся получить точку для процесса, запущенного из внешней системы Процесс создан через ПланОбмена и не привязан к текущей базе Используйте МенеджерБизнесПроцессов.ПолучитьПроцессПоИдентификатору() с указанием идентификатора из внешней системы

Ещё одна частая проблема — несоответствие точек маршрута в коде и в базе. Например, если в конфигураторе точка называется "Согласование", а в базе хранится как "Согласование_1". Чтобы избежать этого:

  • 🔧 Всегда используйте Имя точки, а не Наименование, для программного доступа.
  • 🔧 Проверяйте актуальность конфигурации: после обновления именование точек могло измениться.

Если бизнес-процесс "завис" на одной точке без видимых причин, проверьте:

Наличие активных задач в точке|Права исполнителя задачи|Обработчики событий точки (могут содержать ошибки)|Логи в журнале регистрации|Синхронизацию в распределённой базе (если применимо)-->

8. Продвинутые сценарии: работа с точками в распределённых базах

В распределённых информационных базах (РИБ) бизнес-процессы синхронизируются через планы обмена, что добавляет сложности при определении текущей точки. Основные проблемы:

  • 🔄 Задержки синхронизации: точка может быть обновлена в одной базе, но ещё не передалась в другую.
  • 🔄 Конфликты версий: если процесс изменён в двух базах одновременно.
  • 🔄 Потеря ссылок: при некорректной настройке обмена ссылки на точки могут "обнуляться".

Решения для РИБ:

  1. Проверка статуса обмена: перед работой с процессом убедитесь, что данные актуальны:
    Если ПланОбмена.ПоследняяДатаОбмена() < ТекущаяДата() Тогда
    

    ПланОбмена.ВыполнитьОбмен();

    КонецЕсли;

  2. Использование универсальных идентификаторов: в РИБ лучше работать не со ссылками, а с УникальныйИдентификатор точек:
    УИДТочки = Процесс.ТочкиМаршрута.НайтиПоИмени("Согласование").УникальныйИдентификатор;
  3. Обработка конфликтов: настройте обработчики событий ПриКонфликтеОбмена для бизнес-процессов.

Пример кода для получения текущей точки в РИБ:

// Получаем процесс по универсальному идентификатору

Менеджер = Новый МенеджерБизнесПроцессов;

Процесс = Менеджер.ПолучитьПроцессПоУникальномуИдентификатору(УИДПроцесса);

// Проверяем актуальность данных

Если Процесс.ЭтоНоваяЗапись() Тогда

Сообщить("Процесс ещё не синхронизирован в эту базу");

Иначе

ТекущаяТочка = Процесс.ТекущаяТочкаМаршрута();

КонецЕсли;

⚠️ Внимание: В РИБ с большим количеством узлов (более 5) бизнес-процессы могут синхронизироваться с задержкой до нескольких часов. Для критичных процессов настройте принудительный обмен по расписанию.

FAQ: Частые вопросы по работе с точками бизнес-процессов

Можно ли получить историю всех точек, через которые прошёл процесс?

Да, для этого используйте запрос к регистру БизнесПроцессыТочкиМаршрута без фильтра по ДатаВыхода:

Запрос.Текст =

"ВЫБРАТЬ

| ТочкиМаршрута.Наименование КАК Точка,

| ТочкиМаршрута.ДатаВхода КАК ДатаВхода,

| ТочкиМаршрута.ДатаВыхода КАК ДатаВыхода

|ИЗ

| РегистрСведений.БизнесПроцессыТочкиМаршрута КАК ТочкиМаршрута

|ГДЕ

| ТочкиМаршрута.БизнесПроцесс = &Процесс

|УПОРЯДОЧИТЬ ПО

| ДатаВхода";

Результат покажет все точки с датами входа и выхода.

Почему метод ТекущаяТочкаМаршрута() возвращает старую точку после перехода?

Это типичная проблема при работе с фоновыми процессами. Платформа кэширует состояние процесса, и изменения могут применятся с задержкой. Решения:

  • Вызовите Процесс.ОбновитьДанные() перед чтением точки.
  • Используйте МенеджерБизнесПроцессов.ОбновитьСостояние(Процесс.Ссылка).
  • Если процесс запущен через ПланОбмена, выполните принудительную синхронизацию.
Как программно переместить процесс на другую точку?

Для перемещения используйте метод Процесс.Перейти():

ТекущаяТочка = Процесс.ТекущаяТочкаМаршрута();

СледующаяТочка = Процесс.ТочкиМаршрута.НайтиПоИмени("Одобрено");

Процесс.Перейти(СледующаяТочка);

Важно: перед переходом проверьте Процесс.МожноПерейти(СледующаяТочка), иначе возникнет ошибка.

Можно ли получить текущую точку для процесса, запущенного из внешней системы (например, через REST)?

Да, но для этого нужен уникальный идентификатор процесса, переданный из внешней системы. Пример:

Менеджер = Новый МенеджерБизнесПроцессов;

Процесс = Менеджер.ПолучитьПроцессПоУникальномуИдентификатору(УИДИзВнешнейСистемы);

ТекущаяТочка = Процесс.ТекущаяТочкаМаршрута();

Если процесс не найден, проверьте:

  • Корректность передачи УИД (должен совпадать с тем, что в базе).
  • Синхронизацию данных (в РИБ процесс мог не дойти до текущей базы).
Как отладить бизнес-процесс, если текущая точка не определяется?

Последовательность действий для диагностики:

  1. Проверьте состояние процесса: Сообщить(Процесс.Состояние()).
  2. Изучите журнал регистрации на ошибки.
  3. Выполните запрос к БизнесПроцессыТочкиМаршрута без фильтров.
  4. Проверьте права текущего пользователя на чтение процессов.
  5. Если процесс в РИБ — выполните принудительный обмен.

Если проблема не решена, экспортируйте процесс в DT-файл и проанализируйте его структуру в конфигураторе.