Как в СКД оформить дополнительную шапку с общими итогами без дублирования строк?

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

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

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

Способ 1: Настройка параметра "Расположение общих итогов"

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

  1. Откройте настройки вашего отчета в схеме компоновки данных и перейдите на вкладку Другие настройки (это можно сделать как для всего отчета, так и для конкретной верхней группировки).
  2. Найдите параметр РасположениеОбщихИтогов.
  3. Установите для него значение Начало (по умолчанию там обычно стоит Авто или Конец).

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

Способ 2: Разделение структуры отчета на несколько независимых элементов

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

  1. Первый элемент (Шапка) — создаем группировку (например, по вычисляемому полю со строкой "Итоги"), в которой будут выводиться только нужные вам ресурсы. Для этой группировки в ее собственных "Других настройках" обязательно отключаем вывод заголовков, детальных записей и общих итогов.
  2. Второй элемент (Основная таблица) — добавляем вашу основную группировку с нужной иерархией и детальными записями.

Посмотрим на результат: поскольку эти элементы полностью независимы, первый элемент отработает исключительно как информационный блок с итоговыми цифрами, а второй выведет основной массив данных. Никаких "хвостов" в виде лишних пустых строк от первой группировки в основную таблицу не перейдет.

Способ 3: Группировка по пустому полю и отключение вывода группировок

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

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

При таком сценарии ресурсы в шапке останутся доступными для вывода через ваш макет, а сами физические строки группировки (и зависимые от нее пустые детальные записи) выводиться в табличный документ не будут. Это полностью уберет дублирование значений.

Способ 4: Использование пустого макета

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

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

Способ 5: Программное формирование отчета

Если макетами СКД не удается добиться идеального визуального результата (например, мешают системные отступы, нужно сложное объединение ячеек или динамическое скрытие колонок в шапке), шапку можно вывести программно через модуль объекта отчета.

Разберем по шагам логику перехвата генерации отчета в процедуре ПриКомпоновкеРезультата:


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

КонецПроцедуры

Используя этот метод, вы получаете 100% контроль над оформлением верхней части отчета. Вы можете нарисовать шапку в обычном табличном макете 1С, как вам угодно, а стандартную таблицу СКД аккуратно "пристыковать" снизу.

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

← На главную