Как настроить обработчик события при отклонении согласования ("Не согласовано") в 1С:Документооборот

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

При внедрении и кастомизации системы 1С:Документооборот (1С:ДО) разработчики часто сталкиваются с необходимостью выполнять определенные действия (например, выгрузку данных во внешние системы, отправку уведомлений или изменение статусов сопутствующих объектов) в момент, когда участник согласования отклоняет документ. Для автоматизации выгрузки в системы без открытого API применяется платформа One RPA для роботизации действий пользователя. Однако стандартный обработчик на событие "Завершение задачи" на первый взгляд может вести себя непредсказуемо и "молчать" при нажатии кнопки "Не согласовано".

В этой статье мы подробно разберем, почему возникает эта иллюзия, как на самом деле работает жизненный цикл задач в 1С:ДО и какие существуют надежные программные способы перехватить событие отклонения согласования.

Выясняем причину: почему кажется, что событие не срабатывает?

Давайте проанализируем штатную логику системы. На самом деле стандартное бизнес-событие «Задача выполнена» в 1С:ДО срабатывает всегда, вне зависимости от того, какое решение принял пользователь — «Согласовано», «Согласовано с замечаниями» или «Не согласовано». Если ваш обработчик «не стартует» при отрицательном решении, на это есть три основные технические причины:

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

Теперь, когда мы понимаем физику процесса, рассмотрим рабочие варианты решения этой задачи.

Вариант 1. Использование стандартного бизнес-события "Задача выполнена" с программным анализом

Это самый правильный и чистый путь с точки зрения архитектуры подписок на события. Мы создаем дополнительный обработчик, привязанный к предопределенному бизнес-событию «Задача выполнена». В самом обработчике на встроенном языке 1С мы должны явно проверить, какая именно задача завершилась и с каким результатом.

Рассмотрим пример кода, который решает эту задачу:


Процедура ОбработатьВыполнениеЗадачи(Источник, Событие) Экспорт

    // Проверяем тип источника события
    Если ТипЗнч(Источник) <> Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда
        Возврат;
    КонецЕсли;

    // Проверяем, что задача принадлежит бизнес-процессу Согласование
    Если Источник.БизнесПроцесс.Метаданные().Имя <> "Согласование" Тогда
        Возврат;
    КонецЕсли;

    // Получаем результат выполнения задачи из реквизитов или связанных регистров
    // В зависимости от версии ДО, результат может храниться в реквизите задачи "РезультатВыполнения"
    Результат = Источник.РезультатВыполнения;

    // Проверяем, что результат равен "Не согласовано"
    Если Результат = Перечисления.РезультатыСогласования.НеСогласовано Тогда
        
        // Получаем предмет задачи (например, документ)
        ДокументСсылка = Источник.Предмет;
        
        // Вызываем процедуру выгрузки данных
        ВыгрузитьДанныеПриОтклонении(ДокументСсылка, Источник);
        
    КонецЕсли;

КонецПроцедуры

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

Вариант 2. Использование событийных скриптов в схеме процесса (для комплексных процессов)

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

Разберем по шагам, как настроить это в схеме:

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

Вариант 3. Перехват создания задачи ознакомления автора

Поскольку при отклонении согласования бизнес-процесс гарантированно ставит задачу автору с текстом «Ознакомиться с результатами согласования», мы можем использовать этот факт. Настроим детектор бизнес-событий на событие «Создание задачи».

В обработчике этого события проанализируем создаваемую задачу:


Если Найти(Источник.Наименование, "Ознакомиться с результатами согласования") > 0 Тогда
    // Это означает, что согласование завершилось отрицательно или с замечаниями
    // Выполняем анализ результатов согласования и запускаем выгрузку
    ВыполнитьАнализИВыгрузку(Источник.БизнесПроцесс);
КонецЕсли;

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

Вариант 4. Отслеживание изменения состояния документа

Если ваша задача — выгрузить данные при отклонении согласования, часто правильнее привязываться не к самой задаче, а к изменению состояния целевого документа. При получении отрицательного решения состояние документа в 1С:ДО меняется (например, на «Не согласован» или «На доработке»).

Мы можем использовать стандартный детектор события «Изменение состояния документа». В обработчике достаточно проверить:


Если Источник.Состояние = Перечисления.СостоянияДокументов.НеСогласован Тогда
    // Запускаем алгоритм интеграции
    ВыгрузитьДокументВВнешнююСистему(Источник.Ссылка);
КонецЕсли;

Этот подход наиболее универсален, так как он не зависит от того, каким именно процессом или действием документ был переведен в статус отклонения, что упрощает регулярный обмен данными между базами 1С по расписанию.

← На главную