При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в результирующей таблице (особенно в кросс-таблицах или при использовании нескольких складов/периодов) появляются пустые ячейки. В базе данных эти значения соответствуют NULL. Обычная проверка ЕСТЬNULL в тексте запроса не всегда решает проблему, так как пустоты могут возникать уже на этапе компоновки результата, когда система сопоставляет данные из разных группировок.
В этой статье мы подробно разберем, почему возникают такие пропуски, и проанализируем все способы их устранения: от корректной настройки выражений ресурсов до визуального оформления через формат поля.
Прежде всего, разберем ситуацию, когда в запросе проверка ЕСТЬNULL(Количество, 0) выполнена, но в отчете все равно видны пустые значения. Это происходит из-за особенностей работы кросс-таблиц (таблиц СКД). Предположим, у нас есть "Склад 1" с "Хлебом" и "Склад 2" с "Мукой". В запросе для каждой строки количество заполнено. Однако при выводе таблицы СКД создает пересечения для всех складов и всех товаров. Так как на "Складе 1" нет "Муки", СКД сама генерирует пустую ячейку на этом пересечении. Поскольку физической строки в базе данных для этой комбинации не существует, функция ЕСТЬNULL в запросе просто не вызывается.
Для решения этой проблемы нам нужно воздействовать на данные на уровне самой системы компоновки, а не только в тексте запроса.
Как показывает практика и обсуждения опытных разработчиков, самым надежным способом является правильное описание ресурса на закладке "Ресурсы" в схеме компоновки данных. Рассмотрим типичную ошибку: многие используют конструкцию СУММА(ЕСТЬNULL(Количество, 0)). В данном случае функция СУММА пытается сложить значения там, где они есть. Но если для группировки данных нет вовсе, результатом работы СУММА будет NULL.
Проанализируем правильный подход. Нам необходимо обернуть результат агрегации в проверку на пустое значение. Вместо указанной выше формулы следует использовать:
ЕСТЬNULL(СУММА(Количество), 0)
Разберем, как это работает: система сначала выполняет агрегацию (свертку) данных по текущей группировке. Если данных для пересечения строк и колонок не нашлось, функция СУММА вернет NULL. В этот момент срабатывает внешняя функция ЕСТЬNULL, которая заменяет пустоту на 0. Это универсальное решение, которое работает даже в самых сложных кросс-таблицах.
Если нам нужно изменить только визуальное представление данных, не меняя логику вычислений, мы можем воспользоваться настройкой формата. Это полезно, когда в вычислениях NULL должен оставаться NULL (например, для корректного расчета среднего значения), но пользователю нужно видеть "0,00".
Рассмотрим шаги по настройке:
ЧН=0,00.Этот параметр сообщает системе: "Если значение поля не определено или равно NULL, выведи в ячейку указанный текст". Мы можем написать там не только ноль, но и любую строку, например, "Нет данных".
Иногда требуется заменить пустоту на ноль только в определенных условиях или для полей, которые не являются ресурсами (например, в полях группировок). В этом случае поможет механизм "Условное оформление".
Выполним следующую последовательность действий:
0.ПолеКоличества Не заполнено (или ПолеКоличества ЕСТЬ NULL).Этот метод гарантирует, что визуально ячейка всегда будет заполнена, независимо от сложности связей в наборах данных.
Если в вашем отчете очень много числовых колонок и вы хотите глобально избавиться от пустот, можно воспользоваться общей настройкой схемы. Посмотрим, где она находится:
В конструкторе СКД перейдем на закладку "Настройки", далее в нижней части выберем вкладку "Другие настройки". Там представлен параметр "Представление NULL". Если установить в нем значение 0, то во всех ячейках отчета, где СКД обнаружит NULL, будет автоматически выведен ноль. Однако будьте осторожны: это применится ко всем типам данных, включая строковые и ссылочные поля.
Если вы создаете собственное "Вычисляемое поле", крайне важно обеспечивать обработку пустых значений непосредственно в формуле. Выясним причину: если вы складываете два поля, одно из которых NULL, результат всей операции будет NULL.
Пример неправильной формулы:
Цена * Количество
Пример правильной формулы для вычисляемого поля:
ЕСТЬNULL(Цена, 0) * ЕСТЬNULL(Количество, 0)
Такой подход защитит ваши расчеты от "зануления" всей строки из-за одного незаполненного показателя.
Важно помнить о разнице между 0 и NULL при расчете итогов. Проанализируем ситуацию: если мы считаем среднюю цену по трем складам, и на одном из них цена равна 0, то знаменатель будет равен 3. Если же на складе значение NULL, то СКД исключит эту строку из расчета, и знаменатель будет равен 2.
Поэтому, прежде чем принудительно заменять все NULL на 0 через выражения ресурсов, определитесь, как это должно влиять на итоговые показатели отчета. Если вам нужно просто "красивое отображение", лучше использовать Способ 2 (Формат поля) или Способ 3 (Условное оформление).
Мы рассмотрели различные уровни контроля над данными в СКД. Подведем итог:
ЕСТЬNULL(СУММА(Поле), 0).ЕСТЬNULL.Применяя эти техники, мы обеспечим профессиональный и понятный вид отчетов для конечных пользователей, исключив двусмысленность пустых ячеек.