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