При разработке отчетов на схеме компоновки данных (СКД) программисты часто сталкиваются с требованиями заказчиков к оформлению. Одно из классических пожеланий — расположить заголовок отчета строго по центру. Если количество колонок в отчете фиксировано, задача решается тривиально. Но как быть, если состав колонок динамически меняется (например, в зависимости от выбранных настроек, группировок или параметров их может быть от 1 до 100)?
Стандартный заголовок СКД, который настраивается на вкладке «Другие настройки», выводится по левому краю. Попытки центрировать его стандартными средствами условного оформления часто не дают нужного результата, так как платформа не знает заранее финальную ширину таблицы. В этой статье мы подробно разберем три эффективных способа центрирования заголовка отчета: от гибких программных методов до настройки макета без единой строчки кода.
Прежде чем перейти к решениям, выясним причину проблемы. Стандартный заголовок СКД выводится в самую первую ячейку первой строки табличного документа. Если мы просто применим к этой ячейке условное оформление с выравниванием по центру, текст центрируется только внутри этой конкретной ячейки (колонки), а не по всей ширине сформированного отчета. Для того чтобы заголовок располагался по центру всего листа, нам нужно растянуть его на всю ширину таблицы. Рассмотрим, как это сделать.
---
Этот способ по праву считается лучшим. Объединение ячеек в табличном документе часто называют «плохим тоном» в разработке 1С, поскольку оно нарушает структуру документа при экспорте в форматы Excel или PDF, ломает ширину колонок при автоматическом подборе и мешает пользователям выделять данные. Свойство ПоВыделеннымКолонкам позволяет визуально распределить текст по центру группы ячеек без их физического объединения.
Для реализации этого метода мы перехватим процесс формирования отчета в модуле объекта отчета. Разберем по шагам, как написать этот обработчик:
ПриКомпоновкеРезультата.Ложь, чтобы самостоятельно управлять выводом отчета.Ниже представлен готовый листинг кода, который решает поставленную задачу:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отменяем стандартный вывод отчета
СтандартнаяОбработка = Ложь;
// Инициализируем схему и настройки
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
// Создаем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Начинаем постобработку сформированного документа
// Определяем финальное количество колонок в таблице
ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;
Если ШиринаТаблицы > 0 Тогда
// Традиционно стандартный заголовок СКД выводится в первой строке.
// Выделяем область первой строки от первой до последней колонки.
ОбластьЗаголовка = ДокументРезультат.Область(1, 1, 1, ШиринаТаблицы);
// Устанавливаем горизонтальное положение по центру
ОбластьЗаголовка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
// Включаем распределение текста по выделенным колонкам без объединения
ОбластьЗаголовка.ПоВыделеннымКолонкам = Истина;
КонецЕсли;
КонецПроцедуры
Преимущество метода: Заголовок всегда будет строго по центру, независимо от того, вывелось в отчет 2 колонки или 100. При этом структура ячеек останется нетронутой, что гарантирует корректное поведение отчета при выгрузке в Excel.
---
Если специфика оформления отчета требует жесткого объединения (например, если вокруг заголовка должна быть отрисована красивая рамка или задан особый фоновый цвет для всей области заголовка), можно воспользоваться методом Объединить().
Процесс подготовки отчета аналогичен первому способу, однако логика работы с полученной областью будет отличаться. Проанализируем пример кода постобработки:
// ... (код формирования ДокументРезультат аналогичен Способу 1)
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;
Если ШиринаТаблицы > 1 Тогда
Попытка
// Выбираем область первой строки (строка заголовка)
ОбластьЗаголовка = ДокументРезультат.Область(1, 1, 1, ШиринаТаблицы);
// Физически объединяем ячейки строки в одну большую ячейку
ОбластьЗаголовка.Объединить();
// Выравниваем текст по центру объединенной области
ОбластьЗаголовка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
// Дополнительно можно задать рамку или цвет фона
ОбластьЗаголовка.ЦветФона = Новый Цвет(240, 240, 240); // Светло-серый фон
Исключение
ЗаписьЖурналаРегистрации("Оформление заголовка", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось объединить ячейки заголовка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Важное замечание: Если в вашем отчете включен вывод параметров или отборов выше самого заголовка, первая строка табличного документа может содержать не заголовок, а другую информацию. В таком случае перед объединением рекомендуется выполнить цикл по первым строкам документа, найти строку, содержащую текст вашего заголовка (например, с помощью метода НайтиТекст()), и объединять именно её.
---
Рассмотрим ситуацию, когда писать код в модуле объекта запрещено требованиями к разработке (например, если вы разрабатываете отчет в рамках распределенной базы данных или используете жестко стандартизированные внешние отчеты без возможности менять их модули). В этом случае нам поможет механизм макетов СКД.
Разберем этот процесс детально по шагам:
ЗаголовокОтчета.ЗаголовокОтчета) и тип макета — Заголовок.[ПараметрыДанных.НазваниеОтчета].Когда процессор компоновки данных начнет вывод отчета, он встретит группировку ЗаголовокОтчета, обратится к созданному нами макету и выведет область, отформатированную по центру выделенных колонок. Поскольку реальная таблица отчета сожмет неиспользуемые колонки макета, заголовок распределится ровно по ширине фактически выведенных колонок.
---
Мы проанализировали три различных подхода к решению одной интерфейсной задачи. Подведем итоги, какой из них выбрать: