При работе с Системой компоновки данных (СКД) в 1С разработчики часто сталкиваются с проблемой нежелательного появления пустых строк между группировками в сформированном отчете. Эти строки, как правило, не являются результатом запроса, а вставляются автоматически механизмом СКД, что приводит к неаккуратному и избыточному виду отчета. В этой статье мы подробно рассмотрим различные подходы к решению данной проблемы, от программного удаления до тонких настроек самой СКД.
Прежде чем перейти к решениям, давайте выясним, почему вообще возникают эти пустые строки. Часто причиной является автоматическое формирование системой макетов или неверное интерпретирование связей между группировками. Иногда СКД, не находя явных указаний на объединение макетов или при наличии полей с NULL-значениями, вставляет пустые строки для визуального разделения элементов, которые, по ее мнению, должны быть отделены. Также проблема может усугубляться в сложных отчетах с множеством вложенных группировок, пользовательскими макетами и комплексными запросами.
Одним из наиболее надежных, хотя и не самым элегантным, является программное удаление пустых строк из уже скомпонованного табличного документа. Этот метод гарантирует результат, поскольку мы напрямую манипулируем конечным выводом отчета.
Рассмотрим пример кода, который можно вставить в обработчик события формы отчета, например, ОбновлениеОтображения или после вызова процедуры компоновки отчета.
Таб = ЭлементыФормы.Результат; // Предполагается, что результат выводится в ТабличныйДокумент с именем 'Результат'
Таб.Очистить(); // Очищаем табличный документ перед новой компоновкой
ЭтотОбъект.СкомпоноватьРезультат(Таб); // Компонуем результат в наш табличный документ
мсвПустыеСтроки = Новый Массив;
Для Стр = 1 По Таб.ВысотаТаблицы Цикл
ЭтоПустаяСтрока = Истина;
Для Кол = 1 По Таб.ШиринаТаблицы Цикл
Обл = Таб.Область(Стр, Кол);
Если ЗначениеЗаполнено(Обл.Текст) Тогда
ЭтоПустаяСтрока = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПустаяСтрока Тогда
мсвПустыеСтроки.Вставить(0, Стр); // Вставляем индекс строки в начало массива, чтобы при удалении индексы не сбивались
КонецЕсли;
КонецЦикла;
Для Каждого Эл Из мсвПустыеСтроки Цикл
// Удаляем область, соответствующую пустой строке, со смещением по вертикали
Таб.УдалитьОбласть(Таб.Область(Эл,,Эл), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЦикла;
Преимущества этого метода:
Недостатки:
Этот метод считается более "изящным", так как оперирует исключительно инструментами СКД без обращения к коду. Он особенно полезен, когда нужно, чтобы несколько группировок выводились как единый блок без промежутков, с общей шапкой.
Такой подход заставляет СКД воспринимать все вложенные группировки как части единого целого, объединенные под одной родительской "шапкой", и не вставлять между ними разделительные пустые строки.
Преимущества этого метода:
Недостатки:
Часто пустые строки возникают из-за того, что в запросе или данных присутствуют поля со значениями NULL или пустые ссылки, которые СКД затем пытается вывести, формируя пустую строку. Мы можем управлять этим поведением через настройки СКД.
СКД позволяет указать, нужно ли игнорировать записи, если определенные поля содержат NULL.
Этот флаг instructs СКД не включать в результат компоновки строки, где соответствующие поля имеют значение NULL, тем самым исключая появление нежелательных пустых записей.
Мы можем явно указать в отборах СКД, чтобы не выводились записи, содержащие пустые значения или ссылки.
SHIFT+F4 для выбора пустой ссылки.Пример отбора для исключения строк с пустым контрагентом:
Контрагент <> &ПустойКонтрагент
Где &ПустойКонтрагент - это параметр, для которого мы устанавливаем пустое значение типа "Справочник.Контрагенты" (или соответствующего ссылочного типа).
В случаях, когда мы объединяем результаты нескольких запросов с помощью оператора ОБЪЕДИНИТЬ ВСЕ, иногда могут возникать пустые строки из-за несовпадения структур или из-за того, что один из запросов возвращает пустые данные. Вместо объединения запросов в один, мы можем попробовать использовать несколько независимых наборов данных в СКД.
Для этого:
Этот подход может помочь СКД более корректно обрабатывать данные из различных источников и избегать генерации пустых строк.
Если ни один из вышеперечисленных методов не помог полностью устранить пустые строки, или если требуется более гибкое управление их отображением, можно применить условное оформление. Этот метод не удаляет строки, но делает их невидимыми.
NULL.Например: Не ЗначениеЗаполнено(Поле1) И Не ЗначениеЗаполнено(Поле2)
Этот метод подходит, когда нужно не полностью удалить строки, а лишь визуально скрыть их от пользователя.
Стоит отметить, что проблема с автоматической вставкой пустых строк между группировками в отчетах СКД была известна разработчикам 1С и, по утверждению некоторых пользователей, частично решена в более новых версиях платформы. Например, в версиях 8.3.10.2375 и выше поведение СКД могло быть скорректировано, и проблема стала проявляться реже.
Однако, как показывает опыт, даже на последних версиях платформы (например, 8.3.14.1630), проблема все еще может возникать в сложных отчетах со специфическими настройками или пользовательскими макетами. Поэтому полагаться только на обновление платформы не стоит, и быть готовым применять описанные методы.
Проблема пустых строк в отчетах СКД является достаточно распространенной, но, как мы видим, имеет множество решений. Выбор конкретного метода зависит от сложности отчета, желаемой степени контроля, требований к производительности и версии используемой платформы. Мы рекомендуем начинать с не программных методов, таких как настройка структуры группировок или отборов, и только в случае их неэффективности переходить к программному удалению строк. Комбинирование различных подходов часто позволяет добиться желаемого результата.