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