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