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

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

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

Давайте разберем несколько способов решения этой задачи, от простого к более универсальному и гибкому.

Решение 1: Создание автоподстановки с помощью скрипта

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

Разберем процесс по шагам:

  1. Перейдите в раздел "Настройка" → "Все скрипты".
  2. Создайте новый элемент. В поле "Тип скрипта" выберите значение "Автоподстановка для объектов". Это позволит нам использовать скрипт для определения исполнителей в процессах.
  3. В поле для кода вставьте логику, которая будет определять исполнителя. Основная идея — получить значение допреквизита из объекта (документа или процесса, для которого запущена автоподстановка) и в зависимости от этого значения вернуть нужного пользователя.

Посмотрим на пример кода. Для получения значения дополнительного реквизита рекомендуется использовать функцию УправлениеСвойствами.ЗначениеСвойства().


// В переменной "Объект" хранится ссылка на документ или процесс,
// для которого выполняется автоподстановка.

// "КатегорияЗаявки" - это точное наименование вашего дополнительного реквизита,
// как оно указано в его карточке.
НаименованиеРеквизита = "КатегорияЗаявки";
ЗначениеРеквизита = УправлениеСвойствами.ЗначениеСвойства(Объект.Ссылка, НаименованиеРеквизита);

// Проверяем полученное значение и назначаем результат
Если ЗначениеРеквизита = "Технический вопрос" Тогда
    // В "Результат" нужно поместить ссылку на конкретного пользователя.
    // Поиск по наименованию - простой, но не самый надежный способ.
    Результат = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
ИначеЕсли ЗначениеРеквизита = "Финансовый вопрос" Тогда
    Результат = Справочники.Пользователи.НайтиПоНаименованию("Петров П.П.");
ИначеЕсли ЗначениеРеквизита = "Юридический вопрос" Тогда
    Результат = Справочники.Пользователи.НайтиПоНаименованию("Сидорова А.А.");
Иначе
    // Если соответствие не найдено, можно назначить исполнителя по умолчанию
    // или оставить поле пустым.
    Результат = Неопределено;
КонецЕсли;

Как использовать созданную автоподстановку:

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

Недостаток этого метода: он плохо масштабируется. Если у вас появится 100 категорий заявок, вам придется дописать 100 условий ИначеЕсли. Каждое изменение в логике распределения (например, уволился Иванов) потребует вмешательства программиста и изменения кода, что неудобно в поддержке.

Решение 2: Гибкая и масштабируемая автоподстановка без изменения кода

Чтобы избежать "зашивания" логики в код, можно вынести соответствия "значение реквизита — исполнитель" в отдельные настройки, которые сможет редактировать ответственный сотрудник без привлечения программиста. Проанализируем два подхода.

Подход А: Сопоставление по одинаковому допреквизиту у документа и пользователя

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

  1. Создайте дополнительный реквизит (например, "Категория ответственности") для объекта "Справочник: Пользователи". Важно, чтобы у него был тот же тип и, в идеале, тот же список возможных значений, что и у допреквизита в документе.
  2. Откройте карточки нужных сотрудников (Иванова, Петрова) и в новом допреквизите укажите их "специализацию": Иванову — "Технический вопрос", Петрову — "Финансовый вопрос" и так далее.
  3. Теперь создадим универсальный скрипт автоподстановки, который не содержит фамилий, а выполняет поиск по этому соответствию.

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


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

// 2. Если значение не заполнено, исполнителя не ищем
Если НЕ ЗначениеЗаполнено(ЗначениеРеквизитаДокумента) Тогда
    Результат = Неопределено;
    Возврат;
КонецЕсли;

// 3. Ищем пользователя с таким же значением допреквизита
НаименованиеРеквизитаПользователя = "Категория ответственности"; // Название допреквизита у пользователя

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

Запрос.УстановитьПараметр("НаименованиеСвойства", НаименованиеРеквизитаПользователя);
Запрос.УстановитьПараметр("ЗначениеСвойства", ЗначениеРеквизитаДокумента);

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

Теперь для добавления нового правила достаточно просто указать значение допреквизита в карточке нового сотрудника. Код трогать не нужно.

Подход Б: Использование отдельного регистра сведений для хранения соответствий

Это наиболее "промышленный" вариант, но он требует доработки конфигурации. Его суть — создать специальный регистр сведений, где будут храниться все соответствия.

  1. Программист в конфигураторе создает регистр сведений, например, СоответствияИсполнителейПоКатегориям.
  2. У регистра будут два измерения: КатегорияЗаявки (тип как у допреквизита) и Исполнитель (тип СправочникСсылка.Пользователи).
  3. Ответственный сотрудник сможет в пользовательском режиме заполнять этот регистр, создавая строки: "Технический вопрос" → Иванов И.И., "Финансовый вопрос" → Петров П.П.
  4. Код автоподстановки в этом случае будет предельно простым и быстрым.

// 1. Получаем значение допреквизита из текущего объекта
ЗначениеРеквизита = УправлениеСвойствами.ЗначениеСвойства(Объект.Ссылка, "КатегорияЗаявки");

// 2. Ищем соответствие в нашем регистре
СтруктураОтбора = Новый Структура("КатегорияЗаявки", ЗначениеРеквизита);
Записи = РегистрыСведений.СоответствияИсполнителейПоКатегориям.Получить(СтруктураОтбора);

Если Записи <> Неопределено Тогда
    Результат = Записи.Исполнитель;
Иначе
    Результат = Неопределено;
КонецЕсли;

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

Альтернативный метод: Условная маршрутизация в схеме процесса

Если у вас небольшое количество вариантов (2-5) и они редко меняются, можно обойтись без скриптов, используя визуальные средства настройки шаблона процесса.

  1. В редакторе схемы шаблона процесса после стартового события добавьте элемент "Разделение" (выглядит как ромб).
  2. От этого элемента проведите несколько веток-стрелок. Для каждой стрелки настройте условие маршрутизации. Условие будет проверять значение вашего допреквизита. Например: для первой ветки условие "[Доп. реквизит 'КатегорияЗаявки'] = 'Технический вопрос'", для второй — "[Доп. реквизит 'КатегорияЗаявки'] = 'Финансовый вопрос'" и т.д.
  3. На каждую такую ветку поместите свой собственный этап "Исполнение", в котором вы уже явно укажете нужного исполнителя (Иванова, Петрова).
  4. После всех параллельных этапов "Исполнение" сведите ветки обратно в одну с помощью элемента "Слияние".

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

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

← На главную