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