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