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