Как сделать заголовок СКД по центру при динамическом количестве колонок?

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

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

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

Почему стандартные методы не работают?

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

---

Способ 1. Программный метод «По выделенным колонкам» (Рекомендуемый)

Этот способ по праву считается лучшим. Объединение ячеек в табличном документе часто называют «плохим тоном» в разработке 1С, поскольку оно нарушает структуру документа при экспорте в форматы Excel или PDF, ломает ширину колонок при автоматическом подборе и мешает пользователям выделять данные. Свойство ПоВыделеннымКолонкам позволяет визуально распределить текст по центру группы ячеек без их физического объединения.

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

  1. Откройте модуль объекта вашего отчета.
  2. Создайте или найдите предопределенную процедуру ПриКомпоновкеРезультата.
  3. Установите стандартную обработку в значение Ложь, чтобы самостоятельно управлять выводом отчета.
  4. Сформируйте документ программно, а затем примените форматирование к области заголовка.

Ниже представлен готовый листинг кода, который решает поставленную задачу:


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

Преимущество метода: Заголовок всегда будет строго по центру, независимо от того, вывелось в отчет 2 колонки или 100. При этом структура ячеек останется нетронутой, что гарантирует корректное поведение отчета при выгрузке в Excel.

---

Способ 2. Программное объединение ячеек

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

Процесс подготовки отчета аналогичен первому способу, однако логика работы с полученной областью будет отличаться. Проанализируем пример кода постобработки:


// ... (код формирования ДокументРезультат аналогичен Способу 1)
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);  

ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;

Если ШиринаТаблицы > 1 Тогда
    Попытка
        // Выбираем область первой строки (строка заголовка)
        ОбластьЗаголовка = ДокументРезультат.Область(1, 1, 1, ШиринаТаблицы);
        
        // Физически объединяем ячейки строки в одну большую ячейку
        ОбластьЗаголовка.Объединить();
        
        // Выравниваем текст по центру объединенной области
        ОбластьЗаголовка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
        
        // Дополнительно можно задать рамку или цвет фона
        ОбластьЗаголовка.ЦветФона = Новый Цвет(240, 240, 240); // Светло-серый фон
    Исключение
        ЗаписьЖурналаРегистрации("Оформление заголовка", УровеньЖурналаРегистрации.Предупреждение, , , 
            "Не удалось объединить ячейки заголовка: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Важное замечание: Если в вашем отчете включен вывод параметров или отборов выше самого заголовка, первая строка табличного документа может содержать не заголовок, а другую информацию. В таком случае перед объединением рекомендуется выполнить цикл по первым строкам документа, найти строку, содержащую текст вашего заголовка (например, с помощью метода НайтиТекст()), и объединять именно её.

---

Способ 3. Индивидуальный макет группировки (Без программирования)

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

Разберем этот процесс детально по шагам:

  1. Перейдите на вкладку Настройки вашего отчета СКД. В окне «Другие настройки» найдите параметр Выводить заголовок и установите его значение в Не выводить. Это отключит стандартный левосторонний заголовок.
  2. В структуре настроек отчета добавьте новую группировку. При создании не указывайте для нее никаких полей группировки (оставьте поле пустым). Перетащите эту группировку на самый верх структуры — она должна быть самым первым элементом отчета.
  3. Выделите созданную пустую группировку и настройте её свойства в нижней части экрана:
    • Установите свойство Имя в значение, например, ЗаголовокОтчета.
    • Свойство Вариант использования группировки установите в значение Дополнительная информация.
    • Свойство Макет оформления установите в значение Без оформления.
  4. Перейдите на вкладку Макеты схемы компоновки данных.
  5. Нажмите кнопку Добавить макет группировки. В появившемся окне выберите имя нашей группировки (ЗаголовокОтчета) и тип макета — Заголовок.
  6. Перед вами откроется поле табличного документа макета. Выделите область ячеек первой строки с запасом (например, с 1-й по 50-ю колонку). Нажмите на них правой кнопкой мыши и откройте Свойства:
    • Впишите в эту область текст вашего заголовка. Можно использовать параметры или шаблоны, например: [ПараметрыДанных.НазваниеОтчета].
    • В свойстве ячейки Горизонтальное положение выберите значение Центр.
    • Свойство По выделенным колонкам установите в значение Истина.

Когда процессор компоновки данных начнет вывод отчета, он встретит группировку ЗаголовокОтчета, обратится к созданному нами макету и выведет область, отформатированную по центру выделенных колонок. Поскольку реальная таблица отчета сожмет неиспользуемые колонки макета, заголовок распределится ровно по ширине фактически выведенных колонок.

---

Резюме и рекомендации

Мы проанализировали три различных подхода к решению одной интерфейсной задачи. Подведем итоги, какой из них выбрать:

← На главную