В процессе настройки сложных маршрутов в 1С:Документооборот часто возникает необходимость программно определить исполнителя, указанного в табличной части шаблона процесса. Это требуется для написания гибких условий маршрутизации или создания сложных скриптов автоподстановки. Рассмотрим подробно, как решить эту задачу, проанализируем доступные контексты выполнения кода и разберем наиболее эффективные способы обращения к данным шаблона.
Прежде чем приступать к написанию кода, выясним, в какой момент и в каком окружении выполняется обработчик условия. В системе 1С:Документооборот (версий 2.1 и 3.0) при вычислении условий маршрутизации в шаблонах процессов нам доступны определенные переменные. Основным объектом является Предмет — это ссылка на документ (входящий, исходящий или внутренний) или письмо, на основании которого запускается процесс.
Однако, как справедливо замечено в обсуждении, если предметом выступает входящее письмо, у него могут отсутствовать привычные реквизиты, такие как Автор или Ответственный. В этом случае нам необходимо искать другие точки входа:
УчетнаяЗаписьЭлектроннойПочты. Мы можем извлечь ответственного за эту учетную запись через Предмет.УчетнаяЗапись.Ответственный.БизнесПроцесс, через которую можно выйти на БизнесПроцесс.Шаблон.Параметры система часто помещает контекстные данные, включая текущую строку исполнителя, если условие проверяется для конкретной позиции в списке.Рассмотрим ситуацию, когда нам нужно программно выгрузить исполнителя из конкретного шаблона исполнения, ориентируясь на наименование шаблона или условия. Проанализируем пример запроса, который позволяет получить нужного пользователя из табличной части справочника ШаблоныИсполнения (или ШаблоныСогласования, в зависимости от типа процесса).
Важно помнить, что поиск по наименованию — это "хрупкое" решение. Если пользователь изменит название шаблона в интерфейсе, код перестанет работать. Тем не менее, разберем структуру такого запроса для понимания логики взаимодействия с данными:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШаблоныИсполненияИсполнители.Исполнитель КАК Исполнитель
|ИЗ
| Справочник.ШаблоныИсполнения.Исполнители КАК ШаблоныИсполненияИсполнители
|ГДЕ
| ШаблоныИсполненияИсполнители.Ссылка.Наименование = &НаименованиеШаблона
| И ШаблоныИсполненияИсполнители.Условие.Наименование = &НаименованиеУсловия";
Запрос.УстановитьПараметр("НаименованиеШаблона", "Обработка входящего письма");
Запрос.УстановитьПараметр("НаименованиеУсловия", "Проверка руководством");
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ИсполнительИзШаблона = Выборка.Исполнитель;
КонецЕсли;
В данном примере мы обращаемся к табличной части Исполнители. Обратите внимание, что в реальных задачах вместо Наименование лучше использовать поиск по уникальному идентификатору (GUID) или искать связь через текущий БизнесПроцесс.Шаблон, если он доступен в контексте.
Если код выполняется в момент формирования задач, наиболее надежным способом будет получение исполнителя непосредственно из объекта шаблона, привязанного к текущему бизнес-процессу. Проанализируем, как найти конкретную строку исполнителя, к которой привязано условие:
Воспользуемся методом поиска в табличной части, чтобы избежать тяжелых запросов к базе данных. Предположим, у нас есть ссылка на текущее условие (переменная Условие часто доступна в контексте проверки):
ШаблонОбъект = БизнесПроцесс.Шаблон.ПолучитьОбъект();
СтрокаИсполнителя = ШаблонОбъект.Исполнители.Найти(Условие, "Условие");
Если СтрокаИсполнителя <> Неопределено Тогда
НужныйИсполнитель = СтрокаИсполнителя.Исполнитель;
КонецЕсли;
Этот подход позволяет динамически определять, какой именно исполнитель "закреплен" за текущим проверяемым условием в маршруте, не привязываясь к жестким строковым именам.
Часто задача "получить исполнителя для условия" свидетельствует о том, что стандартных механизмов маршрутизации недостаточно. В этом случае правильнее будет не писать сложный код внутри условия, а создать собственную автоподстановку. Рассмотрим этот алгоритм:
Предмет (наше письмо) и анализирует его свойства.Предмет.Проект.Пример кода для скрипта автоподстановки, который ищет ответственного в зависимости от учетной записи письма:
Результат = Неопределено;
Если ТипЗнч(Предмет) = Тип("СправочникСсылка.ВходящиеДокументы") Тогда
// Пытаемся найти ответственного за учетную запись, если это письмо
Если ЗначениеЗаполнено(Предмет.УчетнаяЗапись) Тогда
Результат = Предмет.УчетнаяЗапись.Ответственный;
КонецЕсли;
КонецЕсли;
// Если ответственный не найден, возвращаем системного куратора
Если Результат = Неопределено Тогда
Результат = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
КонецЕсли;
Возврат Результат;
Для максимально гибкой настройки связи между входящим письмом и шаблоном исполнения рекомендуется использовать программную подписку на события в модуле РаботаСБизнесПроцессамиПереопределяемый. В момент старта процесса мы можем перехватить создание задач и программно заполнить список исполнителей.
Разберем, почему это удобно:
Во-первых, в этот момент нам доступны сразу три ключевых объекта: Предмет, Шаблон и создаваемый БизнесПроцесс.
Во-вторых, мы можем реализовать сложную логику распределения задач (например, по нагрузке сотрудников), которую невозможно описать простым условием в табличной части шаблона.
Таким образом, для получения исполнителя в условии шаблона исполнения следует либо использовать прямой запрос к табличной части Исполнители справочника шаблонов, либо (что более предпочтительно) выносить логику определения исполнителя в механизмы автоподстановок и алгоритмов проверки данных.