Как вывести в один отчет СКД несколько независимых наборов данных без дублирования строк?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки отчетов на базе Системы Компоновки Данных (СКД) возникает задача вывода данных, которые логически не связаны между собой. Например, нам нужно отобразить одну итоговую строку с общими показателями и рядом или ниже — детализированную таблицу, полученную из временной таблицы. Если просто добавить эти наборы в один запрос или не настроить связи правильно, СКД попытается выполнить декартово произведение, что приведет к многократному дублированию строк. Давайте разберем, как грамотно решить эту задачу.

Решение 1: Использование набора данных типа «Объект»

Одним из самых гибких и надежных способов является использование набора данных Объект. Этот метод позволяет полностью отвязать процесс получения данных от ограничений SQL-запроса Системы Компоновки Данных. Мы можем программно подготовить данные в модуле объекта отчета, превратив их в две независимые таблицы.

Рассмотрим порядок действий:

  1. В схеме компоновки данных добавьте два набора данных с типом Объект. Назовите их, например, «Итоги» и «Детализация».
  2. Перейдите в модуль объекта отчета и используйте процедуру ПриКомпоновкеРезультата.
  3. В этой процедуре выполните необходимые запросы для получения данных и поместите результат в ТаблицаЗначений.
  4. Передайте эти таблицы в настройки КомпоновщикНастроек, чтобы СКД могла их использовать.

Такой подход позволяет нам программно контролировать содержимое каждой таблицы. Поскольку данные передаются как объекты, СКД воспринимает их как независимые источники, и мы можем вывести их в отчет как две последовательные группировки, не опасаясь дублей.


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получаем настройки и схему
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    Схема = ПолучитьМакетКомпоновкиДанных();
    
    // Подготавливаем данные
    ТЗ_Итоги = ПолучитьДанныеИтогов(); // Ваша функция запроса
    ТЗ_Детализация = ПолучитьДанныеВТ(); // Ваша функция запроса
    
    // Создаем внешние наборы данных
    ВнешниеНаборы = Новый Структура;
    ВнешниеНаборы.Вставить("Итоги", ТЗ_Итоги);
    ВнешниеНаборы.Вставить("Детализация", ТЗ_Детализация);
    
    // Инициализируем процессор
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
    
    // Выводим результат
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

Решение 2: Использование вложенных схем компоновки

Если программная реализация кажется вам избыточной, можно воспользоваться механизмом Вложенных схем. Этот метод позволяет создать отчет внутри отчета, что идеально подходит для разделения логики «итоговой строки» и «детальной таблицы».

Разберем, как это реализовать:

  1. Создайте основную схему компоновки, которая будет отвечать за вывод итоговой строки.
  2. В настройках этой схемы добавьте новый элемент Вложенная схема.
  3. Внутри вложенной схемы создайте отдельный набор данных, который будет содержать ваш запрос к временной таблице.
  4. В настройках отчета для вложенной схемы вы можете задать свои параметры, фильтры и группировки.

Преимущество данного метода заключается в том, что вложенная схема работает в изолированном контексте. СКД выполняет ее как отдельный запрос, а затем просто вставляет полученный табличный документ в общую структуру отчета. Это полностью исключает конфликт между структурами наборов данных и избавляет от проблем с лишним дублированием строк.

Важные рекомендации

Когда вы работаете с несколькими наборами данных, помните о следующем:

Проанализировав оба метода, мы рекомендуем начинать с Вложенных схем, так как они позволяют решить задачу стандартными средствами конфигуратора без необходимости писать объемный код в модуле объекта. Если же данных очень много или логика их получения требует сложных промежуточных расчетов, тогда Набор данных: Объект станет вашим лучшим инструментом.

← На главную