Как программно заполнить реквизиты задач, создаваемых бизнес-процессом в 1С?

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

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

Понимание проблемы: автоматическое создание задач и незаполненные реквизиты

Рассмотрим типовую ситуацию. Вы разработали бизнес-процесс, например, "Перезвонить контрагенту", который по определенному условию создает задачу менеджеру. В этой задаче нам необходимо, чтобы автоматически заполнялись такие реквизиты, как "ДокументОснование", "Контрагент", "РезультатДатаСледующегоКонтакта" и "КонтактныеЛицаКонтрагентов". Эти реквизиты могут быть обязательными для последующей обработки или важны для удобства работы пользователя, предоставляя ему всю необходимую информацию с первого взгляда. Однако по умолчанию система 1С заполняет лишь стандартный набор полей. Если эти дополнительные реквизиты являются обязательными, то задача может быть записана с незаполненными полями, что приведет к ошибкам валидации или необходимости последующего ручного дозаполнения, что снижает эффективность работы.

Изначально, сталкиваясь с такой проблемой, разработчик может искать предопределенные события, похожие на "ПриСозданииЗадачи" или "ЗаписатьНовуюЗадачу", которые позволят перехватить момент создания объекта и программно заполнить нужные поля. Именно такую цель ставит перед нами автор исходного сообщения.

Решение: используем событие ПриСозданииЗадач в модуле бизнес-процесса

Оптимальным и наиболее правильным подходом для решения этой задачи является использование обработчика события ПриСозданииЗадач, который находится в модуле объекта нашего бизнес-процесса или модуля менеджера бизнес-процесса. Это событие вызывается платформой в тот момент, когда бизнес-процесс формирует задачи, но до того, как они будут записаны в базу данных. Таким образом, мы получаем возможность вмешаться в процесс создания и скорректировать формируемые задачи.

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

  1. Найдем модуль объекта бизнес-процесса: Откроем конфигуратор, найдем объект конфигурации "Бизнес-процесс" (например, "ПерезвонитьКонтрагенту") и перейдем в его модуль объекта.
  2. Создадим или найдем процедуру-обработчик: В модуле объекта бизнес-процесса мы должны найти или создать процедуру с именем, соответствующим обработчику события ПриСозданииЗадач. Имя процедуры будет иметь вид <ИмяБизнесПроцесса>ПриСозданииЗадач. Например, если наш бизнес-процесс называется "ПерезвонитьКонтрагенту", процедура будет называться ПерезвонитьКонтрагентуПриСозданииЗадач.
  3. Познакомимся с параметрами процедуры: Эта процедура принимает три основных параметра:
    • ТочкаМаршрутаБизнесПроцесса: Ссылка на точку маршрута бизнес-процесса, на которой формируются задачи. Это может быть полезно, если нам нужно по-разному заполнять задачи для разных точек маршрута.
    • ФормируемыеЗадачи: Это массив задач, которые были сформированы бизнес-процессом на текущей точке маршрута. Важно отметить, что эти задачи еще не записаны в базу данных, и мы можем свободно изменять их реквизиты.
    • Отказ: Булево значение. Установка его в Истина приведет к отмене стандартного создания задач. В нашем случае мы не будем его использовать, так как нам нужно дополнить, а не отменить создание.
  4. Переберем массив формируемых задач: Поскольку параметр ФормируемыеЗадачи представляет собой массив, мы можем пройтись по нему циклом и получить доступ к каждой отдельной задаче, которую собирается создать бизнес-процесс.
  5. Заполним необходимые реквизиты: Внутри цикла для каждой "новой" задачи мы можем обратиться к её реквизитам и присвоить им нужные значения. Эти значения мы можем брать из реквизитов самого бизнес-процесса, как в примере, или из любых других доступных данных.

Посмотрим на пример кода, который был предложен в исходном обсуждении, он наглядно демонстрирует данный подход:


Процедура ПерезвонитьКонтрагентуПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
    
    Для Каждого НоваяЗадача Из ФормируемыеЗадачи Цикл
        
        НоваяЗадача.ДокументОснование = НоваяЗадача.БизнесПроцесс.ДокументОснование;
        НоваяЗадача.Контрагент = НоваяЗадача.БизнесПроцесс.Контрагент;
        НоваяЗадача.РезультатДатаСледующегоКонтакта = НоваяЗадача.БизнесПроцесс.РезультатДатаСледующегоКонтакта;
        НоваяЗадача.КонтактныеЛицаКонтрагентов = НоваяЗадача.БизнесПроцесс.КонтактныеЛицаКонтрагентов;
        
    КонецЦикла;
    
КонецПроцедуры

Как мы видим из примера, мы перебираем каждую НоваяЗадача из массива ФормируемыеЗадачи и присваиваем её реквизитам значения из соответствующих реквизитов экземпляра бизнес-процесса (НоваяЗадача.БизнесПроцесс). Это работает потому, что на данном этапе задачи еще не записаны, и мы можем их свободно модифицировать. После завершения процедуры ПриСозданииЗадач, платформа сама выполнит запись задач уже с обновленными нами реквизитами, пройдя все необходимые контроли заполнения.

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

Дополнительные возможности для доработки создания задач

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

  1. Событие ПередСозданиемЗадач в модуле бизнес-процесса: Эта предопределенная процедура также находится в модуле объекта бизнес-процесса. Она вызывается *перед* стандартным формированием задач. Мы можем использовать ее для полного переопределения стандартного механизма создания задач. Если в этом обработчике мы установим параметр СтандартнаяОбработка = Ложь, то платформа не будет создавать задачи по умолчанию. Вместо этого мы можем программно создать свой собственный набор задач, используя метод Создать() для объекта "Задача" и заполняя их реквизиты, а затем записать их. При этом можно создавать как одну, так и несколько задач, независимо от признака "Групповая", установленного в свойствах точки маршрута. Если же мы не установим СтандартнаяОбработка = Ложь, но при этом сформируем свой массив задач, то он будет очищен, и система все равно создаст задачи по умолчанию.
  2. Процедура ОбработкаЗаполнения в модуле объекта задачи: Это предопределенная процедура, присущая любому объекту конфигурации, включая "Задача". Она вызывается при создании нового объекта (задачи) и может использоваться для заполнения его реквизитов на основании другого объекта конфигурации (например, документа или справочника). Если нам нужно заполнять реквизиты задачи на основании какого-либо "объекта-основания", переданного в метод СоздатьНаОсновании(), то ОбработкаЗаполнения будет подходящим местом. Для упрощения разработки такого алгоритма можно воспользоваться конструктором ввода на основании. Однако для случая, когда источником данных является сам бизнес-процесс, событие ПриСозданииЗадач в модуле бизнес-процесса обычно более удобно, так как предоставляет доступ ко всем формируемым задачам сразу.
  3. Другие события в модуле объекта задачи: Модуль объекта задачи предоставляет и другие предопределенные обработчики событий, такие как ПриУстановкеНовогоНомера, ПриКопировании, ПередЗаписью, ПриЗаписи, ПередУдалением. Эти события позволяют нам реагировать на различные этапы жизненного цикла самого объекта "Задача". Например, ПриЗаписи или ПередЗаписью могут быть использованы для дополнительной валидации или выполнения действий после или перед записью задачи, но они не предназначены для первичного заполнения реквизитов, порождаемых бизнес-процессом. Для такой цели ПриСозданииЗадач или ПередСозданиемЗадач в модуле бизнес-процесса более подходят.
  4. События точек маршрута бизнес-процесса: В свойствах каждой точки маршрута бизнес-процесса мы можем указывать свои собственные обработчики событий. Это дает нам возможность реализовать различную логику заполнения или других действий в зависимости от конкретной точки маршрута, на которой формируются задачи. Если у нас есть несколько точек маршрута, и каждая должна создавать задачи с уникальным заполнением, то использование обработчиков на уровне точек маршрута может быть более удобным, чем универсальный обработчик ПриСозданииЗадач в модуле бизнес-процесса.

Механизмы адресации задач

Важным аспектом при работе с задачами является их адресация, то есть определение исполнителя. В 1С:Предприятие для этого используется вспомогательный регистр сведений, называемый регистром адресации. Измерения этого регистра должны быть такими значениями, по которым мы можем однозначно определить исполнителя задачи. Часто одним из измерений выступает справочник "Пользователи". При создании задач бизнес-процессом, реквизиты адресации задачи (например, "Исполнитель", "РольИсполнителя") заполняются автоматически на основании реквизитов адресации соответствующей точки маршрута. Если точка маршрута адресована роли "Кассир", то и в реквизит адресации задачи "Роль" будет установлено значение "Кассир".

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

Расширенные возможности и рекомендации

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

  1. Переопределение HTML-описания задачи: В карточках задач предусмотрена специальная область для HTML-описания. Мы можем использовать эту область для вывода дополнительной, динамически формируемой информации, которая не является реквизитом задачи, но полезна для исполнителя. Например, в HTML-описание можно вывести сумму документа-основания, статус контрагента или другие актуальные данные. За формирование этого описания отвечают общие модули ОбзорЗадачВызовСервераПереопределяемый и ОбзорЗадачКлиентПереопределяемый. Мы можем реализовать в них свою логику для формирования HTML-кода.
  2. Фоновое выполнение бизнес-процессов и задач: Для повышения отзывчивости конфигурации, особенно в нагруженных системах, рекомендуется использовать механизмы фонового выполнения. Это может быть фоновый старт бизнес-процессов (когда сам процесс запускается не интерактивно, а в фоновом задании) или фоновое выполнение определенных действий в рамках задач. Это позволяет избежать блокировки пользовательского интерфейса во время выполнения длительных операций.
  3. Детекторы бизнес-событий: Эти механизмы позволяют нам выполнять определенный код при наступлении конкретных событий, которые не обязательно связаны с записью объектов в базу данных. Детекторы расширяют возможности автоматизации бизнес-процессов, позволяя реагировать на более широкий спектр условий без глубокого вмешательства в типовую конфигурацию. Например, можно реагировать на изменение статуса документа или появление нового файла.
  4. Старт бизнес-процесса: Напомним, что бизнес-процесс может стартовать как интерактивно (например, нажатием кнопки "Стартовать и закрыть" в форме объекта), так и программно, через вызов метода Старт() у экземпляра бизнес-процесса. Также существуют сценарии, когда процесс объекта может запускаться автоматически в момент создания самого объекта. Понимание этих механизмов позволяет нам точно контролировать момент запуска нашего бизнес-процесса и, следовательно, момент создания задач.

В заключение, проблема автоматического заполнения специфических реквизитов задач, создаваемых бизнес-процессом, успешно решается при помощи обработчика события ПриСозданииЗадач в модуле объекта бизнес-процесса. Этот механизм предоставляет нам необходимую точку входа для модификации задач до их окончательной записи, обеспечивая гибкость и соответствие бизнес-логике. Комбинируя этот подход с другими возможностями платформы 1С, такими как события модуля объекта задачи, обработчики точек маршрута и механизмы HTML-описания, мы можем создавать высокоэффективные и удобные для пользователей бизнес-процессы.

← На главную