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

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

Автоматизация запуска бизнес-процессов — одна из ключевых задач при внедрении 1С:Документооборот 2.1. Часто возникает необходимость, чтобы при создании или изменении внутреннего документа система автоматически отправляла его на ознакомление определенному кругу лиц, не заставляя пользователя вручную нажимать кнопку «Отправить» и заполнять параметры процесса. В данной статье мы подробно разберем, как реализовать этот функционал правильно, избегая типичных ошибок, таких как зацикливание процессов или «подвисание» интерфейса.

Использование механизма дополнительных обработчиков бизнес-событий

Прежде чем приступать к написанию кода непосредственно в модуле объекта документа, проанализируем архитектуру системы. В 1С:ДО 2.1 существует встроенный механизм бизнес-событий. Это наиболее гибкий и «чистый» способ реализации автоматизации. Вместо изменения типового кода конфигурации в процедуре ПриЗаписи, мы можем настроить детектор события.

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

  1. Детектор события: Система отслеживает возникновение события (например, «Создание внутреннего документа»).
  2. Условие (фильтр): Мы определяем, для каких именно документов должен срабатывать запуск (например, только для определенного вида документа или при заполнении конкретного реквизита).
  3. Обработчик: Выполняется фрагмент кода на встроенном языке, который и осуществляет старт процесса.

Такой подход позволяет сохранить конфигурацию на поддержке и легко управлять логикой запуска через пользовательский интерфейс в справочнике «Дополнительные обработчики».

Программный старт процесса с использованием шаблона

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

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


// Ссылка на документ, по которому запускаем процесс
ПредметПроцесса = СсылкаНаДокумент; 

// Получаем ссылку на заранее созданный шаблон процесса "Ознакомление"
ШаблонСсылка = Справочники.ШаблоныОзнакомления.НайтиПоНаименованию("Ознакомление с приказом");

Если НЕ ШаблонСсылка.Пустая() Тогда
    // Используем типовой механизм формирования процесса по шаблону
    БизнесПроцессОбъект = РаботаСБизнесПроцессами.СформироватьПроцессПоШаблону(ШаблонСсылка, ПредметПроцесса);
    
    // После формирования объект нужно записать и стартовать
    БизнесProcessОбъект.Записать();
    БизнесПроцессОбъект.Старт();
КонецЕсли;

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

Ручное заполнение параметров бизнес-процесса

Иногда возникают ситуации, когда использовать шаблон невозможно, и логика выбора участников крайне сложная. В этом случае разберем, как создать объект бизнес-процесса «с нуля».

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


НовыйПроцесс = БизнесПроцессы.Ознакомление.СоздатьБизнесПроцесс();
НовыйПроцесс.Дата = ТекущаяДата();
НовыйПроцесс.Автор = ПараметрыСеанса.ТекущийПользователь;
НовыйПроцесс.Наименование = "Ознакомьтесь с документом: " + Строка(ДокументСсылка);
НовыйПроцесс.Важность = Перечисления.ВариантыВажностиЗадачи.Обычная;

// Заполнение предмета (важно для связей)
НоваяСтрокаПредметы = НовыйПроцесс.Предметы.Добавить();
НоваяСтрокаПредметы.Предмет = ДокументСсылка;
НоваяСтрокаПредметы.РольПредмета = Перечисления.РолиПредметов.Основной;

// Добавление исполнителей
НовыйИсполнитель = НовыйПроцесс.Исполнители.Добавить();
НовыйИсполнитель.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович");

// Установка срока
НовыйПроцесс.СрокИсполнения = ТекущаяДата() + 86400; // Срок + 1 день
НовыйПроцесс.ВариантУстановкиСрока = Перечисления.ВариантыУстановкиСрока.Дата;

НовыйПроцесс.Записать();
НовыйПроцесс.Старт();

Важно: Если не заполнить поле ВариантУстановкиСрока, процесс может не стартовать или создать некорректные задачи без дат завершения.

Защита от зацикливания и повторного запуска

Проанализируем критически важный момент: если мы помещаем код запуска в событие ПриЗаписи, то каждое последующее изменение документа (например, при программном изменении статуса самим процессом) будет снова вызывать старт нового процесса. Это приведет к бесконечному количеству задач.

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


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

Запрос.УстановитьПараметр("Предмет", ДокументСсылка);
Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда
    // Только если нет активных задач ознакомления, запускаем новый процесс
    ЗапуститьПроцесс(ДокументСсылка);
КонецЕсли;

Оптимизация производительности: Фоновый старт

Выясним, как программный запуск влияет на работу пользователя. Метод Старт() выполняет множество действий: проверку прав, запись в регистры, рассылку уведомлений. Если участников много, запись документа может затянуться на 5-10 секунд, что вызовет раздражение у пользователя.

Рассмотрим вариант выноса старта процесса в фоновое задание. Это позволит мгновенно записать документ и закрыть форму, в то время как сервер 1С в отдельном потоке сформирует и запустит задачу.

Для этого используется метод ФоновыеЗадания.Выполнить(), в который передаются параметры: имя экспортной процедуры в серверном модуле и массив параметров (наша ссылка на документ).

Вопросы прав доступа

Посмотрим на ситуацию со стороны безопасности. Если процесс запускается «от имени» обычного пользователя, у которого нет прав на создание бизнес-процессов или на чтение конкретного шаблона, код выдаст ошибку доступа. Чтобы гарантировать выполнение автоматизации, рекомендуется использовать инструкцию УстановитьПривилегированныйРежим(Истина) в модуле, где происходит непосредственное создание и старт процесса. Однако помните, что злоупотребление этим режимом может быть небезопасно, используйте его только для гарантированного старта системных механизмов.

Резюме

Подводя итог, можно сказать, что программный запуск процесса ознакомления — это эффективный способ ускорить документооборот в компании. Мы разобрали три способа реализации (бизнес-события, шаблоны и ручное создание), а также коснулись важных технических аспектов, таких как предотвращение дублирования процессов и использование фоновых заданий для повышения комфорта пользователей.

← На главную