Автоматизация запуска бизнес-процессов — одна из ключевых задач при внедрении 1С:Документооборот 2.1. Часто возникает необходимость, чтобы при создании или изменении внутреннего документа система автоматически отправляла его на ознакомление определенному кругу лиц, не заставляя пользователя вручную нажимать кнопку «Отправить» и заполнять параметры процесса. В данной статье мы подробно разберем, как реализовать этот функционал правильно, избегая типичных ошибок, таких как зацикливание процессов или «подвисание» интерфейса.
Прежде чем приступать к написанию кода непосредственно в модуле объекта документа, проанализируем архитектуру системы. В 1С:ДО 2.1 существует встроенный механизм бизнес-событий. Это наиболее гибкий и «чистый» способ реализации автоматизации. Вместо изменения типового кода конфигурации в процедуре ПриЗаписи, мы можем настроить детектор события.
Рассмотрим по шагам, как работает эта связка:
Такой подход позволяет сохранить конфигурацию на поддержке и легко управлять логикой запуска через пользовательский интерфейс в справочнике «Дополнительные обработчики».
Наиболее правильным методом программного запуска является использование заранее настроенного шаблона процесса. Это позволяет избежать жесткого кодирования списка участников и сроков внутри конфигуратора. Если завтра список согласующих или ознакомляемых лиц изменится, администратор просто поправит шаблон в пользовательском режиме.
Для программного создания процесса по шаблону проанализируем использование функции СформироватьПроцессПоШаблону. Посмотрим на пример кода, который можно разместить в обработчике:
// Ссылка на документ, по которому запускаем процесс
ПредметПроцесса = СсылкаНаДокумент;
// Получаем ссылку на заранее созданный шаблон процесса "Ознакомление"
ШаблонСсылка = Справочники.ШаблоныОзнакомления.НайтиПоНаименованию("Ознакомление с приказом");
Если НЕ ШаблонСсылка.Пустая() Тогда
// Используем типовой механизм формирования процесса по шаблону
БизнесПроцессОбъект = РаботаСБизнесПроцессами.СформироватьПроцессПоШаблону(ШаблонСсылка, ПредметПроцесса);
// После формирования объект нужно записать и стартовать
БизнесProcessОбъект.Записать();
БизнесПроцессОбъект.Старт();
КонецЕсли;
В этом примере функция СформироватьПроцессПоШаблону автоматически заполнит табличную часть исполнителей, сроки, важность и другие параметры, указанные в шаблоне. Нам остается лишь вызвать метод Старт().
Иногда возникают ситуации, когда использовать шаблон невозможно, и логика выбора участников крайне сложная. В этом случае разберем, как создать объект бизнес-процесса «с нуля».
Выясним, какие поля являются обязательными для заполнения. Помимо исполнителей, важно правильно указать предмет процесса, чтобы он отображался в карточке документа.
НовыйПроцесс = БизнесПроцессы.Ознакомление.СоздатьБизнесПроцесс();
НовыйПроцесс.Дата = ТекущаяДата();
НовыйПроцесс.Автор = ПараметрыСеанса.ТекущийПользователь;
НовыйПроцесс.Наименование = "Ознакомьтесь с документом: " + Строка(ДокументСсылка);
НовыйПроцесс.Важность = Перечисления.ВариантыВажностиЗадачи.Обычная;
// Заполнение предмета (важно для связей)
НоваяСтрокаПредметы = НовыйПроцесс.Предметы.Добавить();
НоваяСтрокаПредметы.Предмет = ДокументСсылка;
НоваяСтрокаПредметы.РольПредмета = Перечисления.РолиПредметов.Основной;
// Добавление исполнителей
НовыйИсполнитель = НовыйПроцесс.Исполнители.Добавить();
НовыйИсполнитель.Исполнитель = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович");
// Установка срока
НовыйПроцесс.СрокИсполнения = ТекущаяДата() + 86400; // Срок + 1 день
НовыйПроцесс.ВариантУстановкиСрока = Перечисления.ВариантыУстановкиСрока.Дата;
НовыйПроцесс.Записать();
НовыйПроцесс.Старт();
Важно: Если не заполнить поле ВариантУстановкиСрока, процесс может не стартовать или создать некорректные задачи без дат завершения.
Проанализируем критически важный момент: если мы помещаем код запуска в событие ПриЗаписи, то каждое последующее изменение документа (например, при программном изменении статуса самим процессом) будет снова вызывать старт нового процесса. Это приведет к бесконечному количеству задач.
Чтобы этого избежать, необходимо внедрить проверку на наличие уже запущенных процессов по данному предмету. Проверим это через запрос к регистру сведений СостоянияДокументов или через поиск активных задач.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Задачи.Ссылка
|ИЗ
| Задача.ЗадачаИсполнителя КАК Задачи
|ГДЕ
| Задачи.Предметы.Предмет = &Предмет
| И Задачи.БизнесПроцесс ССЫЛКА БизнесПроцесс.Ознакомление
| И Задачи.ПометкаУдаления = ЛОЖЬ
| И Задачи.Выполнена = ЛОЖЬ";
Запрос.УстановитьПараметр("Предмет", ДокументСсылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
// Только если нет активных задач ознакомления, запускаем новый процесс
ЗапуститьПроцесс(ДокументСсылка);
КонецЕсли;
Выясним, как программный запуск влияет на работу пользователя. Метод Старт() выполняет множество действий: проверку прав, запись в регистры, рассылку уведомлений. Если участников много, запись документа может затянуться на 5-10 секунд, что вызовет раздражение у пользователя.
Рассмотрим вариант выноса старта процесса в фоновое задание. Это позволит мгновенно записать документ и закрыть форму, в то время как сервер 1С в отдельном потоке сформирует и запустит задачу.
Для этого используется метод ФоновыеЗадания.Выполнить(), в который передаются параметры: имя экспортной процедуры в серверном модуле и массив параметров (наша ссылка на документ).
Посмотрим на ситуацию со стороны безопасности. Если процесс запускается «от имени» обычного пользователя, у которого нет прав на создание бизнес-процессов или на чтение конкретного шаблона, код выдаст ошибку доступа. Чтобы гарантировать выполнение автоматизации, рекомендуется использовать инструкцию УстановитьПривилегированныйРежим(Истина) в модуле, где происходит непосредственное создание и старт процесса. Однако помните, что злоупотребление этим режимом может быть небезопасно, используйте его только для гарантированного старта системных механизмов.
Подводя итог, можно сказать, что программный запуск процесса ознакомления — это эффективный способ ускорить документооборот в компании. Мы разобрали три способа реализации (бизнес-события, шаблоны и ручное создание), а также коснулись важных технических аспектов, таких как предотвращение дублирования процессов и использование фоновых заданий для повышения комфорта пользователей.