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

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Причина возникновения пустой строки

Прежде всего, проанализируем ситуацию: почему СКД вообще выводит пустую строку? В большинстве случаев это происходит из-за особенностей левого соединения наборов данных, которое СКД выполняет по умолчанию. Если в первом (ведущем) наборе данных есть записи, для которых не нашлось соответствия во втором наборе, то в полях второго набора система возвращает значение NULL. Если именно это поле выбрано в качестве группировки, процессор компоновки данных создает для него отдельную ветку в иерархии, которая визуально выглядит как пустая строка.

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

Решение 1: Использование роли поля «Игнорировать значения NULL»

Это самый правильный и эффективный способ решения проблемы на уровне метаданных схемы компоновки. Рассмотрим подробнее, как это настроить:

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Выберем набор данных, который содержит поле, используемое в проблемной группировке.
  3. В колонке Поля найдем нужное нам поле (например, Товар) и нажмем на кнопку в колонке Роли.
  4. В открывшемся окне установим флаг Игнорировать значения NULL.

Этот флаг дает команду процессору компоновки данных игнорировать записи, где значение данного поля равно NULL, при формировании дерева группировок. В результате пустая строка просто не будет создана.

Решение 2: Настройка «Обязательной связи» наборов данных

Когда мы связываем два набора данных на соответствующей закладке СКД, система по умолчанию выполняет левое соединение. Если мы хотим, чтобы в отчет попадали только те записи, которые присутствуют в обоих наборах (аналог внутреннего соединения), выполним следующие действия:

  1. Перейдем на закладку Связи наборов данных.
  2. Найдем связь между наборами.
  3. Установим флаг в колонке Обязательная связь.

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

Решение 3: Фильтрация на уровне запроса и параметров связи

Иногда полезно отсечь пустые значения еще на этапе выполнения запроса. Рассмотрим пример добавления условия в текст запроса:


ВЫБРАТЬ
    Продажи.Товар КАК Товар,
    Продажи.КоличествоОборот КАК Количество
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ГДЕ
    НЕ Продажи.Товар ЕСТЬ NULL
    И Продажи.Товар <> ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)

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

Решение 4: Программная настройка отбора в СКД

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


Настройки = КомпоновщикНастроек.Настройки;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

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

Решение 5: Условное форматирование (визуальный метод)

Если технически удалить строку не удается (например, из-за специфики иерархических связей), можно прибегнуть к визуальному скрытию. Выясним причину, по которой строка считается «пустой», и применим условное форматирование:

  1. В настройках СКД перейдем на закладку Условное форматирование.
  2. Добавим новый элемент. В оформлении укажем Максимальная высота = 0.1 (или минимально возможное значение).
  3. В условии укажем: Товар Не Заполнено.
  4. В области использования выберем только поля этой группировки.

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

Дополнительный совет: Проверка в консоли запросов

Чтобы окончательно разобраться в поведении отчета, попробуйте перенести текст запросов из СКД в Консоль запросов. Если при выполнении запроса пустая строка отсутствует, значит, проблема на 100% заключается в настройках компоновки (связях наборов или группировках). Если же в консоли вы видите строку с NULL или пустой ссылкой, необходимо чистить данные в регистрах или уточнять условия соединения ГДЕ в тексте запроса.

Используя комплексный подход и проверяя настройки ролей полей Игнорировать значения NULL, мы добьемся чистоты и корректности формирования отчета в любой конфигурации на платформе 1С:Предприятие 8.

← На главную