При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с неприятным визуальным багом: перед началом самой таблицы отчета выводятся несколько пустых строк. Это ломает оформление отчета, делает его неаккуратным и вызывает резонные вопросы у конечных пользователей. Особенно загадочно эта проблема выглядит тогда, когда один отчет работает корректно, а его копия без видимых причин начинает "отступать" сверху на несколько строк.
В этой статье мы подробно разберем, почему СКД резервирует это пустое пространство сверху, как быстро решить эту проблему через стандартные настройки схемы, а также рассмотрим альтернативные и программные способы управления выводом служебных областей.
Когда отчет выводит сверху пустые ячейки (обычно от 2 до 5 строк), это означает, что система зарезервировала место под вывод служебной информации, но сама информация по каким-то причинам отсутствует или не заполнена. В СКД за генерацию этих областей отвечают три основных механизма:
Проанализируем ситуацию: если у вас сверху выводится ровно 4 пустые строки, это классический признак того, что система пытается вывести заголовок, параметры и отборы, но все эти поля оказываются пустыми.
Самый простой и быстрый способ избавиться от пустого места перед отчетом — отключить вывод этих областей в настройках компоновки данных. Рассмотрим по шагам, как это сделать:
ОсновнаяСхемаКомпоновкиДанных.dcs).Выводить заголовок — установите значение «Не выводить» (или «Авто», если вы гарантируете, что заголовок будет заполнен).Выводить параметры — переведите в значение «Не выводить».Выводить отбор — переведите в значение «Не выводить».После сохранения этих настроек СКД перестанет резервировать строки под служебные данные, и таблица отчета начнется сразу с шапки данных.
В некоторых случаях настройки отчета могут переопределяться пользователем в режиме «1С:Предприятие» (через форму «Изменить вариант»), из-за чего пустые строки снова могут вернуться. Чтобы жестко зафиксировать поведение отчета и гарантировать отсутствие пустых строк программно, мы можем применить встроенный язык 1С.
Рассмотрим пример кода, который можно поместить в модуль объекта отчета перед компоновкой результата (например, в процедуре ПриКомпоновкеРезультата):
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим параметры вывода на уровне всего отчета
ПараметрыВывода = Настройки.ПараметрыВывода;
// Отключаем вывод заголовка
ПараметрЗаголовок = ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("TitleOutput"));
Если ПараметрЗаголовок <> Неопределено Тогда
ПараметрЗаголовок.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
ПараметрЗаголовок.Использование = Истина;
КонецЕсли;
// Отключаем вывод параметров
ПараметрПараметры = ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ParametersOutput"));
Если ПараметрПараметры <> Неопределено Тогда
ПараметрПараметры.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
ПараметрПараметры.Использование = Истина;
КонецЕсли;
// Отключаем вывод отборов
ПараметрОтборы = ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("FilterOutput"));
Если ПараметрОтборы <> Неопределено Тогда
ПараметрОтборы.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
ПараметрОтборы.Использование = Истина;
КонецЕсли;
// Выполняем стандартную компоновку с новыми настройками
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Использование этого кода гарантирует, что какие бы настройки ни выставил пользователь в режиме предприятия, отчет всегда будет формироваться без лишних пустых строк в шапке.
Если вы отключили вывод заголовков, параметров и отборов, но пустые строки внутри или в начале отчета все равно продолжают появляться, проанализируем следующие возможные причины:
Если в структуре вашего отчета под какой-либо группировкой добавлены Детальные записи, но при этом в списке выбранных полей для детальных записей нет ни одного заполненного поля (или все поля содержат значения NULL), СКД все равно попытается вывести строку для каждой записи. Визуально это будет выглядеть как абсолютно пустая строка внутри таблицы.
Решение: Наложите отбор на заполненность ключевого поля группировки (например, Номенклатура Заполнено) или удалите лишнюю детальную группировку, если агрегированных данных по верхнему уровню вполне достаточно.
При построении отчетов по остаткам и оборотам с периодичностью "Регистратор" часто возникает пустая строка в начале таблицы. Это происходит из-за того, что для начального остатка поле Регистратор не определено (имеет значение NULL). Система группирует этот начальный остаток в отдельную строку с пустым именем регистратора.
Решение: Перейдите на вкладку «Наборы данных», найдите поле Регистратор и в его свойствах (в колонке «Роли») установите флажок «Игнорировать NULL».
Если вы используете индивидуальные макеты (вкладка «Макеты» в схеме СКД), обратите внимание на границы именованных областей в шаблоне табличного документа. Разработчики нередко случайно захватывают лишнюю пустую строку снизу или сверху при объединении ячеек или задании границ области макета.
Решение: Откройте макет и убедитесь, что именованная область (например, макет группировки или макет заголовка) включает в себя только значащие ячейки и не имеет скрытых пустых строк с фиксированной высотой.