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

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

При автоматизации бизнес-процессов в 1С:Документооборот часто возникает задача автоматического создания одного документа на основании другого. Например, при регистрации «Методики» система должна сама создать «Приказ ВНД» и запустить по нему процесс согласования. Однако разработчики часто сталкиваются с проблемой: документ создается, но настроенный автозапуск процесса по шаблону не срабатывает. В журнале регистрации или при анализе событий выясняется, что у события создания документа отсутствует Автор, и система выдает ошибку: «Пользователь "" не имеет прав на предмет».

В этой статье мы подробно разберем, почему так происходит, как работает механизм бизнес-событий и как правильно настроить систему, чтобы программно созданные документы корректно инициировали бизнес-процессы.

Разберем причину проблемы: разница между реквизитом документа и автором события

Проанализируем ситуацию. Когда мы пишем код дополнительного обработчика, мы часто заполняем реквизит Подготовил или аналогичный ему. Рассмотрим пример кода, который создает внутренний документ:


ИмяНовДок = Событие.Источник.Ссылка;
АвторНовДок = ИмяНовДок.Подготовил;
ИсхДок = Событие.Источник.ВидДокумента.Наименование;
ИсхДокИмя = Событие.Источник;

Если ИсхДок = "Методика" Тогда
    НовДок = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
    // Заполняем реквизиты
    НовДок.Наименование = "Наименование";
    НовДок.Заголовок = "Приказ ВНД (" + ИсхДокИмя + ")";
    НовДок.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("приказ ВНД");
    НовДок.Папка = Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("ПриказыВНД");
    НовДок.ВопросДеятельности = Справочники.ВопросыДеятельности.НайтиПоНаименованию("Основная деятельность");
    НовДок.Подготовил = АвторНовДок;
    // Записываем документ
    НовДок.Записать();
КонецЕсли;

Казалось бы, мы указали пользователя в поле Подготовил. Однако для подсистемы автозапуска процессов этого недостаточно. В 1С:Документооборот старт процесса по шаблону привязан не к самому документу напрямую, а к записи в регистре сведений ПроизошедшиеБизнесСобытия.

Выясним причину сбоя: когда выполняется метод Записать(), система автоматически формирует запись о событии «Создание внутреннего документа». В этой записи есть поле Автор. Если код выполняется в контексте регламентного задания (фонового процесса), а у этого задания не назначен конкретный пользователь, поле Автор в бизнес-событии остается пустым. При попытке автозапуска процесса система проверяет права этого «пустого» пользователя. Естественно, прав у него нет, и процесс не стартует.

Решение №1: Настройка регламентного задания (Основной способ)

Самый простой и эффективный способ решить проблему — назначить ответственного пользователя для регламентного задания, которое отвечает за обработку событий. Рассмотрим по шагам, как это сделать:

  1. Перейдем в раздел Настройка и администрация — Поддержка и обслуживание — Регламентные и фоновые задания.
  2. Найдем в списке задание с наименованием Обработка произошедших бизнес-событий. Именно оно отвечает за чтение очереди событий и запуск алгоритмов обработчиков и шаблонов.
  3. Откроем карточку этого задания.
  4. В поле Пользователь выберем учетную запись. Рекомендуется использовать специально созданного технического пользователя (например, «Робот» или «Администратор системный») с полными правами или ролью Администратор.
  5. Нажмем Записать и закрыть.

Почему это работает? Теперь, когда фоновое задание будет запускать ваш код создания документа, сессия будет иметь контекст выбранного пользователя. Метод Записать() создаст событие, где в поле Автор будет значиться ваш «Робот». Система автозапуска увидит автора, проверит его права и успешно инициирует процесс.

Решение №2: Программный старт процесса в коде обработчика

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


// ... код создания документа НовДок из предыдущего примера ...
НовДок.Записать();

// Программный старт процесса по шаблону
ШаблонПроцесса = Справочники.ШаблоныСогласования.НайтиПоНаименованию("Шаблон для Приказов ВНД");
Если Не ШаблонПроцесса.Пустая() Тогда
    // Используем механизмы типовой конфигурации для создания процесса по шаблону
    БизнесПроцессСсылка = БизнесПроцессы.Согласование.СоздатьБизнесПроцесс();
    БизнесПроцессСсылка.Дата = ТекущаяДата();
    БизнесПроцессСсылка.Предметы[0].Предмет = НовДок.Ссылка;
    
    // Заполняем по шаблону
    БизнесПроцессСсылка.ЗаполнитьПоШаблону(ШаблонПроцесса);
    
    // Явно указываем автора процесса
    БизнесПроцессСсылка.Автор = АвторНовДок; 
    
    БизнесПроцессСсылка.Записать();
    БизнесПроцессСсылка.Старт();
КонецЕсли;

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

Важные нюансы при работе в 1С:Документооборот 2.0 и 2.1

Проанализируем дополнительные факторы, которые могут влиять на результат:

Подведем итог: если вы столкнулись с тем, что «автозапуск не видит автора», первым делом проверьте настройки регламентного задания Обработка произошедших бизнес-событий. В 90% случаев установка конкретного пользователя решает проблему полностью.

← На главную