Почему в начале отчета СКД появляется пустая колонка и как это исправить?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, как на нее влияют особенности СУБД, и рассмотрим три практических способа решения: от оптимизации запроса до косметической настройки интерфейса.

Выясняем причину: в чем разница между ВЫРАЗИТЬ и ССЫЛКА

Чаще всего эта проблема возникает при работе с полями составного типа данных. Например, у вас есть поле Контрагент, которое может принимать значения типов Справочник.Контрагенты и Справочник.СтруктурныеЕдиницы. Если вам нужно вывести в отчет только структурные единицы, типичной ошибкой новичка является попытка «обрезать» типы прямо в поле выбора с помощью конструкции ВЫРАЗИТЬ:


ВЫРАЗИТЬ(РасходнаяНакладная.Контрагент КАК Справочник.СтруктурныеЕдиницы) КАК Контрагент

Давайте проанализируем, почему такой подход приводит к ошибке. Функция ВЫРАЗИТЬ в языке запросов 1С предназначена для приведения типа. Она не фильтрует строки исходной выборки. Если в документе был указан обычный контрагент (а не структурная единица), то система не исключит эту строку из результата. Вместо этого функция ВЫРАЗИТЬ вернет пустое значение пустого типа — NULL.

Как это работает под капотом СУБД

Для того чтобы до конца понять физику процесса, посмотрим, как платформа 1С:Предприятие транслирует наши запросы в язык SQL. Поля составного типа хранятся в базах данных (будь то MS SQL Server или PostgreSQL) в виде нескольких физических колонок:

  1. Поле разделителя типов (обычно с суффиксом _TRef) — числовой идентификатор, определяющий, к какой таблице метаданных относится ссылка.
  2. Поле самой ссылки (суффикс _RRef) — уникальный идентификатор записи (GUID).

Когда мы пишем конструкцию ВЫРАЗИТЬ(Поле КАК Тип), платформа преобразует ее в SQL-выражение с оператором условного выбора:


CASE 
    WHEN Поле_TRef = ИдентификаторНеобходимогоТипа THEN Поле_RRef 
    ELSE NULL 
END

Строки, не прошедшие проверку типа, превращаются в NULL. Когда СКД начинает группировать данные по этому полю для вывода колонок или строк отчета, она сталкивается со значениями NULL. По правилам работы реляционных СУБД, при сортировке по возрастанию (ASC) значение NULL признается наименьшим. Именно поэтому пустая колонка, группирующая все неподошедшие под условие типы данных, всегда визуально встает в самое начало отчета.

Способ решения №1: Явная фильтрация в запросе (Рекомендуемый)

Самый правильный и производительный способ решения проблемы — отсечь все лишние типы данных еще на этапе выполнения запроса на уровне СУБД. Для этого мы должны использовать оператор ССЫЛКА в секции ГДЕ нашего запроса.

Давайте разберем, как должен выглядеть правильный запрос:


ВЫБРАТЬ
    ВЫРАЗИТЬ(РасходнаяНакладная.Контрагент КАК Справочник.СтруктурныеЕдиницы) КАК СтруктурнаяЕдиница,
    РасходнаяНакладная.СуммаДокумента КАК Сумма
ИЗ
    Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
    РасходнаяНакладная.Контрагент ССЫЛКА Справочник.СтруктурныеЕдиницы

В данном случае СУБД выполнит простейшую фильтрацию по полю разделителя типов:

WHERE Поле_TRef = ИдентификаторНеобходимогоТипа

Почему это критически важно для производительности системы?

  1. Снижение трафика и нагрузки: СУБД не тратит ресурсы на чтение с диска и передачу по сети строк, которые заведомо будут отброшены или превратятся в NULL.
  2. Оптимизация работы сервера 1С: Системе компоновки данных не придется расходовать оперативную память на хранение, группировку и расчет итогов по тысячам пустых строк. На больших информационных базах разница в скорости формирования отчета может отличаться в разы.

Способ решения №2: Настройка отбора на уровне группировки СКД

Бывают ситуации, когда запрос отчета редактировать нельзя (например, если это сложный типовой отчет из ERP/УТ или запрос формируется динамически платформой). В этом случае мы можем решить проблему пустой колонки с помощью стандартных настроек компоновки данных.

Разберем этот метод по шагам:

  1. Откройте схему компоновки данных и перейдите на вкладку «Настройки».
  2. Выберите нужный вариант отчета и перейдите на вкладку «Отбор» (на уровне всего отчета или конкретной группировки колонок).
  3. Добавьте новое поле отбора. Выберите ваше сгруппированное поле (например, Контрагент).
  4. В поле «Вид сравнения» укажите значение «Заполнено» (в более старых версиях платформы можно использовать вид сравнения «Заполнено» со значением «Да»).

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

Способ решения №3: Использование Условного оформления

Иногда бизнес-логика отчета требует, чтобы пустые значения или неподходящие типы все-таки выводились на экран. Например, нам нужно показать сумму продаж по структурным подразделениям, но при этом выделить продажи, которые прошли по «общему» контрагенту (без привязки к конкретной единице).

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

  1. В схеме компоновки данных перейдите на вкладку «Настройки», а затем на вкладку «Условное оформление».
  2. Добавьте новый элемент оформления.
  3. В появившемся окне перейдите к параметру «Текст» и введите понятное для пользователя значение, например: [Розничные продажи] или [Внутренний контрагент].
  4. Перейдите на вкладку «Условие». Добавьте условие проверки: выберите ваше поле группировки, вид сравнения установите в значение «Не заполнено».
  5. На вкладке «Оформляемые поля» выберите то поле группировки, для которого мы настраиваем отображение.

После применения этой настройки пустая колонка в начале отчета перестанет сбивать с толку пользователей. Вместо пустоты система аккуратно выведет заданный вами текст в квадратных скобках, сигнализируя о том, что эти данные относятся к неуточненной аналитике.

Таким образом, понимание физических механизмов работы платформы 1С с СУБД позволяет не только оперативно решать интерфейсные баги, но и создавать быстрые, отказоустойчивые и интуитивно понятные отчеты для бизнеса.

← На главную