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