Почему в отчете СКД дублируются области и как убрать вывод пустых строк

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

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

Причина 1: Некорректная структура набора данных и лишние строки в запросе

Наиболее частая скрытая причина появления пустых областей кроется в самом тексте запроса схемы компоновки. Если отчет должен выводить шапку с общими реквизитами (например, сведения об организации, документе) и несколько табличных разделов, ошибочной практикой является сбор всех этих данных в единый запрос через оператор ОБЪЕДИНИТЬ ВСЕ.

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

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

  1. Разделение наборов данных: исключим общие реквизиты шапки из объединения с табличными частями. Создадим для общих сведений отдельный Набор данных - запрос, а для табличных разделов — свои независимые наборы данных.
  2. Связи наборов данных: свяжем наборы на вкладке «Связи наборов данных» по ключевым полям (например, по ссылке на документ или организацию).
  3. Разделение группировок в структуре: на вкладке «Настройки» в структуре отчета выстроим параллельные группировки верхнего уровня друг за другом (Шапка, затем ТабличнаяЧасть, затем Подвал), а не будем вкладывать их в одну общую таблицу с объединенным запросом.

Причина 2: Неверно заданный тип макета группировки

Вторая распространенная причина связана с настройками на вкладке «Макеты». Для каждой области группировки платформа позволяет указать один из типов: «Заголовок», «Строка», «Подвал», «Иерархия-заголовок» и другие.

Если для группировки шапки задан макет с типом «Заголовок», СКД сначала выводит макет заголовка (в котором поля группировки еще не инициализированы строковыми данными), а затем переходит к выводу тела строки. Если для строки макет не назначен, платформа попытается вывести стандартную строку, либо выведет макет повторно при наличии вложенных элементов.

Разберем порядок правильной настройки макета:

  1. Перейдем на вкладку «Макеты» схемы компоновки данных.
  2. Найдем область макета для нужной группировки и проверим ее тип. Для одиночной информационной строки (например, реквизитов шапки) установим тип «Строка», а не «Заголовок».
  3. Если необходимо оформить только внешний вид отдельных ячеек, рекомендуется использовать «Макет поля» вместо «Макета группировки» — в этом случае компоновщик не нарушает последовательность обхода иерархии строк.

Причина 3: Лишние уровни группировок и системные автополя

Иногда дублирование провоцируется настройками структуры и выбранных полей:

  1. Наличие пустых родительских группировок: если создана группировка без указания полей (пустая группировка), внутри которой лежат детальные записи или дочерние группы, СКД сначала выводит строку родителя (которая оказывается пустой), а затем дочерние строки. Удалим лишний уровень иерархии в структуре отчета.
  2. Поле «Авто» в выбранных полях: наличие системного элемента Авто в составе выбранных полей конкретной группировки может заставлять СКД вызывать стандартный механизм генерации полей параллельно с пользовательским макетом. Откроем настройки полей группировки, удалим элемент Авто и добавим только нужные поля.
  3. Настройки расположения итогов: в разделе «Другие настройки» группировки проверим свойство Расположение итогов. Если установлено значение «Начало и конец», строка с итогами будет дублироваться сверху и снизу. Установим значение «Нет» для одиночных информационных областей.

Альтернативный вариант: Программный вывод через процессор компоновки

Если отчет имеет сложную динамическую структуру и стандартный генератор макета не позволяет избавиться от пустых элементов, выведем результат компоновки программно в модуле объекта отчета:


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

Таким образом, проверка исходного текста запроса на отсутствие лишних пустых строк в объединениях, правильное назначение типов макетов («Строка» вместо «Заголовок») и отключение неиспользуемых итогов позволяют полностью исключить появление дублирующихся и пустых областей в отчетах СКД.

← На главную