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