Разработка отчетов в Системе компоновки данных (СКД) — одна из наиболее частых задач программиста 1С. Однако даже опытные разработчики иногда сталкиваются с ситуацией, когда на форме сформированного отчета в самом начале (или в самом верху строк) появляется странная пустая колонка или строка. Она очень напоминает общие итоги, но выводится без заголовка и содержит пустые значения.
В этой статье мы подробно разберем, почему возникает эта проблема, как на нее влияют особенности СУБД, и рассмотрим три практических способа решения: от оптимизации запроса до косметической настройки интерфейса.
Чаще всего эта проблема возникает при работе с полями составного типа данных. Например, у вас есть поле Контрагент, которое может принимать значения типов Справочник.Контрагенты и Справочник.СтруктурныеЕдиницы. Если вам нужно вывести в отчет только структурные единицы, типичной ошибкой новичка является попытка «обрезать» типы прямо в поле выбора с помощью конструкции ВЫРАЗИТЬ:
ВЫРАЗИТЬ(РасходнаяНакладная.Контрагент КАК Справочник.СтруктурныеЕдиницы) КАК Контрагент
Давайте проанализируем, почему такой подход приводит к ошибке. Функция ВЫРАЗИТЬ в языке запросов 1С предназначена для приведения типа. Она не фильтрует строки исходной выборки. Если в документе был указан обычный контрагент (а не структурная единица), то система не исключит эту строку из результата. Вместо этого функция ВЫРАЗИТЬ вернет пустое значение пустого типа — NULL.
Для того чтобы до конца понять физику процесса, посмотрим, как платформа 1С:Предприятие транслирует наши запросы в язык SQL. Поля составного типа хранятся в базах данных (будь то MS SQL Server или PostgreSQL) в виде нескольких физических колонок:
Когда мы пишем конструкцию ВЫРАЗИТЬ(Поле КАК Тип), платформа преобразует ее в SQL-выражение с оператором условного выбора:
CASE
WHEN Поле_TRef = ИдентификаторНеобходимогоТипа THEN Поле_RRef
ELSE NULL
END
Строки, не прошедшие проверку типа, превращаются в NULL. Когда СКД начинает группировать данные по этому полю для вывода колонок или строк отчета, она сталкивается со значениями NULL. По правилам работы реляционных СУБД, при сортировке по возрастанию (ASC) значение NULL признается наименьшим. Именно поэтому пустая колонка, группирующая все неподошедшие под условие типы данных, всегда визуально встает в самое начало отчета.
Самый правильный и производительный способ решения проблемы — отсечь все лишние типы данных еще на этапе выполнения запроса на уровне СУБД. Для этого мы должны использовать оператор ССЫЛКА в секции ГДЕ нашего запроса.
Давайте разберем, как должен выглядеть правильный запрос:
ВЫБРАТЬ
ВЫРАЗИТЬ(РасходнаяНакладная.Контрагент КАК Справочник.СтруктурныеЕдиницы) КАК СтруктурнаяЕдиница,
РасходнаяНакладная.СуммаДокумента КАК Сумма
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
РасходнаяНакладная.Контрагент ССЫЛКА Справочник.СтруктурныеЕдиницы
В данном случае СУБД выполнит простейшую фильтрацию по полю разделителя типов:
WHERE Поле_TRef = ИдентификаторНеобходимогоТипа
Почему это критически важно для производительности системы?
NULL.Бывают ситуации, когда запрос отчета редактировать нельзя (например, если это сложный типовой отчет из ERP/УТ или запрос формируется динамически платформой). В этом случае мы можем решить проблему пустой колонки с помощью стандартных настроек компоновки данных.
Разберем этот метод по шагам:
Контрагент).При такой настройке СКД самостоятельно отсечет все строки, где значение поля примет вид NULL или пустой ссылки, и пустая колонка в начале отчета исчезнет.
Иногда бизнес-логика отчета требует, чтобы пустые значения или неподходящие типы все-таки выводились на экран. Например, нам нужно показать сумму продаж по структурным подразделениям, но при этом выделить продажи, которые прошли по «общему» контрагенту (без привязки к конкретной единице).
Оставлять пустую колонку без названия — плохой тон разработки. Мы можем сделать отчет красивым и понятным для конечного пользователя, задействовав механизм условного оформления СКД. Рассмотрим, как это настроить:
[Розничные продажи] или [Внутренний контрагент].После применения этой настройки пустая колонка в начале отчета перестанет сбивать с толку пользователей. Вместо пустоты система аккуратно выведет заданный вами текст в квадратных скобках, сигнализируя о том, что эти данные относятся к неуточненной аналитике.
Таким образом, понимание физических механизмов работы платформы 1С с СУБД позволяет не только оперативно решать интерфейсные баги, но и создавать быстрые, отказоустойчивые и интуитивно понятные отчеты для бизнеса.