К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как завершить бизнес-процесс в 1С программно

Как программно завершить бизнес-процесс в 1С: методы ЗавершитьБизнесПроцесс, работа с задачами, точки маршрута, примеры кода и типичные ошибки разработчиков.

Бизнес-процессы в 1С автоматизируют маршруты согласования, задачи и контрольные точки. Иногда процесс нужно завершить принудительно: пользователь уволился, задача потеряла актуальность, процесс «завис» из-за ошибки в алгоритме. Сделать это можно не только интерактивно, но и программно — через встроенный язык, регламентное задание или внешнюю обработку.

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

Как устроено завершение бизнес-процесса в 1С

Бизнес-процесс в 1С — это объект метаданных, который хранит состояние, карту маршрута и связанные задачи. Завершённым процесс считается, когда его реквизит Завершен равен Истина, а дата завершения заполнена. Однако сам по себе флаг не гарантирует целостности: у процесса могут остаться невыполненные задачи, а обработчики событий завершения — не выполниться.

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) завершение процесса часто реализовано через подсистему «Бизнес-процессы и задачи». Там логика завершения включает: проверку прав, установку реквизитов, вызов обработчиков ПриЗавершении, отмену связанных задач и запись в историю. Самописные конфигурации могут использовать упрощённую схему — только флаг и дату.

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

Способ 1. Завершение через объект бизнес-процесса

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

БизнесПроцессСсылка = НайтиПроцессПоНомеру("000000001");

БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект();

Если БизнесПроцессОбъект.Завершен Тогда

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

Возврат;

КонецЕсли;

БизнесПроцессОбъект.Завершен = Истина;

БизнесПроцессОбъект.ДатаЗавершения = ТекущаяДатаСеанса();

БизнесПроцессОбъект.Записать();

Обратите внимание на проверку Завершен перед записью — она защищает от повторной обработки. Также используйте ТекущаяДатаСеанса() вместо ТекущаяДата(), чтобы дата корректно фиксировалась в клиент-серверном режиме.

После записи объекта проверьте задачи. Если у процесса есть активные задачи, они не отменятся автоматически — их нужно обработать отдельным циклом.

Способ 2. Завершение через типовые механизмы БСП

В конфигурациях на БСП (1С:Документооборот, УПП, ERP, комплексная автоматизация) завершение процесса обычно выполняется через программный интерфейс общего модуля. Например, в подсистеме бизнес-процессов есть функции вида БизнесПроцессыИЗадачиСервер.ЗавершитьПроцесс() или аналогичные — точное имя зависит от версии библиотеки и конфигурации.

Типовой вызов выглядит так:

// Пример для типовой подсистемы (имя модуля зависит от конфигурации)

Результат = БизнесПроцессыИЗадачиСервер.ЗавершитьБизнесПроцесс(

БизнесПроцессСсылка,

ПричинаЗавершения);

Если НЕ Результат.Успешно Тогда

ВызватьИсключение Результат.ОписаниеОшибки;

КонецЕсли;

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

Способ 3. Выполнение задач до точки завершения

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

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

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

"ВЫБРАТЬ

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

|ИЗ

| Задача.ЗадачаИсполнителя КАК Задачи

|ГДЕ

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

| И НЕ Задачи.Выполнена";

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ЗадачаОбъект = Выборка.ЗадачаСсылка.ПолучитьОбъект();

ЗадачаОбъект.ВыполнитьЗадачу();

КонецЦикла;

Метод ВыполнитьЗадачу() — штатный способ: он устанавливает признак выполнения, записывает задачу и запускает механизм продвижения процесса по карте маршрута. Если на маршруте есть условия или скрипты выбора ответа, перед выполнением задачи может потребоваться заполнить реквизиты результата (например, «РезультатСогласования»).

Если задача требует интерактивного ввода, которого нет в коде, выполнение вызовет исключение — обработайте его через Попытка...Исключение и зафиксируйте в журнале регистрации.

Порядок действий
  1. 1
    Найдите ссылку на бизнес-процесс по номеру, дате или предмету
  2. 2
    Проверьте, что процесс стартован и ещё не завершён
  3. 3
    Получите объект процесса или вызовите типовую функцию завершения
  4. 4
    Отмените или выполните все активные задачи процесса
  5. 5
    Запишите изменения в транзакции
  6. 6
    Проверьте результат: флаг Завершен, дата, отсутствие активных задач

Массовое завершение процессов регламентным заданием

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

Процедура ЗавершитьПросроченныеПроцессы() Экспорт

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

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

"ВЫБРАТЬ

| Процессы.Ссылка КАК Ссылка

|ИЗ

| БизнесПроцесс.СогласованиеЗаявки КАК Процессы

|ГДЕ

| Процессы.Стартован

| И НЕ Процессы.Завершен

| И Процессы.Дата < &ГраницаДаты";

Запрос.УстановитьПараметр("ГраницаДаты",

ДобавитьМесяц(ТекущаяДатаСеанса(), -3));

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

Попытка

ПроцессОбъект = Выборка.Ссылка.ПолучитьОбъект();

ПроцессОбъект.Завершен = Истина;

ПроцессОбъект.ДатаЗавершения = ТекущаяДатаСеанса();

ПроцессОбъект.Записать();

// отмена задач процесса...

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

Исключение

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

ЗаписьЖурналаРегистрации("Завершение процессов",

УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

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

КонецЦикла;

КонецПроцедуры

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

Типичные ошибки
01
Установка флага Завершен без отмены задач — задачи остаются висеть в списках исполнителей и искажают отчёты
02
Вызов Записать() вместо ВыполнитьЗадачу() у задачи — процесс не продвигается по маршруту, обработчики не срабатывают
03
Отсутствие проверки «уже завершён» — повторный запуск кода портит дату завершения и историю
04
Игнорирование транзакций при массовой обработке — одна ошибка откатывает всю пачку или оставляет данные в частично изменённом состоянии
05
Завершение процесса, у которого есть проведённые документы по цепочке — нарушается логика согласования

Проверка результата и контрольные точки

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

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

Контрольные точки

Как проверить результат

Реквизиты процесса
Норма

Завершен = Истина, ДатаЗавершения заполнена

Тревожный признак

Флаг установлен, но дата пустая или наоборот

Активные задачи процесса
Норма

Запрос по задачам возвращает 0 невыполненных

Тревожный признак

Остались задачи в списках исполнителей

Журнал регистрации
Норма

Нет ошибок за время работы обработки

Тревожный признак

Ошибки записи, блокировок или обработчиков

Карта маршрута в форме
Норма

Процесс в конечной точке, кнопки старта недоступны

Тревожный признак

Процесс визуально «висит» на промежуточной точке

Ограничения и когда нужен разработчик

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

Не завершайте программно процессы, по которым идёт аудит или разбор инцидента: изменение даты завершения и отмена задач переписывают историю. В спорных ситуациях делайте резервную копию, фиксируйте список обрабатываемых ссылок и выполняйте изменения на копии базы.

Итог

Что важно запомнить

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

Частые вопросы

Чем ВыполнитьЗадачу() отличается от установки реквизита Выполнена?

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

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

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

Как отменить задачу программно, а не выполнить её?

В типовых конфигурациях для отмены обычно есть отдельный механизм (пометка на удаление задачи или специальный реквизит состояния). Универсальный вариант — установить у задачи пометку удаления через объект: ЗадачаОбъект.УстановитьПометкуУдаления(Истина). Проверьте, как ваша конфигурация обрабатывает отменённые задачи.

Нужны ли особые права для программного завершения процессов?

Код выполняется с правами текущего пользователя сеанса. Для регламентных заданий — с правами указанного пользователя задания. Если у пользователя нет прав на изменение процессов и задач, запись вызовет исключение. В привилегированном режиме (УстановитьПривилегированныйРежим) проверка прав отключается — используйте это осознанно.

Что делать, если процесс завис и не завершается штатно?

Сначала найдите причину: откройте карту маршрута, проверьте активные задачи и ошибки в журнале регистрации. Частая причина — задача, требующая заполнения реквизита результата, или ошибка в обработчике. Устраните причину, затем завершите программно. Принудительная установка флага без разбора причины оставит проблему нерешённой.

Можно ли завершить процесс через COM-соединение или веб-сервис извне?

Да. Через COM-коннектор (V83.COMConnector) получают объект процесса в удалённой базе и выполняют те же действия. Через HTTP- или веб-сервис логика завершения размещается внутри сервиса на стороне 1С. В обоих случаях важны права пользователя подключения и обработка ошибок связи.