Почему слетают области и смещаются ячейки в макетах СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При тонкой настройке внешнего вида отчетов в системе компоновки данных разработчики часто сталкиваются с неожиданным поведением: после задания произвольного диапазона ячеек для макета группировки и сохранения схемы компоновки данных (СКД) границы области сбрасываются на всю строку целиком, а оформленные ячейки смещаются к левому краю. Проанализируем, почему платформа ведет себя именно так и как правильно настраивать макеты группировок и полей.

Архитектурные особенности хранения макетов в СКД

Выясним причину такого поведения редактора схемы компоновки данных. Табличный документ на вкладке Макеты не является классическим монолитным листом, как в обычных отчетах или печатных формах объектов.

Рассмотрим внутреннюю структуру схемы компоновки данных:

  1. Каждая созданная область сохраняется платформой как отдельный самостоятельный объект — МакетОбластиКомпоновкиДанных.
  2. У каждого такого объекта формируется собственная независимая координатная сетка строк и колонок. Позиционирование ячеек внутри блока отсчитывается относительно начала самой области, а не от абсолютных координат общего листа.
  3. При повторном открытии редактора СКД платформа выполняет динамическую сборку: она считывает независимые области и заново размещает их в едином табличном документе друг под другом. По этой причине порядок расположения областей на экране не гарантируется, а абсолютные номера строк меняются.

Кроме того, семантика макета напрямую диктует требования к его размерам. Объект Макет группировки отвечает за вывод строки отчета целиком (или нескольких строк группировки). Если разработчик выделяет для группировки ограниченный диапазон (например, R1C3:R1C5), платформа при валидации и нормализации схемы приводит макет строки к стандартному виду, растягивая его на всю строку (R1:R1). В результате относительные координаты ячеек смещаются к первой колонке, что визуально воспринимается как сдвиг влево и сброс границ.

Правила оформления макетов группировок

Разберем по шагам, как правильно верстать строки отчета в СКД, чтобы избежать произвольного искажения формы:

  1. Задаем область от первой колонки. Для объектов типа «Макет группировки» всегда выделяем либо всю строку целиком (R...), либо прямоугольный диапазон, начинающийся строго с первой колонки (R...C1:R...Cn).
  2. Формируем отступы пустыми ячейками. Если требуется сместить выводимые параметры или текст вправо, не следует пытаться задать область с середины листа. Создаем пустые ячейки нужной ширины в колонках 1, 2 и далее, отключаем для них границы и объединяем их при необходимости.
  3. Используем подходящий тип макета. Если стоит задача переопределить оформление только отдельной ячейки или колонки (а не всей строки группировки), необходимо добавлять Макет поля, указав конкретное поле компоновки. Макеты полей поддерживают точечные диапазоны ячеек.
  4. Отключаем конфликт автооформления. Чтобы стандартный макет оформления СКД не переопределял границы и цвета кастомной области, в настройках группировки на вкладке «Другие настройки» устанавливаем свойство Макет оформления в значение Без оформления, а на вкладке «Выбранные поля» удаляем системный элемент Автополе.

Альтернативный вариант: программный вывод отчета

Если требования к оформлению отчета не укладываются в ограничения встроенного редактора макетов СКД, наиболее надежным решением является перенос постобработки в код модуля отчета. Рассмотрим пример перехвата вывода в процедуре ПриКомпоновкеРезультата с использованием объектов КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент:


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

КонецПроцедуры

Такой подход позволяет полностью контролировать процесс вывода строк, при необходимости обращаться к секциям классического макета табличного документа через ПолучитьОбласть() и выводить нестандартные элементы оформления без риска их сброса конструктором СКД.

← На главную