При внедрении и кастомизации системы 1С:Документооборот (1С:ДО) разработчики часто сталкиваются с необходимостью выполнять определенные действия (например, выгрузку данных во внешние системы, отправку уведомлений или изменение статусов сопутствующих объектов) в момент, когда участник согласования отклоняет документ. Для автоматизации выгрузки в системы без открытого API применяется платформа One RPA для роботизации действий пользователя. Однако стандартный обработчик на событие "Завершение задачи" на первый взгляд может вести себя непредсказуемо и "молчать" при нажатии кнопки "Не согласовано".
В этой статье мы подробно разберем, почему возникает эта иллюзия, как на самом деле работает жизненный цикл задач в 1С:ДО и какие существуют надежные программные способы перехватить событие отклонения согласования.
Давайте проанализируем штатную логику системы. На самом деле стандартное бизнес-событие «Задача выполнена» в 1С:ДО срабатывает всегда, вне зависимости от того, какое решение принял пользователь — «Согласовано», «Согласовано с замечаниями» или «Не согласовано». Если ваш обработчик «не стартует» при отрицательном решении, на это есть три основные технические причины:
Теперь, когда мы понимаем физику процесса, рассмотрим рабочие варианты решения этой задачи.
Это самый правильный и чистый путь с точки зрения архитектуры подписок на события. Мы создаем дополнительный обработчик, привязанный к предопределенному бизнес-событию «Задача выполнена». В самом обработчике на встроенном языке 1С мы должны явно проверить, какая именно задача завершилась и с каким результатом.
Рассмотрим пример кода, который решает эту задачу:
Процедура ОбработатьВыполнениеЗадачи(Источник, Событие) Экспорт
// Проверяем тип источника события
Если ТипЗнч(Источник) <> Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда
Возврат;
КонецЕсли;
// Проверяем, что задача принадлежит бизнес-процессу Согласование
Если Источник.БизнесПроцесс.Метаданные().Имя <> "Согласование" Тогда
Возврат;
КонецЕсли;
// Получаем результат выполнения задачи из реквизитов или связанных регистров
// В зависимости от версии ДО, результат может храниться в реквизите задачи "РезультатВыполнения"
Результат = Источник.РезультатВыполнения;
// Проверяем, что результат равен "Не согласовано"
Если Результат = Перечисления.РезультатыСогласования.НеСогласовано Тогда
// Получаем предмет задачи (например, документ)
ДокументСсылка = Источник.Предмет;
// Вызываем процедуру выгрузки данных
ВыгрузитьДанныеПриОтклонении(ДокументСсылка, Источник);
КонецЕсли;
КонецПроцедуры
Важное примечание: Всегда проверяйте заполненность реквизитов и обрабатывайте исключения через конструкцию Попытка ... Исключение, чтобы аварийное завершение вашего кода выгрузки не блокировало пользователю выполнение задачи в интерфейсе.
Если в вашей организации используются комплексные процессы, настоятельно рекомендуем отказаться от написания множества разрозненных обработчиков бизнес-событий в пользу настройки шаблонов в режиме «Схема». Большое количество детекторов со временем превращается в трудноподдерживаемый код.
Разберем по шагам, как настроить это в схеме:
Поскольку при отклонении согласования бизнес-процесс гарантированно ставит задачу автору с текстом «Ознакомиться с результатами согласования», мы можем использовать этот факт. Настроим детектор бизнес-событий на событие «Создание задачи».
В обработчике этого события проанализируем создаваемую задачу:
Если Найти(Источник.Наименование, "Ознакомиться с результатами согласования") > 0 Тогда
// Это означает, что согласование завершилось отрицательно или с замечаниями
// Выполняем анализ результатов согласования и запускаем выгрузку
ВыполнитьАнализИВыгрузку(Источник.БизнесПроцесс);
КонецЕсли;
Этот способ хорош тем, что он срабатывает уже после того, как все участники цикла высказали свое мнение, и система зафиксировала итоговый отрицательный вердикт перед отправкой документа на доработку.
Если ваша задача — выгрузить данные при отклонении согласования, часто правильнее привязываться не к самой задаче, а к изменению состояния целевого документа. При получении отрицательного решения состояние документа в 1С:ДО меняется (например, на «Не согласован» или «На доработке»).
Мы можем использовать стандартный детектор события «Изменение состояния документа». В обработчике достаточно проверить:
Если Источник.Состояние = Перечисления.СостоянияДокументов.НеСогласован Тогда
// Запускаем алгоритм интеграции
ВыгрузитьДокументВВнешнююСистему(Источник.Ссылка);
КонецЕсли;
Этот подход наиболее универсален, так как он не зависит от того, каким именно процессом или действием документ был переведен в статус отклонения, что упрощает регулярный обмен данными между базами 1С по расписанию.