При работе с системой 1С:Предприятие часто возникает необходимость автоматизировать различные бизнес-процессы. Одним из ключевых элементов таких процессов являются задачи, которые ставятся конкретным исполнителям для выполнения определенных действий. Стандартные механизмы создания задач бизнес-процессами автоматически заполняют базовые реквизиты, такие как наименование, ссылка на бизнес-процесс, точка маршрута и реквизиты адресации. Однако на практике нам часто требуется заполнять дополнительные, специфические или даже обязательные реквизиты задачи на основании данных бизнес-процесса или других объектов. В таких ситуациях стандартного функционала может быть недостаточно, и мы сталкиваемся с проблемой, когда задачи создаются, но критически важные поля остаются пустыми, требуя ручного заполнения.
Рассмотрим типовую ситуацию. Вы разработали бизнес-процесс, например, "Перезвонить контрагенту", который по определенному условию создает задачу менеджеру. В этой задаче нам необходимо, чтобы автоматически заполнялись такие реквизиты, как "ДокументОснование", "Контрагент", "РезультатДатаСледующегоКонтакта" и "КонтактныеЛицаКонтрагентов". Эти реквизиты могут быть обязательными для последующей обработки или важны для удобства работы пользователя, предоставляя ему всю необходимую информацию с первого взгляда. Однако по умолчанию система 1С заполняет лишь стандартный набор полей. Если эти дополнительные реквизиты являются обязательными, то задача может быть записана с незаполненными полями, что приведет к ошибкам валидации или необходимости последующего ручного дозаполнения, что снижает эффективность работы.
Изначально, сталкиваясь с такой проблемой, разработчик может искать предопределенные события, похожие на "ПриСозданииЗадачи" или "ЗаписатьНовуюЗадачу", которые позволят перехватить момент создания объекта и программно заполнить нужные поля. Именно такую цель ставит перед нами автор исходного сообщения.
Оптимальным и наиболее правильным подходом для решения этой задачи является использование обработчика события ПриСозданииЗадач, который находится в модуле объекта нашего бизнес-процесса или модуля менеджера бизнес-процесса. Это событие вызывается платформой в тот момент, когда бизнес-процесс формирует задачи, но до того, как они будут записаны в базу данных. Таким образом, мы получаем возможность вмешаться в процесс создания и скорректировать формируемые задачи.
Разберем по шагам, как мы можем реализовать это решение:
ПриСозданииЗадач. Имя процедуры будет иметь вид <ИмяБизнесПроцесса>ПриСозданииЗадач. Например, если наш бизнес-процесс называется "ПерезвонитьКонтрагенту", процедура будет называться ПерезвонитьКонтрагентуПриСозданииЗадач.
ТочкаМаршрутаБизнесПроцесса: Ссылка на точку маршрута бизнес-процесса, на которой формируются задачи. Это может быть полезно, если нам нужно по-разному заполнять задачи для разных точек маршрута.
ФормируемыеЗадачи: Это массив задач, которые были сформированы бизнес-процессом на текущей точке маршрута. Важно отметить, что эти задачи еще не записаны в базу данных, и мы можем свободно изменять их реквизиты.
Отказ: Булево значение. Установка его в Истина приведет к отмене стандартного создания задач. В нашем случае мы не будем его использовать, так как нам нужно дополнить, а не отменить создание.
ФормируемыеЗадачи представляет собой массив, мы можем пройтись по нему циклом и получить доступ к каждой отдельной задаче, которую собирается создать бизнес-процесс.
Посмотрим на пример кода, который был предложен в исходном обсуждении, он наглядно демонстрирует данный подход:
Процедура ПерезвонитьКонтрагентуПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
Для Каждого НоваяЗадача Из ФормируемыеЗадачи Цикл
НоваяЗадача.ДокументОснование = НоваяЗадача.БизнесПроцесс.ДокументОснование;
НоваяЗадача.Контрагент = НоваяЗадача.БизнесПроцесс.Контрагент;
НоваяЗадача.РезультатДатаСледующегоКонтакта = НоваяЗадача.БизнесПроцесс.РезультатДатаСледующегоКонтакта;
НоваяЗадача.КонтактныеЛицаКонтрагентов = НоваяЗадача.БизнесПроцесс.КонтактныеЛицаКонтрагентов;
КонецЦикла;
КонецПроцедуры
Как мы видим из примера, мы перебираем каждую НоваяЗадача из массива ФормируемыеЗадачи и присваиваем её реквизитам значения из соответствующих реквизитов экземпляра бизнес-процесса (НоваяЗадача.БизнесПроцесс). Это работает потому, что на данном этапе задачи еще не записаны, и мы можем их свободно модифицировать. После завершения процедуры ПриСозданииЗадач, платформа сама выполнит запись задач уже с обновленными нами реквизитами, пройдя все необходимые контроли заполнения.
Такой подход оказывается очень эффективным. Например, в предложенной на форуме реализации, менеджеры по продажам получают задачи, в которых с первого взгляда видны все ключевые детали (документ-основание, контрагент, дата следующего контакта), что позволяет им эффективно планировать свой день. Кроме того, такая логика может быть частью более сложного цикла продаж, где после выполнения задачи звонка создается новое "событие", которое, в свою очередь, запускает новый бизнес-процесс "ПерезвонитьКонтрагенту" с уже заполненными данными, замыкая цикл взаимодействия с клиентом до тех пор, пока сделка не будет завершена или не станет неактуальной.
Помимо основного события ПриСозданииЗадач, в системе 1С:Предприятие существуют и другие механизмы, которые мы можем использовать для более гибкой настройки создания и заполнения задач:
ПередСозданиемЗадач в модуле бизнес-процесса:
Эта предопределенная процедура также находится в модуле объекта бизнес-процесса. Она вызывается *перед* стандартным формированием задач. Мы можем использовать ее для полного переопределения стандартного механизма создания задач. Если в этом обработчике мы установим параметр СтандартнаяОбработка = Ложь, то платформа не будет создавать задачи по умолчанию. Вместо этого мы можем программно создать свой собственный набор задач, используя метод Создать() для объекта "Задача" и заполняя их реквизиты, а затем записать их. При этом можно создавать как одну, так и несколько задач, независимо от признака "Групповая", установленного в свойствах точки маршрута. Если же мы не установим СтандартнаяОбработка = Ложь, но при этом сформируем свой массив задач, то он будет очищен, и система все равно создаст задачи по умолчанию.
ОбработкаЗаполнения в модуле объекта задачи:
Это предопределенная процедура, присущая любому объекту конфигурации, включая "Задача". Она вызывается при создании нового объекта (задачи) и может использоваться для заполнения его реквизитов на основании другого объекта конфигурации (например, документа или справочника). Если нам нужно заполнять реквизиты задачи на основании какого-либо "объекта-основания", переданного в метод СоздатьНаОсновании(), то ОбработкаЗаполнения будет подходящим местом. Для упрощения разработки такого алгоритма можно воспользоваться конструктором ввода на основании. Однако для случая, когда источником данных является сам бизнес-процесс, событие ПриСозданииЗадач в модуле бизнес-процесса обычно более удобно, так как предоставляет доступ ко всем формируемым задачам сразу.
ПриУстановкеНовогоНомера, ПриКопировании, ПередЗаписью, ПриЗаписи, ПередУдалением. Эти события позволяют нам реагировать на различные этапы жизненного цикла самого объекта "Задача". Например, ПриЗаписи или ПередЗаписью могут быть использованы для дополнительной валидации или выполнения действий после или перед записью задачи, но они не предназначены для первичного заполнения реквизитов, порождаемых бизнес-процессом. Для такой цели ПриСозданииЗадач или ПередСозданиемЗадач в модуле бизнес-процесса более подходят.
ПриСозданииЗадач в модуле бизнес-процесса.
Важным аспектом при работе с задачами является их адресация, то есть определение исполнителя. В 1С:Предприятие для этого используется вспомогательный регистр сведений, называемый регистром адресации. Измерения этого регистра должны быть такими значениями, по которым мы можем однозначно определить исполнителя задачи. Часто одним из измерений выступает справочник "Пользователи". При создании задач бизнес-процессом, реквизиты адресации задачи (например, "Исполнитель", "РольИсполнителя") заполняются автоматически на основании реквизитов адресации соответствующей точки маршрута. Если точка маршрута адресована роли "Кассир", то и в реквизит адресации задачи "Роль" будет установлено значение "Кассир".
При программном заполнении реквизитов задач в событии ПриСозданииЗадач мы также можем влиять на реквизиты, связанные с адресацией, если это требуется по нашей бизнес-логике. Например, если в бизнес-процессе мы динамически определяем исполнителя и сохраняем его в реквизит бизнес-процесса, то можем перенести это значение в соответствующий реквизит задачи.
Для повышения удобства и функциональности работы с задачами мы можем рассмотреть следующие дополнительные возможности:
ОбзорЗадачВызовСервераПереопределяемый и ОбзорЗадачКлиентПереопределяемый. Мы можем реализовать в них свою логику для формирования HTML-кода.
Старт() у экземпляра бизнес-процесса. Также существуют сценарии, когда процесс объекта может запускаться автоматически в момент создания самого объекта. Понимание этих механизмов позволяет нам точно контролировать момент запуска нашего бизнес-процесса и, следовательно, момент создания задач.
В заключение, проблема автоматического заполнения специфических реквизитов задач, создаваемых бизнес-процессом, успешно решается при помощи обработчика события ПриСозданииЗадач в модуле объекта бизнес-процесса. Этот механизм предоставляет нам необходимую точку входа для модификации задач до их окончательной записи, обеспечивая гибкость и соответствие бизнес-логике. Комбинируя этот подход с другими возможностями платформы 1С, такими как события модуля объекта задачи, обработчики точек маршрута и механизмы HTML-описания, мы можем создавать высокоэффективные и удобные для пользователей бизнес-процессы.