При разработке сложных отчетов в Системе компоновки данных (СКД) часто возникает задача вывода нескольких таблиц в одном документе. Источником данных для них может служить один и тот же набор данных, но с разными группировками. При этом нередко требуется скрыть шапку (заголовки колонок) у одной из таблиц (например, у второй), чтобы отчет выглядел лаконично и не перегружал пользователя дублирующей информацией.
Стандартная настройка отключения заголовка группировки убирает только текстовое описание (например, «Таблица 2»), но сама шапка с именами колонок все равно выводится на печать. В этой статье мы подробно разберем, как решить эту проблему несколькими способами: от простых интерактивных настроек в схеме компоновки до программного управления выводом макетов.
Рассмотрим ситуацию, когда разработчик пытается решить проблему программным путем непосредственно в модуле объекта отчета. В процедуре ПриКомпоновкеРезультата перехватывается стандартный вывод, и в цикле обхода элементов процессора компоновки исключаются системные макеты, отвечающие за отрисовку «ненужной» шапки.
Проанализируем пример такого кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод;
МакетСтрока = ПроцессорКомпоновки.Следующий;
Пока МакетСтрока <> Неопределено Цикл
// Методом отладки определяем имена системных макетов шапки второй таблицы
Если МакетСтрока.Макет = "Макет25" Или МакетСтрока.Макет = "Макет26" Тогда
МакетСтрока = ПроцессорКомпоновки.Следующий;
Продолжить; // Пропускаем вывод этих макетов
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(МакетСтрока);
МакетСтрока = ПроцессорКомпоновки.Следующий;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод;
КонецПроцедуры
Важное предупреждение: Хотя данный метод работает в текущий момент времени, использовать его на постоянной основе крайне не рекомендуется. Имена макетов вида Макет25 или Макет26 генерируются платформой 1С автоматически на основе текущей структуры схемы. Стоит вам изменить состав полей в запросе, добавить новую группировку или даже просто поменять их порядок, как платформа переиндексирует внутренние макеты. В результате ваша шапка может получить имя Макет28, а под фильтр удаления попадут критически важные строки детальных записей. Отчет будет безнадежно испорчен.
Поэтому давайте рассмотрим более надежные, гибкие и стандартные методы решения этой задачи.
Этот способ позволяет переопределить макет вывода шапки только для конкретной группировки или таблицы в отчете СКД. Для этого мы свяжем собственный пустой макет с конкретной веткой настроек.
Разберем этот процесс по шагам:
ВтораяТаблицаБезШапки.ВтораяТаблицаБезШапки.При формировании отчета система увидит, что для вывода заголовков полей данной именованной группировки назначен индивидуальный макет. Вместо стандартной шапки СКД выведет нашу пустую область нулевой высоты, и визуально шапка полностью исчезнет, в то время как первая таблица продолжит выводиться со стандартным оформлением.
Иногда решить задачу можно гораздо проще — без написания кода и без создания макетов вручную. Достаточно точечно переопределить свойства отображения элементов компоновки.
Выясним, какие параметры на вкладке «Другие настройки» нам помогут:
Существует интересный трюк, который позволяет избавиться от стандартной горизонтальной шапки для подчиненных или детальных записей:
Часто необходимость скрыть шапку возникает из-за того, что во второй таблице просто нет данных при определенных отборах. Выводить пустую «шапку-призрак» внизу отчета крайне неэстетично.
Вместо жесткого кодирования индексов макетов в коде, мы можем программно проверить, есть ли данные для вывода второй таблицы. Если данных нет, мы просто удалим этот элемент структуры из настроек компоновщика перед выводом отчета. Это наиболее изящный и безопасный способ программного управления структурой.
Проанализируем пример реализации такого подхода в модуле объекта отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// 1. Проверяем, есть ли данные для вывода второй таблицы.
// Для этого можно выполнить легкий вспомогательный запрос или проанализировать параметры.
ЕстьДанныеДляВторойТаблицы = ПроверитьНаличиеДанных();
Если Не ЕстьДанныеДляВторойТаблицы Тогда
// Получаем рабочие настройки компоновщика
РабочиеНастройки = КомпоновщикНастроек.Настройки;
// Предположим, что вторая таблица — это второй элемент в корневой структуре отчета
ИндексВторойТаблицы = 1; // Индексация начинается с 0
Если РабочиеНастройки.Структура.Количество() > ИзбыточныйИндекс Тогда
ЭлементСтруктуры = РабочиеНастройки.Структура[ИндексВторойТаблицы];
// Полностью удаляем таблицу из структуры вывода
РабочиеНастройки.Структура.Удалить(ЭлементСтруктуры);
КонецЕсли;
КонецЕсли;
// 2. Далее запускаем стандартный механизм вывода с измененными настройками
// СтандартнаяОбработка при этом остается Истина, система сама все выведет корректно
КонецПроцедуры
Используя этот метод, вы гарантируете, что отчет не сформирует лишних областей и пустых шапок на листах печати, а структура компоновщика при этом не пострадает от некорректных обращений к автогенерируемым макетам платформы.