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