Как удалить пустые строки между группировками в отчетах на СКД 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе с Системой компоновки данных (СКД) в 1С разработчики часто сталкиваются с проблемой нежелательного появления пустых строк между группировками в сформированном отчете. Эти строки, как правило, не являются результатом запроса, а вставляются автоматически механизмом СКД, что приводит к неаккуратному и избыточному виду отчета. В этой статье мы подробно рассмотрим различные подходы к решению данной проблемы, от программного удаления до тонких настроек самой СКД.

Причины возникновения пустых строк

Прежде чем перейти к решениям, давайте выясним, почему вообще возникают эти пустые строки. Часто причиной является автоматическое формирование системой макетов или неверное интерпретирование связей между группировками. Иногда СКД, не находя явных указаний на объединение макетов или при наличии полей с NULL-значениями, вставляет пустые строки для визуального разделения элементов, которые, по ее мнению, должны быть отделены. Также проблема может усугубляться в сложных отчетах с множеством вложенных группировок, пользовательскими макетами и комплексными запросами.

Решение 1: Программное удаление пустых строк из табличного документа

Одним из наиболее надежных, хотя и не самым элегантным, является программное удаление пустых строк из уже скомпонованного табличного документа. Этот метод гарантирует результат, поскольку мы напрямую манипулируем конечным выводом отчета.

  1. Генерация отчета: Сначала мы позволяем СКД скомпоновать результат как обычно.
  2. Итерация и удаление: Затем мы перебираем все строки получившегося табличного документа и удаляем те, которые оказываются полностью пустыми.

Рассмотрим пример кода, который можно вставить в обработчик события формы отчета, например, ОбновлениеОтображения или после вызова процедуры компоновки отчета.


Таб = ЭлементыФормы.Результат; // Предполагается, что результат выводится в ТабличныйДокумент с именем 'Результат'
Таб.Очистить(); // Очищаем табличный документ перед новой компоновкой
ЭтотОбъект.СкомпоноватьРезультат(Таб); // Компонуем результат в наш табличный документ

мсвПустыеСтроки = Новый Массив;
Для Стр = 1 По Таб.ВысотаТаблицы Цикл
    ЭтоПустаяСтрока = Истина;
    Для Кол = 1 По Таб.ШиринаТаблицы Цикл
        Обл = Таб.Область(Стр, Кол);
        Если ЗначениеЗаполнено(Обл.Текст) Тогда
            ЭтоПустаяСтрока = Ложь;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если ЭтоПустаяСтрока Тогда
        мсвПустыеСтроки.Вставить(0, Стр); // Вставляем индекс строки в начало массива, чтобы при удалении индексы не сбивались
    КонецЕсли;
КонецЦикла;

Для Каждого Эл Из мсвПустыеСтроки Цикл
    // Удаляем область, соответствующую пустой строке, со смещением по вертикали
    Таб.УдалитьОбласть(Таб.Область(Эл,,Эл), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЦикла;

Преимущества этого метода:

Недостатки:

Решение 2: Настройка структуры группировок СКД (Непрограммный метод)

Этот метод считается более "изящным", так как оперирует исключительно инструментами СКД без обращения к коду. Он особенно полезен, когда нужно, чтобы несколько группировок выводились как единый блок без промежутков, с общей шапкой.

  1. Создание пустой родительской группировки: Начнем с создания новой группировки в структуре отчета. Эта группировка будет служить "оберткой" или "шапкой" для остальных. Важно, чтобы у этой группировки не было никаких полей в "Выбранных полях", или мы могли бы явно отключить автоматическое заполнение полей для нее.
  2. Вложение детальных группировок: Все группировки, которые должны идти вместе без пустых строк, мы вкладываем как дочерние элементы в эту новую родительскую группировку.
  3. Настройка макетов группировок: Перейдем на закладку "Макеты" в настройках СКД. Здесь мы создаем макеты для нашей родительской группировки и для всех вложенных группировок.

Такой подход заставляет СКД воспринимать все вложенные группировки как части единого целого, объединенные под одной родительской "шапкой", и не вставлять между ними разделительные пустые строки.

Преимущества этого метода:

Недостатки:

Решение 3: Управление NULL-значениями и отборами в СКД

Часто пустые строки возникают из-за того, что в запросе или данных присутствуют поля со значениями NULL или пустые ссылки, которые СКД затем пытается вывести, формируя пустую строку. Мы можем управлять этим поведением через настройки СКД.

3.1. Игнорирование NULL-значений в ролях полей

СКД позволяет указать, нужно ли игнорировать записи, если определенные поля содержат NULL.

  1. Перейдите на вкладку Наборы данных в настройках СКД.
  2. Выберите нужный набор данных (обычно "Набор данных объект" или "Набор данных запрос").
  3. Перейдите на вкладку Роли.
  4. Для полей, которые, если они не заполнены, могут приводить к появлению пустых строк, установите флаг Игнорировать значение null.

Этот флаг instructs СКД не включать в результат компоновки строки, где соответствующие поля имеют значение NULL, тем самым исключая появление нежелательных пустых записей.

3.2. Настройка отборов по пустым значениям и ссылкам

Мы можем явно указать в отборах СКД, чтобы не выводились записи, содержащие пустые значения или ссылки.

  1. Перейдите на вкладку Настройки в настройках СКД.
  2. В разделе Отборы добавьте новый элемент отбора.
  3. В поле выберите то поле, которое может быть пустым.
  4. Установите тип сравнения Не равно (<>) или Не заполнено.
  5. В качестве значения для сравнения укажите либо пустое значение для примитивных типов (например, пустая строка ""), либо пустую ссылку для ссылочных типов. Для пустой ссылки можно просто выбрать тип документа (например, "Документ.РеализацияТоваровУслуг") и не заполнять его значение, либо использовать SHIFT+F4 для выбора пустой ссылки.

Пример отбора для исключения строк с пустым контрагентом:

Контрагент <> &ПустойКонтрагент

Где &ПустойКонтрагент - это параметр, для которого мы устанавливаем пустое значение типа "Справочник.Контрагенты" (или соответствующего ссылочного типа).

Решение 4: Использование разных наборов данных

В случаях, когда мы объединяем результаты нескольких запросов с помощью оператора ОБЪЕДИНИТЬ ВСЕ, иногда могут возникать пустые строки из-за несовпадения структур или из-за того, что один из запросов возвращает пустые данные. Вместо объединения запросов в один, мы можем попробовать использовать несколько независимых наборов данных в СКД.

Для этого:

  1. Создайте каждый запрос как отдельный набор данных в СКД.
  2. Настройте связи между этими наборами данных, если они необходимы, используя вкладку Связи наборов данных.
  3. В структуре отчета используйте поля из разных наборов данных для построения необходимых группировок.

Этот подход может помочь СКД более корректно обрабатывать данные из различных источников и избегать генерации пустых строк.

Решение 5: Условное оформление для скрытия пустых строк (Дополнительный метод)

Если ни один из вышеперечисленных методов не помог полностью устранить пустые строки, или если требуется более гибкое управление их отображением, можно применить условное оформление. Этот метод не удаляет строки, но делает их невидимыми.

  1. Перейдите на вкладку Настройки в настройках СКД.
  2. В разделе Условное оформление добавьте новый элемент.
  3. В разделе Условие укажите, когда строка должна считаться "пустой". Это может быть условие, что все ключевые поля в строке не заполнены или равны NULL.
  4. Например: Не ЗначениеЗаполнено(Поле1) И Не ЗначениеЗаполнено(Поле2)

  5. В разделе Оформление настройте следующие параметры:

Этот метод подходит, когда нужно не полностью удалить строки, а лишь визуально скрыть их от пользователя.

Влияние версии платформы

Стоит отметить, что проблема с автоматической вставкой пустых строк между группировками в отчетах СКД была известна разработчикам 1С и, по утверждению некоторых пользователей, частично решена в более новых версиях платформы. Например, в версиях 8.3.10.2375 и выше поведение СКД могло быть скорректировано, и проблема стала проявляться реже.

Однако, как показывает опыт, даже на последних версиях платформы (например, 8.3.14.1630), проблема все еще может возникать в сложных отчетах со специфическими настройками или пользовательскими макетами. Поэтому полагаться только на обновление платформы не стоит, и быть готовым применять описанные методы.

Заключение

Проблема пустых строк в отчетах СКД является достаточно распространенной, но, как мы видим, имеет множество решений. Выбор конкретного метода зависит от сложности отчета, желаемой степени контроля, требований к производительности и версии используемой платформы. Мы рекомендуем начинать с не программных методов, таких как настройка структуры группировок или отборов, и только в случае их неэффективности переходить к программному удалению строк. Комбинирование различных подходов часто позволяет добиться желаемого результата.

← На главную