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