Как настроить ширину колонок, общий заголовок и состав ресурсов в кросс-таблице СКД

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

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

Управление шириной колонок: условное оформление против макета

Проанализируем распространенную ситуацию: разработчик настраивает в схеме компоновки условное оформление (параметры Минимальная ширина и Максимальная ширина), но отчет никак не реагирует на эти установки. Выясним причину такого поведения.

Если в схеме компоновки данных на вкладке Макеты задан пользовательский макет группировки или таблицы целиком, механизм СКД перестает применять параметры ширины из условного оформления к этим областям. Ширина колонок в этом случае жестко берется из самого табличного документа макета.

Для корректного управления шириной доступны следующие варианты:

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

Выборочный вывод ресурсов в группировках колонок без дублирования

Рассмотрим задачу, когда в отчете есть несколько динамических группировок колонок (например, склады и переработчики), и под каждой из них требуется выводить свой уникальный ресурс (например, под складами — Остаток и Заказано, а под переработчиками — только Передано), не дублируя остальные поля.

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

  1. В структуре отчета перейдем к нужной группировке колонок (в ветке колонок таблицы).
  2. Откроем вкладку Выбранные поля для этой конкретной группировки.
  3. Снимем флаг со специального элемента Автополе или полностью удалим его из списка.
  4. Перетащим из доступных полей в выбранные только те ресурсы, которые должны рассчитываться и отображаться в данной ветке группировки.

Также проверим вкладку Ресурсы в схеме компоновки данных: в колонке Рассчитывать по... можно явно ограничить список группировок, для которых данный ресурс имеет смысл, исключив его автоматическое появление в лишних разрезах.

Создание общего заголовка над динамическими группировками

Разберем способы создания объединяющего заголовка над динамически формируемыми колонками (например, когда над списком складов требуется растянуть единую надпись «Заказано»).

Способ 1. Использование вычисляемого поля и иерархии группировок

  1. На вкладке Вычисляемые поля добавим новое поле, например, ЗаголовокСкладов, и в выражении укажем строковый литерал: "Заказано".
  2. В настройках структуры таблицы в ветку колонок добавим группировку по созданному полю ЗаголовокСкладов.
  3. Внутрь этой группировки вложим динамическую группировку по полю Склад.
  4. В свойствах родительской группировки отключим вывод итогов по горизонтали (установив тип расположения итогов в значение Нет). СКД автоматически объединит верхнюю ячейку и растянет заголовок на все дочерние колонки складов.

Способ 2. Группировка выбранных полей в папки

  1. На вкладке Выбранные поля нажмем кнопку Сгруппировать поля.
  2. В появившейся папке укажем требуемый заголовок (например, "Заказано").
  3. Переместим внутрь созданной группы нужные ресурсы или реквизиты.
  4. В свойствах группы выберем вариант расположения (например, В отдельной колонке или Вертикально), сформировав многоуровневую шапку без изменения логики группировки данных.

Программное объединение ячеек шапки в модуле отчета

Если требуется получить сложную шапку с индивидуальным слиянием ячеек, воспользуемся постобработкой табличного документа в событии ПриКомпоновкеРезультата модуля отчета.

Посмотрим на пример программного вывода с последующим объединением одинаковых заголовков:


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

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

← На главную