При автоматизации бизнес-процессов в 1С:Документооборот часто возникает задача автоматического создания одного документа на основании другого. Например, при регистрации «Методики» система должна сама создать «Приказ ВНД» и запустить по нему процесс согласования. Однако разработчики часто сталкиваются с проблемой: документ создается, но настроенный автозапуск процесса по шаблону не срабатывает. В журнале регистрации или при анализе событий выясняется, что у события создания документа отсутствует Автор, и система выдает ошибку: «Пользователь "" не имеет прав на предмет».
В этой статье мы подробно разберем, почему так происходит, как работает механизм бизнес-событий и как правильно настроить систему, чтобы программно созданные документы корректно инициировали бизнес-процессы.
Проанализируем ситуацию. Когда мы пишем код дополнительного обработчика, мы часто заполняем реквизит Подготовил или аналогичный ему. Рассмотрим пример кода, который создает внутренний документ:
ИмяНовДок = Событие.Источник.Ссылка;
АвторНовДок = ИмяНовДок.Подготовил;
ИсхДок = Событие.Источник.ВидДокумента.Наименование;
ИсхДокИмя = Событие.Источник;
Если ИсхДок = "Методика" Тогда
НовДок = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
// Заполняем реквизиты
НовДок.Наименование = "Наименование";
НовДок.Заголовок = "Приказ ВНД (" + ИсхДокИмя + ")";
НовДок.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("приказ ВНД");
НовДок.Папка = Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("ПриказыВНД");
НовДок.ВопросДеятельности = Справочники.ВопросыДеятельности.НайтиПоНаименованию("Основная деятельность");
НовДок.Подготовил = АвторНовДок;
// Записываем документ
НовДок.Записать();
КонецЕсли;
Казалось бы, мы указали пользователя в поле Подготовил. Однако для подсистемы автозапуска процессов этого недостаточно. В 1С:Документооборот старт процесса по шаблону привязан не к самому документу напрямую, а к записи в регистре сведений ПроизошедшиеБизнесСобытия.
Выясним причину сбоя: когда выполняется метод Записать(), система автоматически формирует запись о событии «Создание внутреннего документа». В этой записи есть поле Автор. Если код выполняется в контексте регламентного задания (фонового процесса), а у этого задания не назначен конкретный пользователь, поле Автор в бизнес-событии остается пустым. При попытке автозапуска процесса система проверяет права этого «пустого» пользователя. Естественно, прав у него нет, и процесс не стартует.
Самый простой и эффективный способ решить проблему — назначить ответственного пользователя для регламентного задания, которое отвечает за обработку событий. Рассмотрим по шагам, как это сделать:
Обработка произошедших бизнес-событий. Именно оно отвечает за чтение очереди событий и запуск алгоритмов обработчиков и шаблонов.Администратор.Почему это работает? Теперь, когда фоновое задание будет запускать ваш код создания документа, сессия будет иметь контекст выбранного пользователя. Метод Записать() создаст событие, где в поле Автор будет значиться ваш «Робот». Система автозапуска увидит автора, проверит его права и успешно инициирует процесс.
Если вы не хотите полагаться на механизмы автозапуска или вам нужно передать в процесс специфические параметры, можно программно запустить процесс прямо в коде обработчика. Рассмотрим, как дополнить наш код:
// ... код создания документа НовДок из предыдущего примера ...
НовДок.Записать();
// Программный старт процесса по шаблону
ШаблонПроцесса = Справочники.ШаблоныСогласования.НайтиПоНаименованию("Шаблон для Приказов ВНД");
Если Не ШаблонПроцесса.Пустая() Тогда
// Используем механизмы типовой конфигурации для создания процесса по шаблону
БизнесПроцессСсылка = БизнесПроцессы.Согласование.СоздатьБизнесПроцесс();
БизнесПроцессСсылка.Дата = ТекущаяДата();
БизнесПроцессСсылка.Предметы[0].Предмет = НовДок.Ссылка;
// Заполняем по шаблону
БизнесПроцессСсылка.ЗаполнитьПоШаблону(ШаблонПроцесса);
// Явно указываем автора процесса
БизнесПроцессСсылка.Автор = АвторНовДок;
БизнесПроцессСсылка.Записать();
БизнесПроцессСсылка.Старт();
КонецЕсли;
Этот способ позволяет полностью контролировать процесс создания и не зависеть от того, заполнено ли поле Автор в технических регистрах событий. Однако он требует более сложной программной реализации и поддержки кода при изменении бизнес-логики.
Проанализируем дополнительные факторы, которые могут влиять на результат:
НовДок. Если прав на папку нет, метод Записать() может отработать (в привилегированном режиме), но событие будет «битым».РегламентныеЗадания обеспечивает корректность всей этой цепочки.Подведем итог: если вы столкнулись с тем, что «автозапуск не видит автора», первым делом проверьте настройки регламентного задания Обработка произошедших бизнес-событий. В 90% случаев установка конкретного пользователя решает проблему полностью.