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

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

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

Рассмотрим подробнее, как корректно выгрузить данные из трех независимых источников и красиво оформить их в рамках одной схемы компоновки данных.

Способ 1. Использование набора данных типа «Объединение»

Проанализируем первый подход. Он заключается в том, чтобы объединить результаты всех трех запросов в рамках одного родительского набора данных. Этот способ идеально подходит, если данные выводится в общую структуру или обрабатываются единообразно.

Разберем процесс настройки по шагам:

  1. Перейдем на вкладку Наборы данных в схеме компоновки данных.
  2. Добавим новый набор данных типа Объединение и укажем для него понятное имя (например, НаборДанныхОбщиеСведения).
  3. Внутри этого объединения создадим три дочерних набора данных типа Запрос.
  4. В каждом запросе напишем свою выборку. Главное правило — для полей, уникальных для каждого блока, необходимо задать соответствующие псевдонимы, а поля из других блоков заполнять пустыми значениями (например, ВЫБОР NULL, 0 или пустой строкой "").
  5. На вкладке Настройки сформируем структуру отчета и выберем нужные поля.

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

Способ 2. Создание независимых наборов данных с последовательными группировками

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

Рассмотрим порядок действий для этого сценария:

  1. На вкладке Наборы данных создадим три отдельных независимых набора данных типа Запрос (например, НаборДеньги, НаборИмущество, НаборУслуги).
  2. Убедимся, что поля каждого набора имеют уникальные имена, чтобы платформа не вызывала конфликт имен.
  3. Перейдем на вкладку Связи наборов данных и оставим её пустой, так как связи между ними отсутствуют.
  4. Перейдем на вкладку Настройки и создадим на верхнем уровне отчета три последовательные группировки (одна под другой).
  5. Для первой группировки в состав Выбранных полей включим поля строго из первого набора данных, для второй — из второго, для третьей — из третьего.

При формировании отчета платформа последовательно выведет данные всех трех группировок друг за другом в один табличный документ без ошибки о не связанных наборах.

Способ 3. Точечная настройка пользовательских макетов

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

  1. Перейдем на вкладку Макеты и создадим макет группировки или макет заголовка для каждого из трех независимых блоков.
  2. Выделим ячейки в области макета и зададим им тип заполнения (Параметр или Шаблон).
  3. Сопоставим каждый параметр макета с соответствующим выражением поля из соответствующего набора данных.
  4. Убедимся, что макеты привязаны именно к тем группировкам, которые отвечают за вывод нужного набора данных.

Способ 4. Программный вывод через модуль отчета

В случаях, когда стандартных настроек группировок недостаточно (например, при необходимости горизонтального размещения блоков или сложной логики с помощью метода Присоединить()), следует использовать программный вывод.

Разберем пример кода в модуле объекта отчета при переопределении события ПриКомпоновкеРезультата:


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

Для горизонтального совмещения двух несвязанных блоков первый блок выводится методом Вывести(), а данные второго блока присоединяются правее с использованием метода Присоединить() табличного документа.

Важные ограничения и особенности

При работе с несвязанными наборами данных стоит учитывать ключевые особенности платформы 1С:

Таким образом, использование набора данных Объединение или создание независимых группировок позволяет легко решить задачу вывода трех различных запросов в один макет без лишних соединений данных.

← На главную