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

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

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

Доступ к источнику события и его параметрам

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

  1. Получение объекта-источника: В коде обработчика события вы всегда будете иметь доступ к параметру Событие. Через этот параметр мы можем обратиться к свойству Событие.Источник. Это свойство возвращает объект, который непосредственно вызвал событие. Например, если событие срабатывает при выполнении задачи, то Событие.Источник будет ссылаться на объект "Задача исполнителя".

  2. Получение ссылки на источник: Если нам нужна не сам объект, а его ссылка (например, для передачи в другие функции или для записи в регистры), мы можем использовать свойство Ссылка у полученного объекта: Событие.Источник.Ссылка. Таким образом, мы получаем уникальный идентификатор объекта в базе данных.

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

Рассмотрим пример:


// В обработчике события, например, при выполнении задачи
ПеременнаяИсточник = Событие.Источник; // Получаем объект "Задача исполнителя"
СсылкаНаИсточника = ПеременнаяИсточник.Ссылка; // Получаем ссылку на объект задачи

// Если нам нужны предметы задачи
Если ТипЗнч(ПеременнаяИсточник) = Тип("ЗадачаОбъект.ЗадачаИсполнителю") Тогда
    Для Каждого Предмет Из ПеременнаяИсточник.Предметы Цикл
        // Работаем с предметами задачи
        Сообщить("Предмет задачи: " + Предмет.Наименование);
    КонецЦикла;
КонецЕсли;

Закрытие задачи и автоматический запуск следующей

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

  1. Выполнение задачи: Для того чтобы закрыть задачу, то есть установить ее статус "Выполнена", нам необходимо сначала получить объект задачи, с которым можно работать. Это делается с помощью метода ПолучитьОбъект():

    
    ЗадачаОбъект = Событие.Источник.ПолучитьОбъект();
    ЗадачаОбъект.ВыполнитьЗадачу();
    

    После вызова метода ВыполнитьЗадачу() задача будет отмечена как выполненная в системе.

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

Выход на процесс, создавший задачу, и связь документов

Часто возникает необходимость связать конкретную задачу не только с документом, который является ее предметом, но и с бизнес-процессом, который эту задачу породил. Это позволяет выстроить полную цепочку взаимодействий.

  1. Ссылка на бизнес-процесс из задачи: Объект метаданных "ЗадачиИсполнителю" имеет стандартный реквизит БизнесПроцесс. Этот реквизит ссылается именно на экземпляр бизнес-процесса, который создал текущую задачу. Таким образом, если у нас есть объект задачи, мы можем получить доступ к родительскому процессу:

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

    Обратите внимание, что в CRM-системах, как упоминалось в одном из сообщений, похожий механизм может выглядеть так: ТекущаяЗадача.БизнесПроцесс.Предмет. Это подтверждает, что доступ к процессу через задачу – это стандартный подход.

  2. Предметы процесса: У самого бизнес-процесса также есть предметы. Они играют ключевую роль в логике его работы. Различают:

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

    Доступ к предметам процесса осуществляется через свойство Предметы у объекта бизнес-процесса.

    
    БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект();
    Для Каждого ПредметПроцесса Из БизнесПроцессОбъект.Предметы Цикл
        Сообщить("Предмет процесса: " + ПредметПроцесса.Предмет.Наименование + 
                 " (Основной: " + ПредметПроцесса.Основной + ")");
    КонецЦикла;
    
  3. "Заполняемый предмет процесса": Для сценариев, когда новый (возможно, внешний) документ должен появиться в задаче у пользователя или быть назначен как предмет процесса, в 1С:Документооборот существует понятие "заполняемого предмета процесса". Это предмет, который исполнитель должен обязательно ввести или выбрать перед завершением задачи. Тип такого предмета указывается в настройках шаблона процесса, что упрощает выполнение задачи для исполнителя и обеспечивает корректную привязку документов. Это идеальный механизм для интеграции внешних систем, когда новый документ должен быть обработан существующим процессом.

  4. Создание задачи на основании предмета и привязка документов:

    • Через команду "Отправить – В работу": Задачу можно создать на основании существующего документа, файла, письма и т.д. Пользователь может выбрать нужный предмет и отправить его "В работу". При этом выбранный предмет будет автоматически прикреплен к новой задаче.
    • Как "приложения" к задаче: Вы также можете прикрепить документы в качестве "приложений" к уже созданной задаче. Это делается программно или через пользовательский интерфейс. В этом случае документ не является "предметом" задачи в строгом смысле, но доступен исполнителю.
    • Программное связывание: Если у вас есть ссылка на новый документ и ссылка на существующую задачу или процесс, вы можете программно добавить этот документ в качестве предмета или приложения. Например, чтобы добавить документ в предметы бизнес-процесса, мы можем получить объект процесса, добавить новый элемент в его табличную часть Предметы, указать ссылку на документ и тип предмета (основной/вспомогательный), а затем записать процесс.
  5. Запросы по процессам и предметам: Для того чтобы найти нужный бизнес-процесс, особенно если у предмета может быть несколько процессов, мы можем выполнять запросы к бизнес-процессам, отбирая их по предметам. Это стандартный способ поиска связанных объектов в 1С. Например, вы можете найти все процессы, предметом которых является определенный контрагент или документ. Это позволяет выловить "тот самый" процесс, который нам нужен, даже если логика привязки сложна. Например, при создании нового входящего документа с определенным контрагентом, мы можем запросить все активные бизнес-процессы, у которых этот контрагент является предметом, и выбрать наиболее подходящий для связывания.

Получение значения главной задачи/ведущего процесса в условии маршрутизации

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

Рассмотрим по шагам, как это можно сделать в условии маршрутизации:

  1. Контекст условия маршрутизации: В условии маршрутизации вы находитесь в контексте выполнения определенного этапа родительского процесса. Если новый документ создается на основе строки табличной части "товары и услуги", то нам нужно получить доступ к основному документу родительского процесса, который послужил его предметом.

  2. Доступ к основному документу родительского процесса: Родительский комплексный процесс имеет свой основной предмет, который его инициировал. Если этот предмет является документом, мы можем получить к нему доступ. Из текущего процесса или задачи, которую мы обрабатываем в условии маршрутизации, мы можем выйти на родительский процесс (через Задача.БизнесПроцесс, как мы рассмотрели ранее), а затем получить его основной предмет. Обычно для этого используется свойство БизнесПроцессОбъект.Предметы и фильтрация по свойству Основной = Истина.

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

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

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

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

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

← На главную