При тонкой настройке внешнего вида отчетов в системе компоновки данных разработчики часто сталкиваются с неожиданным поведением: после задания произвольного диапазона ячеек для макета группировки и сохранения схемы компоновки данных (СКД) границы области сбрасываются на всю строку целиком, а оформленные ячейки смещаются к левому краю. Проанализируем, почему платформа ведет себя именно так и как правильно настраивать макеты группировок и полей.
Выясним причину такого поведения редактора схемы компоновки данных. Табличный документ на вкладке Макеты не является классическим монолитным листом, как в обычных отчетах или печатных формах объектов.
Рассмотрим внутреннюю структуру схемы компоновки данных:
МакетОбластиКомпоновкиДанных.Кроме того, семантика макета напрямую диктует требования к его размерам. Объект Макет группировки отвечает за вывод строки отчета целиком (или нескольких строк группировки). Если разработчик выделяет для группировки ограниченный диапазон (например, R1C3:R1C5), платформа при валидации и нормализации схемы приводит макет строки к стандартному виду, растягивая его на всю строку (R1:R1). В результате относительные координаты ячеек смещаются к первой колонке, что визуально воспринимается как сдвиг влево и сброс границ.
Разберем по шагам, как правильно верстать строки отчета в СКД, чтобы избежать произвольного искажения формы:
R...), либо прямоугольный диапазон, начинающийся строго с первой колонки (R...C1:R...Cn).Автополе.Если требования к оформлению отчета не укладываются в ограничения встроенного редактора макетов СКД, наиболее надежным решением является перенос постобработки в код модуля отчета. Рассмотрим пример перехвата вывода в процедуре ПриКомпоновкеРезультата с использованием объектов КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
Такой подход позволяет полностью контролировать процесс вывода строк, при необходимости обращаться к секциям классического макета табличного документа через ПолучитьОбласть() и выводить нестандартные элементы оформления без риска их сброса конструктором СКД.