Работа с механизмом бизнес-процессов (БП) в платформе 1С:Предприятие 8 часто требует не просто создания маршрутов, но и глубокого анализа текущих точек движения задач. Разработчикам и администраторам необходимо программно извлекать информацию о том, где находится конкретная задача, кто является ответственным и каковы реквизиты точки маршрута. Это критически важно для построения дашбордов, автоматического перераспределения нагрузки или сложной отчетности.
Получение точек процесса зависит от того, какой именно объект вы анализируете: саму сущность Бизнес-процесс или конкретную Задачу. В первом случае вы получаете структуру маршрута, а во втором — текущее местоположение исполнителя. Методы доступа к этим данным различаются в зависимости от контекста выполнения кода: в толстом клиенте, тонком клиенте или на сервере.
Рассмотрим основные подходы к решению этой задачи. Мы разберем работу с объектной моделью, использование запросов к регистру сведений и манипуляции с коллекциями задач. Понимание различий между точками процесса и точками маршрута позволит избежать логических ошибок при написании кода.
Объектная модель и работа с экземпляром БП
Самый прямой способ получить информацию о текущей точке — обратиться к объекту бизнес-процесса непосредственно. Для этого необходимо получить ссылку на объект и вызвать метод ТочкиБизнесПроцесса(). Этот метод возвращает массив объектов, описывающих все точки, через которые прошел или может пройти данный экземпляр.
Важно понимать, что метод возвращает объекты типа ТочкаБизнесПроцесса. Каждый такой объект содержит свойства, позволяющие идентифицировать его уникально. Основными свойствами являются Имя, Описание и ТочкаМаршрута. Имя точки обычно совпадает с идентификатором, заданным в конфигураторе, что удобно для программного сравнения.
Однако, просто перебор точек не всегда дает ответ на вопрос "где задача сейчас?". Для определения активной точки часто требуется анализировать связанные задачи. Если бизнес-процесс запущен, но задачи еще не созданы или уже закрыты, коллекция точек покажет весь маршрут, но не выделит текущую позицию без дополнительной логики.
⚠️ Внимание: Метод
ТочкиБизнесПроцесса()доступен только для объектов, которые уже записаны в базу данных. Попытка вызвать его для нового, еще не записанного объекта, приведет к ошибке выполнения.
Рассмотрим пример получения списка точек для конкретного экземпляра. Код должен учитывать, что некоторые точки могут быть ветвлениями или условиями, а не реальными местами ожидания задачи.
БП = Документы.БизнесПроцесс.ПолучитьОбъект(СсылкаНаБП);
МассивТочек = БП.ТочкиБизнесПроцесса();
Для Каждого Точка Из МассивТочек Цикл
Сообщить("Точка: " + Точка.Имя + " | Описание: " + Точка.Описание);
КонецЦикла;
Если вам нужно отследить историю прохождения, используйте свойство "Владелец" у объекта задачи, чтобы подняться к родительскому бизнес-процессу.
Анализ задач через регистр сведений
Для массовой аналитики или построения отчетов перебор объектов в цикле неэффективен. В таких случаях оптимальным решением является обращение к регистру сведений ЗадачиИсполнителей (или аналогичному, в зависимости от конфигурации, например, ЗаданияИсполнителей в БСП). Этот регистр хранит актуальное состояние всех открытых задач.
Ключевым измерением в этом регистре является поле ТочкаМаршрута. Именно оно связывает конкретную задачу с узлом на карте бизнес-процесса. Выполнив выборку по этому регистру, вы можете мгновенно получить сводку: кто, какую задачу выполняет и в какой точке процесса она находится.
Использование запроса позволяет фильтровать данные по исполнителям, датам создания или статусам. Это особенно полезно при формировании списков для руководителей отделов, которым нужно видеть "узкие места" в процессах компании.
Структура запроса должна включать соединения с таблицей точек маршрута, если требуется получить человеко-читаемое описание, а не только техническое имя узла. Часто требуется также присоединение к таблице пользователей для отображения ФИО ответственного.
Использование консоли запросов для диагностики
При отладке логики работы бизнес-процессов часто возникает необходимость быстро проверить, куда ушла задача. Консоль запросов (например, внешняя обработка или встроенная в конфигуратор) позволяет выполнить SQL-подобный запрос напрямую к базе данных, минуя объектный слой 1С.
Для получения точек процесса вам потребуется знать физические имена таблиц. В типовой конфигурации данные о задачах часто хранятся в таблице _InfoRgЗадачиИсполнителей. Поле, отвечающее за точку, может называться _Fld2537_ТочкаМаршрута (имя поля зависит от конфига).
Преимущество этого метода — скорость и возможность увидеть "сырые" данные, которые могут быть скрыты при работе через объект. Однако, прямая работа с физическими таблицами делает код зависимым от конкретной версии конфигурации и платформы.
| Объект метаданных | Физическая таблица (пример) | Ключевое поле точки | Тип данных |
|---|---|---|---|
| БизнесПроцесс.Согласование | _Document123 | _Fld1234_ТекущаяТочка | Строка (36) |
| Задача.СогласоватьДоговор | _Document124 | _Fld1235_ТочкаМаршрута | СправочникСсылка.ТочкиМаршрута |
| РегистрЗадачиИсполнителей | _InfoRg567 | _Fld568_ТочкаМаршрута | СправочникСсылка.ТочкиМаршрута |
| ТочкиМаршрута (Справочник) | _Reference569 | _Fld570_ИмяТочки | Строка (150) |
При использовании консоли важно помнить о правах доступа. Пользователь, от имени которого выполняется запрос, должен иметь права на чтение соответствующих таблиц. В противном случае вы получите пустую выборку или ошибку доступа.
Как узнать физическое имя таблицы?
В конфигураторе нажмите правой кнопкой на объект метаданных и выберите "Свойства". В нижней части окна часто отображается имя таблицы в БД, либо можно использовать обработку "Анализ конфигурации".
Получение точек через коллекцию задач БП
У объекта БизнесПроцесс есть удобное свойство Задачи(), которое возвращает коллекцию всех задач, порожденных данным процессом. Это позволяет не лезть в глобальные регистры, а работать в контексте конкретного экземпляра процесса.
Перебирая эту коллекцию, вы можете отфильтровать только открытые задачи. У каждой открытой задачи есть свойство ТочкаМаршрута, которое указывает на конкретный узел схемы. Это наиболее надежный способ определить, где "застрял" процесс в данный момент.
Такой подход удобен тем, что он абстрагирован от физической структуры базы данных. Даже если разработчики конфигурации изменят имена регистров, этот код продолжит работать, так как он опирается на объектную модель 1С.
⚠️ Внимание: Если бизнес-процесс имеет параллельные ветки, метод
Задачи()вернет несколько активных задач. Ваша логика должна быть готова обработать ситуацию, когда процесс находится одновременно в нескольких точках маршрута.
Пример кода для получения активной точки через коллекцию задач демонстрирует простоту подхода. Здесь мы не делаем лишних запросов, а используем встроенные возможности объекта.
Задачи = БП.Задачи();
Для Каждого Задача Из Задачи Цикл
Если Не Задача.Завершена Тогда
Точка = Задача.ТочкаМаршрута;
// Дальнейшая обработка точки
КонецЕсли;
КонецЦикла;
Работа через коллекцию задач объекта БП является наиболее безопасным и переносимым методом, не зависящим от внутренней структуры таблиц конфигурации.
Обработка ветвлений и сложных маршрутов
Сложность получения точек возрастает, когда в схеме бизнес-процесса используются условия и ветвления. В этом случае "точка процесса" может быть не одним узлом, а набором узлов, через которые задача прошла ранее или может пройти в будущем.
Для анализа таких ситуаций часто требуется рекурсивный обход или использование свойств навигации. Свойство ПредшествующиеТочки (если доступно в вашей версии платформы или доработано в конфигурации) позволяет отследить путь задачи назад до старта.
Также важно различать точки ожидания (где задача висит у исполнителя) и автоматические точки (скрипты, условия), которые процесс проходит мгновенно. При получении списка "актуальных" точек автоматические узлы обычно следует исключать из выборки, чтобы не засорять отчеты техническим шумом.
В конфигурациях на базе БСП (Библиотека Стандартных Подсистем) логика может быть инкапсулирована в общие модули. Перед написанием собственного кода проверьте наличие функций вроде БСП.БизнесПроцессы.ПолучитьТекущуюТочку(), чтобы не изобретать велосипед.
☑️ Проверка сложного маршрута
Частые ошибки и ограничения платформы
При работе с точками бизнес-процессов разработчики часто сталкиваются с проблемой контекста выполнения. Методы получения задач и точек могут быть недоступны в тонком клиенте в файловом варианте базы, если не включены определенные режимы совместимости или если объект заблокирован.
Еще одна распространенная ошибка — попытка получить точку у задачи, которая уже завершена. У завершенной задачи свойство точки может быть очищено или указывать на конечный узел, что искажает статистику по активным процессам. Всегда проверяйте статус задачи перед анализом её местоположения.
Кроме того, стоит учитывать производительность. Получение полного дерева точек для большого количества бизнес-процессов в одном запросе может привести к тормозам интерфейса. В таких случаях лучше использовать асинхронные вызовы или фоновые задания.
⚠️ Внимание: Интерфейс объектов бизнес-процессов может незначительно отличаться в разных версиях платформы 1С (например, 8.3.10 против 8.3.25). Всегда тестируйте код на целевой версии платформы перед внедрением в промышленную эксплуатацию.
FAQ: Часто задаваемые вопросы
Как получить имя точки маршрута, если есть только ссылка на задачу?
Необходимо получить объект задачи методом ПолучитьОбъект() и обратиться к свойству ТочкаМаршрута. Если нужно именно текстовое имя, используйте Задача.ТочкаМаршрута.Наименование или найдите соответствующую запись в справочнике точек маршрута.
Можно ли программно переместить задачу в другую точку процесса?
Напрямую изменить свойство ТочкаМаршрута нельзя, так как это нарушит логику состояния. Для перемещения необходимо использовать механизм возврата задачи, отмены или завершения текущей задачи с запуском новой ветки процесса, в зависимости от требований бизнес-логики.
Почему метод ТочкиБизнесПроцесса возвращает пустой массив?
Это возможно, если объект бизнес-процесса еще не записан в базу данных (новый объект), либо если в схеме процесса не определено ни одной точки, что технически невозможно для рабочего БП. Также проверьте права доступа к метаданным.
Как отследить, сколько времени задача находится в конкретной точке?
Для этого необходимо анализировать регистр движений задач или таблицу истории состояний. Сравнивая дату создания задачи (или входа в точку) с датой её завершения (или перехода в следующую точку), можно вычислить длительность пребывания.