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

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

При интеграции нетиповых документов в экосистему конфигурации «1С:Документооборот» (1С:ДО) разработчики часто сталкиваются с задачей автоматизации бизнес-процессов (БП). Типичный сценарий: пользователь создает и проводит документ (например, «Заявка»), и система должна автоматически направить этот документ по типовому маршруту «Исполнение» определенным сотрудникам.

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


Выясняем причину ошибки «Свойства_ОписаниеДополнительныхРеквизитов»

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

Поле объекта не обнаружено Свойства_ОписаниеДополнительныхРеквизитов

Эта ошибка связана с особенностями работы встроенной в 1С:ДО Библиотеки стандартных подсистем (БСП), а именно подсистемы «Свойства» (управление дополнительными реквизитами и сведениями). Разберем механизм сбоя по шагам:

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

Почему программный старт БП в «Обработке проведения» — это плохая практика?

Опытные разработчики сходятся во мнении, что создание и старт бизнес-процессов в модуле проведения документа — архитектурная ошибка. Рассмотрим основные причины:


Решение 1. Программное создание БП по кнопке на форме (безопасный способ)

Чтобы избежать транзакционных ошибок, создание бизнес-процесса следует выносить во внетранзакционный сектор. Самый простой и надежный способ — добавить на форму документа кнопку «Отправить на исполнение» (или «Создать бизнес-процесс»). Пользователь проводит документ, а затем осознанно запускает процесс нажатием кнопки.

Проанализируем пример правильного программного создания бизнес-процесса Исполнение и заполнения его реквизитов. Нам необходимо прикрепить наш нетиповой документ в качестве Предмета процесса, заполнить исполнителей, контролера и запустить БП.

Создадим на сервере процедуру, которая будет вызываться при нажатии кнопки на форме документа:


&НаСервере
Процедура СоздатьБизнесПроцессИсполнениеНаСервере(СсылкаНаДокумент)
    
    // 1. Создаем объект бизнес-процесса
    БП = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
    
    // Заполняем базовые реквизиты
    БП.Дата = ТекущаяДата();
    БП.Автор = ПараметрыСеанса.ТекущийПользователь;
    БП.Важность = Перечисления.ВариантыВажностиЗадачи.Обычная;
    БП.ВариантИсполнения = Перечисления.ВариантыМаршрутизацииЗадач.Последовательно;
    БП.ВариантУстановкиСрокаОбработкиРезультатов = Перечисления.ВариантыУстановкиСрокаИсполнения.ОтносительныйСрок;
    
    БП.Наименование = "Исполнить заявку: " + Строка(СсылкаНаДокумент);
    БП.Описание = "Просим обработать заявку в соответствии с регламентом. Подробности во вложении.";
    
    // 2. Добавляем нетиповой документ в табличную часть "Предметы"
    // Это ключевой момент для связки документа и процесса!
    СтрокаПредметы = БП.Предметы.Добавить();
    СтрокаПредметы.Предмет = СсылкаНаДокумент;
    // Обязательно указываем роль предмета (Основной, Вспомогательный и т.д.)
    СтрокаПредметы.РольПредмета = Перечисления.РолиПредметовВТранспортномКонтейнере.Основной;
    СтрокаПредметы.ИмяПредмета = "Заявка";
    
    // 3. Заполняем табличную часть "Исполнители"
    СтрокаИсполнители = БП.Исполнители.Добавить();
    СтрокаИсполнители.Исполнитель = СсылкаНаДокумент.ОтветственныйИсполнитель; // Пример реквизита документа
    СтрокаИсполнители.СрокИсполнения = ТекущаяДата() + (24 * 60 * 60); // Срок + 1 день
    
    // 4. Заполняем контролирующих лиц
    БП.Проверяющий = СсылкаНаДокумент.РуководительПодразделения;
    БП.СрокОбработкиРезультатов = ТекущаяДата() + (2 * 24 * 60 * 60); // Срок проверки + 2 дня
    БП.Контролер = СсылкаНаДокумент.Подготовил;
    БП.КоличествоИтераций = 1;
    
    // 5. Записываем бизнес-процесс
    Попытка
        БП.Записать();
        
        // 6. Запускаем бизнес-процесс
        БП.Старт();
        
        Сообщить("Бизнес-процесс успешно создан и запущен!");
    Исключение
        ВызватьИсключение "Не удалось запустить процесс: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;

КонецПроцедуры

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


Решение 2. Оптимизация через использование готовых Шаблонов БП

Прописывать всех исполнителей, сроки и важность жестко в программном коде — плохой тон разработки. Если завтра изменятся регламентные сроки или состав исполнителей, вам придется переписывать код и обновлять конфигурацию у клиентов. Правильнее использовать механизм Шаблонов бизнес-процессов, настроенных в пользовательском режиме.

Давайте посмотрим, как инициализировать бизнес-процесс на основании готового шаблона:


&НаСервере
Функция СоздатьБППоШаблону(СсылкаНаДокумент, СсылкаНаШаблон) Экспорт
    
    Если Не ЗначениеЗаполнено(СсылкаНаШаблон) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    БП = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
    БП.УстановитьНовыйНомер();
    БП.Дата = ТекущаяДата();
    БП.Автор = ПараметрыСеанса.ТекущийПользователь;
    
    // Заполняем реквизиты БП из предопределенного шаблона
    БП.ЗаполнитьПоШаблону(СсылкаНаШаблон);
    
    // Привязываем наш документ к заполненному по шаблону процессу
    СтрокаПредметы = БП.Предметы.Добавить();
    СтрокаПредметы.Предмет = СсылкаНаДокумент;
    СтрокаПредметы.РольПредмета = Перечисления.RolesПредметов.Основной; // Имя перечисления зависит от версии ДО
    СтрокаПредметы.ИмяПредмета = "ОсновнойДокумент";
    
    БП.Записать();
    Возврат БП.Ссылка;
    
КонецФункции

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


Решение 3. Фоновый (асинхронный) старт процесса

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

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


// Вместо БП.Старт() используем фоновую очередь:
БП.Записать();

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

Это гарантирует мгновенный отклик интерфейса для пользователя и исключает любые конфликты блокировок СУБД.


Решение 4. Настройка автостарта без написания кода

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

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

Использование типового функционала автостарта — самый приоритетный путь решения подобных задач, так как он полностью сохраняет поддержку конфигурации и гарантирует отсутствие транзакционных ошибок БСП.

← На главную