Как в 1С назначить одну задачу нескольким исполнителям и отправлять уведомления при выполнении каждой из них?

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

В процессе разработки бизнес-процессов в среде «1С:Предприятие 8.3» часто возникает задача распределения одной и той же задачи между несколькими исполнителями. Типичный сценарий: документ должен быть обработан всеми сотрудниками определенного отдела (например, канцелярии), и при завершении работы каждым сотрудником система должна мгновенно отправлять email-уведомление инициатору процесса или другим заинтересованным лицам.

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

Постановка задачи и анализ ограничений

Рассмотрим исходную ситуацию: на определенной точке маршрута бизнес-процесса необходимо сформировать задачи для нескольких пользователей (из группы «Канцелярия»). Нам требуется:

  1. Создать задачу для каждого участника этой группы.
  2. Обеспечить отправку электронного письма сразу же после того, как конкретный исполнитель нажмет кнопку «Выполнено».
  3. Сделать это без доработки общего модуля УниверсальнаяЗадача, поскольку он используется в десятках других бизнес-процессов конфигурации и его изменение крайне нежелательно.

Давайте пошагово разберем, как элегантно решить эту задачу с помощью штатных механизмов платформы 1С.

Почему ручная генерация задач (в цикле) — это плохая практика?

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


Для каждого Элемент из Журнал Цикл 
    НоваяЗадача = Задачи.УниверсальнаяЗадача.СоздатьЗадачу; 
    НоваяЗадача.БизнесПроцесс = ЭтотОбъект.Ссылка; 
    НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.ЖурналПередачиДокументов.ТочкиМаршрута.ПолучениеДокумента; 
    НоваяЗадача.Дата = ТекущаяДата; 
    НоваяЗадача.Наименование = БизнесПроцессы.ЖурналПередачиДокументов.ТочкиМаршрута.ПолучениеДокумента.НаименованиеЗадачи; 
    НоваяЗадача.Исполнитель = Элемент.ФИОполучателя; 
    НоваяЗадача.СрокВыполненияЗадачи = НоваяЗадача.Дата + 86400; 
    НоваяЗадача.Описание = ПолучитьПредставлениеПредмета; 
    ФормируемыеЗадачи.Добавить(НоваяЗадача); 
    НоваяЗадача.Записать; 
КонецЦикла;

Давайте проанализируем, к каким критическим последствиям ведет такой подход:

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

Правильное решение: Использовать стандартное свойство точки маршрута бизнес-процесса — Групповая задача. Нам достаточно указать в свойствах точки маршрута признак групповой задачи, и платформа 1С самостоятельно создаст по одному экземпляру задачи для каждого члена группы адресации, избавив нас от написания сложного программного кода генерации.

Решение проблемы: Как отправить email без изменения общего модуля задачи?

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

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

Способ А. Использование события «ПриВыполненииЗадачи» в модуле бизнес-процесса

Это самый простой и лаконичный способ. У любого объекта бизнес-процесса в 1С есть стандартный предопределенный обработчик событий — ПриВыполненииЗадачи(Задача, Отказ). Он располагается в модуле самого бизнес-процесса, который вы разрабатываете (в нашем случае — ЖурналПередачиДокументов).

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


Процедура ПриВыполненииЗадачи(Задача, Отказ)
    
    // Проверяем, что выполняется именно нужная нам точка маршрута
    Если Задача.ТочкаМаршрута = БизнесПроцессы.ЖурналПередачиДокументов.ТочкиМаршрута.ПолучениеДокумента Тогда
        
        // Формируем параметры и отправляем письмо для конкретного исполнителя
        АдресПолучателя = ПолучитьEmailПользователя(Задача.Исполнитель);
        ТемаПисьма = "Выполнена задача: " + Задача.Наименование;
        ТекстПисьма = СтрШаблон("Исполнитель %1 завершил задачу. Описание: %2", Задача.Исполнитель, Задача.Описание);
        
        Попытка
            ОтправитьУведомлениеНаПочту(АдресПолучателя, ТемаПисьма, ТекстПисьма);
        Исключение
            ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        КонецПопытки;
        
    КонецЕсли;
    
КонецПроцедуры

Преимущества: Логика полностью локализована внутри вашего бизнес-процесса. Никакие внешние модули других процессов или задач не затрагиваются. Код отрабатывает мгновенно в транзакции выполнения конкретной задачи.

Способ Б. Использование подписок на события (Event Subscriptions)

Если вам требуется максимально изолировать логику отправки уведомлений от логики самого бизнес-процесса (например, для упрощения последующих обновлений конфигурации), используйте механизм Подписок на события.

Разберем реализацию этого способа по шагам:

  1. Создайте в конфигураторе новый общий модуль, например, УведомленияСобытияСервер. Установите для него свойства Сервер и Вызов сервера.
  2. Создайте новый объект метаданных Подписка на событие со следующими свойствами:
    • Источник: ЗадачаОбъект.УниверсальнаяЗадача
    • Событие: ПередЗаписью (или ПриЗаписи)
    • Обработчик: выберите созданную процедуру в вашем общем модуле.
  3. Напишите следующий код в обработчике подписки:

Процедура ПередЗаписьюЗадачиОбработчик(Источник, Отказ, Замещение) Экспорт
    
    // Нам нужно определить, что задача была выполнена именно в этот момент записи
    // Для этого сравниваем текущий статус "Выполнена" со значением в базе данных
    Если Источник.Выполнена И НЕ Источник.Ссылка.Выполнена Тогда
        
        // Проверяем, относится ли задача к нашему бизнес-процессу
        Если ТипЗнч(Источник.БизнесПроцесс) = Тип("БизнесПроцессСсылка.ЖурналПередачиДокументов") Тогда
            
            // Получаем данные для отправки уведомления
            ИсполнительЗадачи = Источник.Исполнитель;
            НаименованиеЗадачи = Источник.Наименование;
            
            // Вызываем процедуру отправки почты
            ОтправитьПисьмоИсполнителю(ИсполнительЗадачи, НаименованиеЗадачи);
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Важная деталь: Конструкция Источник.Выполнена И НЕ Источник.Ссылка.Выполнена позволяет однозначно определить, что задача переводится в состояние выполнения именно при текущей транзакции записи (а не просто перезаписывается уже выполненная ранее задача).

Способ В. Расширения конфигурации

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

  1. Добавьте задачу УниверсальнаяЗадача в ваше расширение конфигурации.
  2. В модуле объекта задачи в расширении создайте перехватчик метода ПередВыполнением или ПриВыполнении с аннотацией &После.
  3. Внутри перехватчика напишите аналогичную проверку типа бизнес-процесса и процедуру отправки письма.

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

Резюме

При проектировании систем с бизнес-процессами в 1С всегда старайтесь придерживаться штатных механизмов платформы. Избегайте ручной генерации задач программным кодом там, где можно обойтись стандартной настройкой Групповая задача на карте маршрута.

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

← На главную