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