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

Такая необходимость возникает при миграции данных, исправлении зависших процессов или реализации сложных алгоритмов автоматического согласования, когда решение принимается системой без участия человека. Понимание внутренней структуры объектов БизнесПроцесс и Задача является критически важным для написания устойчивого кода, который не нарушит логику работы системы.

Архитектура объектов бизнес-процессов

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

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

Важно понимать, что прямой метод завершения процесса существует, но его использование без завершения активной задачи может привести к логическим ошибкам в карте процесса. Система ожидает, что переход между точками маршрута будет зафиксирован через результат выполнения задачи.

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

💡

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

Поиск активной задачи для завершения

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

Для поиска такой задачи используется механизм запросов или объект ВыборкаДанных. Необходимо отбирать задачи, у которых свойство Выполнение имеет значение ВРаботе. Также критически важно проверить свойство БизнесПроцесс, чтобы убедиться, что задача относится к нужному экземпляру.

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

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

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

"ВЫБРАТЬ

| Задачи.Ссылка КАК Ссылка

|ИЗ

| Документ.Задача КАК Задачи

|ГДЕ

| Задачи.БизнесПроцесс = &Процесс

| И Задачи.Выполнение = ЗначениеПеречисления.СостояниеЗадачи.ВРаботе";

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

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

Выборка = Результат.Выбрать();

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

📊 Как вы чаще всего завершаете процессы в 1С?
Через интерфейс задачи
Массовой обработкой
Внешним скриптом
Автоматически по таймеру

Методы завершения задачи программно

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

Ключевым моментом является корректное заполнение параметров задачи перед вызовом метода завершения. Если карта процесса требует заполнения определенных полей (например, "Комментарий" или "Сумма согласования"), их необходимо записать в объект задачи до фиксации изменений.

Существует два основных подхода к завершению: через запись объекта с последующим вызовом метода или через единый вызов метода с передачей параметров. Второй способ предпочтительнее с точки зрения производительности и атомарности операции.

  • 🔹 Стандартное завершение: вызов метода Задача.Завершить(Результат) без дополнительных параметров, если карта процесса предполагает единственный путь.
  • 🔹 Завершение с выбором перехода: если из точки процесса есть несколько исходящих стрелок, необходимо указать конкретный переход или заполнить параметр, влияющий на условие перехода.
  • 🔹 Массовое завершение: использование циклов для обработки списка задач, полученных предварительной выборкой.

⚠️ Внимание: Перед вызовом метода завершения обязательно проверьте права доступа пользователя, от имени которого выполняется код. Отсутствие прав на запись может привести к ошибке выполнения.

☑️ Алгоритм завершения задачи

Выполнено: 0 / 5

Обработка переходов и условий маршрута

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

Если вы завершаете задачу программно, вы должны гарантировать, что параметры, от которых зависит переход, установлены в значения, позволяющие процессу двигаться дальше. В противном случае процесс может "застрять" в точке разветвления или перейти по неверному пути.

Для анализа доступных переходов можно использовать метод ПолучитьТочкуМаршрута и проанализировать исходящие стрелки. Однако на практике чаще используют эвристический подход, зная заранее логику настроенного процесса.

Тип перехода Необходимые действия Риски
Безусловный Простой вызов Завершить Минимальные
По условию (Булево) Заполнить параметр-флаг Неверное значение параметра
По значению реквизита Установить точное значение Типовое несоответствие
Ветвление (ИЛИ) Выбор конкретной стрелки Зависание в точке выбора

Особое внимание следует уделить точкам процесса, где требуется выбор одного из нескольких вариантов продолжения. В таких случаях метод завершения может требовать указания конкретной ссылки на переход или значения, которое однозначно интерпретируется движком процессов.

Как узнать имя перехода программно?

Используйте метод ПолучитьГрафМаршрута() у объекта БизнесПроцесс. Он возвращает объект, позволяющий анализировать структуру карты, имена стрелок и условия на них. Это полезно для динамического выбора пути.

Обработка исключений и транзакционность

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

Использование конструкции НачатьТранзакцию() и ЗафиксироватьТранзакцию() обязательно. В блоке Попытка...Исключение необходимо обрабатывать возможные ошибки блокировок, так как задачи часто блокируются при открытии форм пользователями.

НачатьТранзакцию();

Попытка

Задача.ЗаполнитьПараметры(...);

Задача.Завершить(Результат);

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить("Ошибка завершения: " + ОписаниеОшибки());

КонецПопытки;

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

💡

Транзакционность операции — главный гарант того, что процесс не останется в подвешенном состоянии при сбоях оборудования или ошибках в коде.

Массовое завершение и фоновые задания

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

Для этих целей следует использовать Фоновые задания. Код массового завершения выносится в отдельную общую процедуру, которая запускается через механизм Планировщик или ФоновоеЗадание. Это позволяет выполнять тяжелые выборки и обработку без блокировки интерфейса для других пользователей.

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

  • 🚀 Оптимизация выборки: используйте индексы по полям "БизнесПроцесс" и "Выполнение" для ускорения поиска задач.
  • 🚀 Пакетная запись: по возможности группируйте операции записи для снижения нагрузки на сервер баз данных.
  • 🚀 Контроль прогресса: реализуйте отображение прогресс-бара или запись в журнал регистрации для отслеживания хода выполнения фонового задания.

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

Можно ли завершить процесс, если задача уже снята с контроля?

Нет, если задача имеет статус "Выполнена" или "Отменена", повторный вызов метода завершения приведет к ошибке. Необходимо сначала проверить текущее состояние задачи перед попыткой модификации.

Что произойдет, если завершить задачу с неверным результатом?

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

Как отменить завершение процесса программно?

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

Влияет ли завершение процесса на связанные документы?

Да, в момент завершения могут срабатывать подписки на события, которые проводят документы, меняют их статусы или создают новые записи в регистрах. Это нужно учитывать при отладке.