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