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