В процессе сопровождения информационных систем на базе 1С, особенно в таких сложных конфигурациях, как УПП (Управление производственным предприятием), разработчики часто сталкиваются с необходимостью "реанимировать" уже завершенный бизнес-процесс. Причиной может быть ошибка пользователя, сбой в логике или необходимость повторного прохождения маршрута из-за изменившихся внешних условий. Однако простая попытка вызвать метод Старт() для объекта, у которого установлен признак завершения, приводит к системной ошибке: "Бизнес-процесс уже завершен".
В этой статье мы подробно разберем, какие действия необходимо предпринять, чтобы корректно вернуть бизнес-процесс в работу, очистить его историю и запустить маршрут заново, избегая блокировок платформы.
Прежде чем приступать к написанию кода, проанализируем, как платформа 1С понимает, что бизнес-процесс завершен. За состояние процесса отвечают два ключевых системных реквизита: Завершен и Стартован. Если флаг Завершен установлен в значение Истина, платформа блокирует любые попытки изменения карты маршрута или генерации новых задач через стандартные методы. Поэтому нашей первоочередной задачей будет корректный сброс этих состояний.
Для того чтобы система позволила нам снова манипулировать бизнес-процессом, необходимо получить объект бизнес-процесса и изменить его статус. Простого изменения флагов в памяти недостаточно — изменения должны быть зафиксированы в базе данных. Рассмотрим пример кода, который подготавливает объект к перезапуску:
БПОбъект = СсылкаНаБП.ПолучитьОбъект();
// Снимаем признаки, блокирующие работу
БПОбъект.Завершен = Ложь;
БПОбъект.Стартован = Ложь;
Обратите внимание, что в некоторых случаях (особенно при наличии жестких проверок в модуле объекта) платформа может препятствовать записи "завершенного" объекта. Чтобы обойти прикладные проверки, разберем использование специального режима.
Выясним причину, почему иногда метод Записать() может не срабатывать. В профессиональной разработке для обхода проверок в процедурах ПередЗаписью или ПриЗаписи используется свойство ОбменДанными.Загрузка. Это критически важно, если логика конфигурации запрещает редактирование закрытых процессов.
БПОбъект.ОбменДанными.Загрузка = Истина;
БПОбъект.Записать();
Проанализируем ситуацию глубже: помимо флагов, бизнес-процесс хранит ДатаНачала и ДатаЗавершения. Если вы оставите ДатаЗавершения заполненной, это может привести к некорректному поведению аналитических отчетов или даже к ошибкам логики маршрута. Перед повторным стартом эти поля рекомендуется обнулить.
БПОбъект.ДатаНачала = '00010101000000'; // Пустая дата
БПОбъект.ДатаЗавершения = '00010101000000';
БПОбъект.Записать();
Рассмотрим ситуацию с задачами. При завершении бизнес-процесса все его задачи обычно имеют статус Выполнена = Истина. Если мы просто перезапустим процесс, старые задачи останутся в системе, что создаст путаницу в списках исполнителей. У нас есть два пути:
Выполнена = Ложь. Это позволит "откатить" процесс к определенному этапу, но требует ювелирной точности в работе с точками маршрута.Для полной очистки используем следующий подход:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Задача.ЗадачиПользователя ГДЕ БизнесПроцесс = &БП";
Запрос.УстановитьПараметр("БП", БПОбъект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗадачаОбъект = Выборка.Ссылка.ПолучитьОбъект();
ЗадачаОбъект.Удалить(); // Или УстановитьПометкуУдаления(Истина)
КонецЦикла;
Теперь, когда объект очищен и записан, мы можем вызвать метод Старт(). Важно помнить, что если в карте маршрута предусмотрено несколько точек старта, их нужно указать явно. В противном случае процесс начнется с основной точки, определенной в схеме.
Рассмотрим пример стандартного старта:
БПОбъект.Старт();
И вариант старта из конкретной точки маршрута (например, если нужно пропустить вводные этапы):
ТочкаМаршрута = БизнесПроцессы.ВашБизнесПроцесс.ТочкиМаршрута.НужныйЭтап;
БПОбъект.Старт(ТочкаМаршрута);
Несмотря на техническую возможность перезапуска, важно понимать последствия. Повторный старт процесса "затирает" историю KPI и реальные сроки выполнения задач. Рассмотрим альтернативный вариант: создание нового экземпляра бизнес-процесса путем копирования реквизитов из старого. Это сохранит историю первого (ошибочного) прохождения для аудита и позволит начать работу с "чистого листа".
Резюмируем последовательность действий для успешного перезапуска:
ПолучитьОбъект().Завершен и Стартован в Ложь.ДатаНачала и ДатаЗавершения.ОбменДанными.Загрузка = Истина и записываем объект.Старт().Следуя этой инструкции, вы сможете программно управлять жизненным циклом бизнес-процессов в 1С, обеспечивая гибкость системы при возникновении нестандартных ситуаций.