Как отменить ошибочное завершение согласования и отправить документ на повторный круг в 1С:Документооборот?

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

В типовой конфигурации 1С:Документооборот бизнес-процесс Согласование спроектирован так, что при наличии хотя бы одной отрицательной визы («Не согласовано» или «Согласовано с замечаниями») управление возвращается инициатору. Автору формируется задача «Ознакомиться с результатами согласования», в которой доступны два ключевых действия:

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

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

Способ 1. Запуск нового процесса согласования (рекомендуемый штатный путь)

С точки зрения методологии документооборота и корректности ведения регистров системы самым надежным и простым решением является создание нового процесса согласования.

Проанализируем преимущества этого подхода:

  1. Сохранение юридической истории: вся предыдущая переписка, протокол замечаний, отрицательные визы участников и факт прекращения первого этапа остаются в истории документа и корректно выводятся в отчете «Лист согласования».
  2. Целостность регистров: в конфигурации задействовано множество вспомогательных механизмов (регистры сведений СостоянияДокументов, ИсторияСостоянийДокументов, очереди маршрутизации и дескрипторы прав доступа). Ручное вмешательство в завершенные цепочки может привести к рассинхронизации данных.
  3. Минимум трудозатрат: не требуется привлечение программиста или администратора для написания сервисных обработок.

Для реализации этого способа выполним следующие шаги:

  1. Открываем карточку предмета (внутреннего, входящего или исходящего документа).
  2. На панели навигации или через меню «Отправить» выбираем команду «В процесс...».
  3. Выбираем процесс Согласование (по нужному шаблону или с ручным заполнением состава согласующих). При необходимости в списке участников можно оставить только тех сотрудников, чьи замечания требовали доработки.
  4. Стартуем процесс. Регистр СостоянияДокументов автоматически обновит статус предмета на «На согласовании».

Способ 2. Программное возобновление бизнес-процесса и задачи

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

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

Разберем алгоритм восстановления на примере программного кода:


// 1. Получаем объект завершенной задачи ознакомления
ЗадачаОбъект = СсылкаНаЗадачуОзнакомления.ПолучитьОбъект();
ЗадачаОбъект.Выполнена = Ложь;
ЗадачаОбъект.Состояние = Перечисления.СостоянияЗадач.ВРаботе;
ЗадачаОбъект.ДатаИсполнения = '00010101';
ЗадачаОбъект.Выполнил = Справочники.Пользователи.ПустаяСсылка();
ЗадачаОбъект.РезультатВыполнения = "";
ЗадачаОбъект.Записать();

// 2. Получаем объект бизнес-процесса согласования
БПОбъект = ЗадачаОбъект.БизнесПроцесс.ПолучитьОбъект();
БПОбъект.Завершен = Ложь;
БПОбъект.Состояние = Перечисления.СостоянияБизнесПроцессов.ВРаботе;
БПОбъект.Записать();

// 3. Актуализируем состояние предмета в регистре сведений
НаборЗаписей = РегистрыСведений.СостоянияДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Документ.Установить(БПОбъект.Предмет);
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Состояние = Перечисления.СостоянияДокументов.НаСогласовании;
КонецЦикла;
НаборЗаписей.Записать();

Рассмотрим подробнее логику работы этого кода:

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

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

Способ 3. Предотвращение ошибок интерфейсными доработками

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

  1. Диалог подтверждения действия: при нажатии кнопки «Завершить согласование» в задаче ознакомления с отрицательным результатом вызывать предупреждение: «Документ не был согласован всеми участниками. Вы действительно хотите окончательно завершить процесс без отправки на повторный круг?».
  2. Разграничение прав: скрывать или блокировать кнопку завершения несогласованного процесса для рядовых инициаторов, оставляя право окончательного закрытия отрицательного согласования только за администраторами или ведущими делопроизводителями.
← На главную