Как программно добавить или заменить исполнителей в запущенном процессе 1С:Документооборот

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

В процессе автоматизации документооборота часто возникает задача динамического формирования списка согласующих лиц. Типичный сценарий: в документе (например, «Протокол совещания») указаны участники в виде дополнительных реквизитов, и именно они должны получить задачи на согласование. Рассмотрим, как реализовать автоматическую подстановку исполнителей, не снимая конфигурацию с поддержки и избегая типичных ошибок, связанных с жизненным циклом бизнес-процесса.

Анализ проблемы: почему исполнители не добавляются просто так?

Часто программисты пытаются использовать стандартный механизм «Дополнительных обработчиков» на событие Старт процесса. Логика кажется простой: при старте процесса найти «мнимого пользователя» (заглушку) в табличной части Исполнители и заменить его на реальных сотрудников из документа. Однако на практике исполнители добавляются в таблицу, но задачи для них не создаются.

Разберем причину этого поведения. В 1С:Документооборот бизнес-события обрабатываются асинхронно. Когда срабатывает обработчик события «Старт процесса», механизм генерации задач уже либо отработал, либо находится в процессе выполнения. Простое изменение табличной части Исполнители объекта БизнесПроцесс не инициирует автоматическое создание задач для новых строк. Система «уже проехала» этап формирования задач для текущей точки маршрута.

Способ 1. Использование механизмов автоподстановки (Рекомендуемый)

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

Разберем по шагам, как это настроить:

  1. Перейдем в раздел Настройка и администрация — Алгоритмы.
  2. Создадим новый алгоритм, например, «ПолучитьУчастниковИзДопРеквизитов».
  3. В тексте алгоритма напишем код, который обращается к предмету процесса и собирает массив пользователей из нужных реквизитов.

Пример кода для алгоритма:


// Получаем основной предмет бизнес-процесса
Предмет = БизнесПроцесс.Предметы[0].Предмет;
Результат = Новый Массив;

// Проверяем, что предмет — это Внутренний документ
Если ТипЗнч(Предмет) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
    // Читаем доп. реквизиты (имена реквизитов должны соответствовать вашим настройкам)
    Для Каждого Реквизит Из Предмет.ДополнительныеРеквизиты Цикл
        Если Найти(Строка(Реквизит.Свойство), "УчастникСовещания") > 0 Тогда
            Если ЗначениеЗаполнено(Реквизит.Значение) Тогда
                Результат.Добавить(Реквизит.Значение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Возврат Результат;

После создания алгоритма в шаблоне процесса согласования в списке исполнителей мы выбираем не конкретного пользователя, а Автоподстановку, указывая наш алгоритм. Теперь при старте процесса система сама вызовет этот код до момента генерации задач, и список участников будет сформирован корректно.

Способ 2. Программная корректировка через обработчик «ПередЗаписью»

Если специфика задачи требует именно вмешательства в объект бизнес-процесса, проанализируем вариант с использованием подписки на событие ПередЗаписью. Этот метод позволяет перехватить момент старта процесса до того, как данные зафиксируются в базе и начнется генерация задач.

Для реализации без изменения основной конфигурации рекомендуется использовать Расширение. Создадим в расширении подписку на событие для объекта БизнесПроцессОбъект.Согласование.

Рассмотрим пример кода обработки:


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

Обратите внимание на использование ОбщегоНазначения.ЗначенияРеквизитовОбъекта. Мы сравниваем текущее состояние признака Стартован в объекте и в базе данных. Если в объекте «Истина», а в базе «Ложь» — значит, это именно момент нажатия кнопки «Стартовать».

Способ 3. Исправление ситуации в уже запущенном процессе

Выясним причину, по которой код из Сообщения 9 в форуме может не работать. Если процесс уже стартовал и задачи созданы, простого добавления строк в ТЧ Исполнители недостаточно. Необходимо вызвать процедуру перегенерации задач.

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

  1. Получаем объект бизнес-процесса: БизнесПроцессОбъект = Источник.Ссылка.ПолучитьОбъект();
  2. Модифицируем табличную часть Исполнители.
  3. Записываем объект.
  4. Вызываем метод ИзменитьРеквизитыНевыполненныхЗадач или напрямую обращаемся к модулям управления бизнес-процессами для актуализации задач.

Важное предостережение: Метод с удалением текущего процесса и созданием нового (как предлагалось в Сообщении 17) является крайне нежелательным. Рассмотрим почему: при удалении процесса «затирается» история согласования, рвутся связи в почтовых уведомлениях и нарушается логика нумерации задач. Всегда лучше модифицировать существующий процесс или использовать штатные автоподстановки.

Особенности для 1С:Документооборот 3.0

Посмотрим на ситуацию в контексте версии 3.0. В новой редакции архитектура процессов принципиально изменилась — теперь используются Действия. Если вы работаете в 3.0, задача решается еще проще:

В настройках Правил обработки документов для конкретного вида документа можно указать настройки участников. Там доступен встроенный язык (скрипты), где можно прописать выборку участников из доп. реквизитов прямо в пользовательском режиме. Система сама сформирует список участников при формировании обработки документа.

Подведем итог: для надежной работы системы старайтесь использовать Автоподстановки через алгоритмы. Это сохраняет конфигурацию на поддержке, обеспечивает прозрачную логику работы и гарантирует, что задачи будут созданы для всех нужных исполнителей без программных «костылей».

← На главную