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