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