Как получить исполнителя для условия в Шаблоне исполнения в 1С:Документооборот

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

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

Анализ доступного контекста и переменных

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

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

  1. Учетная запись: У входящего письма всегда есть связь с объектом УчетнаяЗаписьЭлектроннойПочты. Мы можем извлечь ответственного за эту учетную запись через Предмет.УчетнаяЗапись.Ответственный.
  2. Бизнес-процесс: Если условие проверяется в уже инициированном процессе, нам доступна переменная БизнесПроцесс, через которую можно выйти на БизнесПроцесс.Шаблон.
  3. Параметры: В структуру Параметры система часто помещает контекстные данные, включая текущую строку исполнителя, если условие проверяется для конкретной позиции в списке.

Получение исполнителя через запрос к шаблону

Рассмотрим ситуацию, когда нам нужно программно выгрузить исполнителя из конкретного шаблона исполнения, ориентируясь на наименование шаблона или условия. Проанализируем пример запроса, который позволяет получить нужного пользователя из табличной части справочника ШаблоныИсполнения (или ШаблоныСогласования, в зависимости от типа процесса).

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ШаблоныИсполненияИсполнители.Исполнитель КАК Исполнитель
    |ИЗ
    |	Справочник.ШаблоныИсполнения.Исполнители КАК ШаблоныИсполненияИсполнители
    |ГДЕ
    |	ШаблоныИсполненияИсполнители.Ссылка.Наименование = &НаименованиеШаблона
    |	И ШаблоныИсполненияИсполнители.Условие.Наименование = &НаименованиеУсловия";

Запрос.УстановитьПараметр("НаименованиеШаблона", "Обработка входящего письма");
Запрос.УстановитьПараметр("НаименованиеУсловия", "Проверка руководством");

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ИсполнительИзШаблона = Выборка.Исполнитель;
КонецЕсли;

В данном примере мы обращаемся к табличной части Исполнители. Обратите внимание, что в реальных задачах вместо Наименование лучше использовать поиск по уникальному идентификатору (GUID) или искать связь через текущий БизнесПроцесс.Шаблон, если он доступен в контексте.

Связь через объект «Бизнес-процесс»

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

Воспользуемся методом поиска в табличной части, чтобы избежать тяжелых запросов к базе данных. Предположим, у нас есть ссылка на текущее условие (переменная Условие часто доступна в контексте проверки):


ШаблонОбъект = БизнесПроцесс.Шаблон.ПолучитьОбъект();
СтрокаИсполнителя = ШаблонОбъект.Исполнители.Найти(Условие, "Условие");

Если СтрокаИсполнителя <> Неопределено Тогда
    НужныйИсполнитель = СтрокаИсполнителя.Исполнитель;
КонецЕсли;

Этот подход позволяет динамически определять, какой именно исполнитель "закреплен" за текущим проверяемым условием в маршруте, не привязываясь к жестким строковым именам.

Реализация через собственные автоподстановки

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

  1. Перейдем в справочник "Алгоритмы проверки данных" (в 1С:ДО 3.0) или создадим вычисляемую роль в версии 2.1.
  2. Напишем скрипт, который принимает Предмет (наше письмо) и анализирует его свойства.
  3. Поскольку у письма нет автора, проанализируем связанные документы или проектную команду. Выясним, к какому проекту относится письмо через Предмет.Проект.
  4. Если проект найден, выберем руководителя проекта в качестве исполнителя.

Пример кода для скрипта автоподстановки, который ищет ответственного в зависимости от учетной записи письма:


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

// Если ответственный не найден, возвращаем системного куратора
Если Результат = Неопределено Тогда
    Результат = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
КонецЕсли;

Возврат Результат;

Использование дополнительных обработчиков событий

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

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

Таким образом, для получения исполнителя в условии шаблона исполнения следует либо использовать прямой запрос к табличной части Исполнители справочника шаблонов, либо (что более предпочтительно) выносить логику определения исполнителя в механизмы автоподстановок и алгоритмов проверки данных.

← На главную