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