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

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

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

Особенности и ограничения платформы 1С

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

  1. Единая сетка колонок. В объекте ТабличныйДокумент ширина колонок является сквозной по всей высоте документа. Если объединяемые отчеты имеют разное количество колонок или разную требуемую ширину, второй отчет визуально подстроится под сетку первого отчета.
  2. Механизм расшифровки. Переменная ДанныеРасшифровки по умолчанию хранит контекст одного отчета. При последовательном выводе второго отчета стандартный контекст расшифровки может перезаписаться, из-за чего двойной клик мыши будет работать корректно только для нижнего блока данных.
  3. Фиксация шапок. Свойство ФиксацияСверху распространяется на весь документ в целом, поэтому зафиксировать заголовки отдельно для каждой таблицы при прокрутке стандартными средствами не удастся.

Способ 1. Программный последовательный вывод в один ТабличныйДокумент

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

Посмотрим на пример программного кода:


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

Если требуется, чтобы каждый отчет начинался с нового листа при печати, вместо пустого блока строк можно использовать метод ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц().

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

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

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

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

Способ 3. Использование механизма «Вложенные схемы»

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

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

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

← На главную