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