При разработке расширений для типовых конфигураций на базе БСП (Библиотека стандартных подсистем), таких как Управление торговлей 11.5 или ERP 2.5, часто возникает задача включить новый или измененный документ в дерево связанных объектов (структуру подчиненности). Рассмотрим по шагам, как правильно реализовать эту задачу, проанализируем типичные ошибки и разберем программные способы вывода данных. Для более сложных случаев может потребоваться доработка отчета "Связанные документы", позволяющая выводить объекты из любых расширений без изменения основной конфигурации.
Прежде всего, проанализируем ситуацию: чтобы система понимала, какой документ является «родителем», в подчиненном документе должен существовать реквизит, хранящий ссылку на документ-основание. В нашем примере мы работаем с документом ПередачаТоваровМеждуОрганизациями, который должен ссылаться на ПриобретениеТоваровУслуг.
ПередачаТоваровМеждуОрганизациями в расширение.ДокОснование.ДокументСсылка.ПриобретениеТоваровУслуг.Важный нюанс: Просто создать реквизит в метаданных недостаточно. Как справедливо отмечено в обсуждении, система не сможет «автомагически» догадаться, какая именно «Приобретение» связано с конкретной «Передачей». Нам необходимо обеспечить физическое заполнение этого поля данными. Для этой задачи подойдёт автозаполнение реквизитов по заданным условиям.
Рассмотрим процесс заполнения. Чаще всего связь устанавливается в момент создания документа на основании. Нам нужно прописать логику в модуле объекта подчиненного документа. Если вам требуется инструмент для гибкой настройки таких связей без написания кода, обратите внимание на решение для создания объектов на основании других объектов с возможностью указания значений реквизитов. Удобнее через конструктор правил заполнения документов на основании.
Разберем пример кода для процедуры ОбработкаЗаполнения:
&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
// Записываем ссылку на документ-основание в наш новый реквизит
ЭтотОбъект.ДокОснование = ДанныеЗаполнения;
КонецЕсли;
КонецПроцедуры
Без этой записи в базу данных критерий отбора не найдет никаких связей, так как реквизит будет пустым.
Типовой механизм БСП для построения дерева связей использует критерий отбора СвязанныеДокументы. Проанализируем, как правильно добавить в него наш реквизит через расширение.
В конфигураторе расширения найдем критерий отбора СвязанныеДокументы, заимствуем его и в поле Состав отметим галочкой наш новый реквизит ДокОснование документа ПередачаТоваровМеждуОрганизациями. Это позволит стандартным запросам БСП включать наш документ в выборку при поиске «сверху вниз» (от родителя к детям).
Выясним причину, по которой кнопка «Связанные документы» может не отображаться или работать некорректно. В БСП за вывод формы отвечает общая команда СвязанныеДокументы. Нам нужно убедиться, что тип нашего документа включен в Тип параметра команды этой команды в расширении. Если тип не указан, форма просто не получит контекст текущего объекта.
Иногда стандартный механизм критериев отбора не подходит (например, из-за ограничений совместимости или сложной логики связей). В этом случае рассмотрим программный метод переопределения через общую форму СвязанныеДокументы. Мы можем вмешаться в процесс построения дерева, используя специальную доработку структуры подчиненности. Посмотрим на пример реализации, где мы явно указываем реквизиты для поиска:
&Вместо("ВывестиРодительскиеОбъекты")
Процедура Расш1_ВывестиРодительскиеОбъекты(ТекущийОбъект, ДеревоРодитель)
Если ТипЗнч(ТекущийОбъект) = Тип("ДокументСсылка.ПередачаТоваровМеждуОрганизациями") Тогда
// Явно указываем системе, какой реквизит является ссылкой на родителя
Реквизиты = Новый Массив;
РеквизитМетаданных = Метаданные.Документы.ПередачаТоваровМеждуОрганизациями.Реквизиты.ДокОснование;
Реквизиты.Добавить(РеквизитМетаданных);
// Далее вызывается типовая логика обработки этих реквизитов
// ...
КонецЕсли;
КонецПроцедуры
Этот метод полезен, когда нужно отобразить связь «вверх» (родительские объекты), основываясь на структуре метаданных документа.
Проанализируем дополнительные требования современных версий БСП. На практике подобные механизмы часто применяются для специфических бизнес-задач, таких как создание чеков ККМ на основании заказа клиента или ввод счета на оплату на основании реализации в обход стандартных форм (поможет создание объектов на основании других документов). При реализации таких связей (особенно если используется пакетное создание актов выполненных работ), важно учитывать следующее:
Чтение и Просмотр как нового реквизита, так и самого критерия отбора.Резюме: Для успешного добавления документа в структуру подчиненности необходимо выполнить три обязательных условия: физическое наличие реквизита-ссылки в документе, обязательное заполнение этого реквизита при создании документа и включение реквизита в состав критерия отбора СвязанныеДокументы. Использование программных методов в общих модулях требуется только в исключительных случаях, когда стандартная логика БСП не справляется с отображением специфических связей.