Как оживить и запустить заново завершенный бизнес-процесс в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему простая смена флага «Завершен» не работает?

Прежде всего, проанализируем внутреннее устройство механизма бизнес-процессов. В платформе 1С бизнес-процесс — это не просто запись в таблице базы данных с признаком «Истина» или «Ложь». Это сложная «машина состояний». Когда процесс помечается как завершенный, платформа отключает для него обработчики событий маршрутизации. Вы можете программно написать БизнесПроцесс.Завершен = Ложь, но для платформы это будет выглядеть как противоречивая запись в базе, которая не инициирует автоматическое создание новых задач.

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

Шаг 1: Правильный программный сброс статуса завершения

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


// Получаем объект бизнес-процесса для редактирования
БПОбъект = СсылкаНаБП.ПолучитьОбъект();

// Сбрасываем флаг завершения
БПОбъект.Завершен = Ложь;

// КРИТИЧЕСКИ ВАЖНО: Очищаем дату завершения
// Если оставить старую дату, процесс не будет считаться активным
БПОбъект.ДатаЗавершения = '00010101000000'; 

// Записываем изменения
БПОбъект.Записать();

После выполнения этого кода процесс перестанет числиться в списке завершенных, однако он все еще может «стоять на месте», не создавая новых задач. Рассмотрим, как это исправить.

Шаг 2: Работа с задачами и точками маршрута

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

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

  1. Найти последнюю выполненную задачу данного бизнес-процесса.
  2. Программно «отменить» ее выполнение (сбросить флаг Выполнена и дату исполнения).
  3. Использовать метод ВыполнитьЗадачу(), чтобы платформа штатно отработала переход к следующей точке маршрута.

Если автоматическое движение все равно не восстанавливается, нам поможет метод УстановитьТочкуМаршрута(). Рассмотрим пример, как принудительно вернуть БП на нужный этап:


// Предположим, мы хотим вернуть БП на точку "Согласование"
ТочкаМаршрута = БизнесПроцессы.СогласованиеПродажи.ТочкиМаршрута.Согласование;

БПОбъект = СсылкаНаБП.ПолучитьОбъект();
// Устанавливаем точку маршрута принудительно
БПОбъект.УстановитьТочкуМаршрута(ТочкаМаршрута);
БПОбъект.Записать();

Использование УстановитьТочкуМаршрута() позволяет «перепрыгнуть» или вернуться на любой этап карты, при этом платформа автоматически сформирует задачи для исполнителей, указанных в этой точке.

Шаг 3: Проверка в конфигурациях на базе БСП и CRM

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

Например, в 1С:CRM за состояние процесса отвечает не только сам объект, но и записи в регистре СостоянияБизнесПроцессов. При оживлении процесса проверьте наличие подобных регистров. Если запись в регистре останется в статусе «Завершен», пользователь в интерфейсе будет видеть противоречивую информацию.

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

Рекомендуемый альтернативный подход: Копирование

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

  1. Создание копии: Создаем новый экземпляр бизнес-процесса того же типа.
  2. Перенос данных: Программно копируем все заполненные реквизиты из «испорченного» БП в новый.
  3. Промотка маршрута: Программно выполняем задачи в новом БП до того момента, где остановился старый (используя ВыполнитьЗадачу() с программным заполнением результатов).
  4. Аннулирование старого: Старый БП помечаем как «Отменен» или «Ошибка», чтобы он не мешал в отчетах.

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

Резюме для разработчика

Подводя итог, для быстрого решения проблемы «оживления» в Управляемых формах 1С 8.3 используйте комбинацию очистки ДатаЗавершения и метода УстановитьТочкуМаршрута(). Однако всегда помните о побочных эффектах в виде уже сработавших триггеров в модуле бизнес-процесса. Всегда проверяйте код в консоли запросов и используйте отладчик для отслеживания того, на каком этапе карта маршрута перестает генерировать задачи.

← На главную