Как убрать шапку у конкретной таблицы в отчете СКД?

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

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

Стандартная настройка отключения заголовка группировки убирает только текстовое описание (например, «Таблица 2»), но сама шапка с именами колонок все равно выводится на печать. В этой статье мы подробно разберем, как решить эту проблему несколькими способами: от простых интерактивных настроек в схеме компоновки до программного управления выводом макетов.

Способ 1. Программный обход макетов компоновки (Решение «в лоб»)

Рассмотрим ситуацию, когда разработчик пытается решить проблему программным путем непосредственно в модуле объекта отчета. В процедуре ПриКомпоновкеРезультата перехватывается стандартный вывод, и в цикле обхода элементов процессора компоновки исключаются системные макеты, отвечающие за отрисовку «ненужной» шапки.

Проанализируем пример такого кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

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

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

Важное предупреждение: Хотя данный метод работает в текущий момент времени, использовать его на постоянной основе крайне не рекомендуется. Имена макетов вида Макет25 или Макет26 генерируются платформой 1С автоматически на основе текущей структуры схемы. Стоит вам изменить состав полей в запросе, добавить новую группировку или даже просто поменять их порядок, как платформа переиндексирует внутренние макеты. В результате ваша шапка может получить имя Макет28, а под фильтр удаления попадут критически важные строки детальных записей. Отчет будет безнадежно испорчен.

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

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

Этот способ позволяет переопределить макет вывода шапки только для конкретной группировки или таблицы в отчете СКД. Для этого мы свяжем собственный пустой макет с конкретной веткой настроек.

Разберем этот процесс по шагам:

  1. Переходим на вкладку «Настройки» в схеме компоновки данных.
  2. В структуре отчета находим вторую таблицу или ту конкретную группировку, шапку которой необходимо скрыть.
  3. Нажимаем на нее правой кнопкой мыши и выбираем пункт «Установить имя». Задаем понятное и уникальное имя, например: ВтораяТаблицаБезШапки.
  4. Переходим на вкладку «Макеты».
  5. Нажимаем кнопку добавить и выбираем пункт «Добавить макет заголовка группировки» (или «Добавить макет группировки» в зависимости от вашей структуры).
  6. В появившемся окне в поле «Имя группировки» указываем ранее созданное имя ВтораяТаблицаБезШапки.
  7. В качестве области макета в табличном документе выбираем пустую строку. Мы можем задать ей минимальную (нулевую) высоту.

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

Способ 3. Отключение шапки через стандартные «Другие настройки»

Иногда решить задачу можно гораздо проще — без написания кода и без создания макетов вручную. Достаточно точечно переопределить свойства отображения элементов компоновки.

Выясним, какие параметры на вкладке «Другие настройки» нам помогут:

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

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

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

  1. В настройках выбранной группировки второй таблицы найдем параметр «Тип макета» и установим его в значение «Вертикально».
  2. Перейдем на вкладку «Выбранные поля» именно этой группировки.
  3. Снимем флаг со стандартного значения «Авто» и оставим список выбранных полей абсолютно пустым.
  4. За счет вертикального расположения и отсутствия авто-полей система выведет строки детальных записей друг под другом без формирования общей горизонтальной строки заголовков.

Способ 5. Динамическое скрытие таблицы при отсутствии данных

Часто необходимость скрыть шапку возникает из-за того, что во второй таблице просто нет данных при определенных отборах. Выводить пустую «шапку-призрак» внизу отчета крайне неэстетично.

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

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    // 1. Проверяем, есть ли данные для вывода второй таблицы.
    // Для этого можно выполнить легкий вспомогательный запрос или проанализировать параметры.
    ЕстьДанныеДляВторойТаблицы = ПроверитьНаличиеДанных();

    Если Не ЕстьДанныеДляВторойТаблицы Тогда
        
        // Получаем рабочие настройки компоновщика
        РабочиеНастройки = КомпоновщикНастроек.Настройки;
        
        // Предположим, что вторая таблица — это второй элемент в корневой структуре отчета
        ИндексВторойТаблицы = 1; // Индексация начинается с 0
        
        Если РабочиеНастройки.Структура.Количество() > ИзбыточныйИндекс Тогда
            ЭлементСтруктуры = РабочиеНастройки.Структура[ИндексВторойТаблицы];
            // Полностью удаляем таблицу из структуры вывода
            РабочиеНастройки.Структура.Удалить(ЭлементСтруктуры);
        КонецЕсли;
        
    КонецЕсли;
    
    // 2. Далее запускаем стандартный механизм вывода с измененными настройками
    // СтандартнаяОбработка при этом остается Истина, система сама все выведет корректно
    
КонецПроцедуры

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

← На главную