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