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