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