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