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