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

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

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

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

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

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

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

Способ 2. Программная манипуляция макетом компоновки

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

Рассмотрим пример кода, который находит нужный макет и очищает его содержимое:


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

    // Далее стандартный вывод через ПроцессорКомпоновкиДанных
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициаilizar(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

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

Способ 3. Постобработка табличного документа

Если программная работа с макетами кажется слишком сложной, можно применить «грубую силу» — удаление строк непосредственно из результирующего ТабличногоДокумента. Рассмотрим подробнее, как это сделать правильно, чтобы не «поехала» структура при добавлении новых измерений.

Основная проблема здесь в том, что координаты строк заранее неизвестны. Чтобы сделать удаление «гибким», можно использовать метод НайтиТекст(). Мы можем искать специфический заголовок колонки во второй таблице и удалять всю строку, в которой он найден.


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

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

Способ 4. Хитрость с условным оформлением

Существует еще один «ленивый», но действенный способ — использование Условного оформления для конкретной группировки второй таблицы. Разберем этот прием:

  1. Зайдите в настройки второй таблицы (или группировки).
  2. Перейдите на закладку Условное оформление.
  3. Добавьте новое оформление. В параметрах установите Минимальная высота = 1 и Максимальная высота = 1.
  4. В качестве условия можно указать всегда истинное выражение (например, системное поле НомерПоПорядку > 0), а в области применения выбрать только Заголовок.

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

Способ 5. Объединение данных на уровне наборов данных

Иногда лучшим решением является отказ от двух отдельных таблиц в пользу одной. Посмотрим на ситуацию: если колонки одинаковые, возможно, стоит объединить два набора данных с помощью ОБЪЕДИНИТЬ ВСЕ в одном запросе. Чтобы визуально разделить данные, можно добавить техническое поле «ТипДанных» и сделать по нему группировку. В настройках этой группировки можно отключить вывод заголовков, и тогда данные из двух источников будут выводиться единым массивом с общей шапкой в самом начале.

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

← На главную