При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда числовые поля (особенно остатки) остаются пустыми. Это происходит из-за того, что в базе данных отсутствует запись или результат вычисления возвращает значение NULL. С точки зрения пользователя, пустая ячейка может выглядеть как ошибка или недоработка, поэтому важно уметь заменять пустоту на привычный «0».
В этой статье мы подробно разберем, почему возникают «пустые дырки» в отчетах, и рассмотрим все профессиональные способы вывода нуля вместо пустоты в 1С.
Самый надежный и правильный с точки зрения производительности способ — это обработка данных на уровне обращения к базе данных. Если поле в результате выполнения запроса может содержать NULL, мы должны явно указать системе, чем его заменить.
Проанализируем ситуацию: когда мы обращаемся к виртуальным таблицам остатков или выполняем ЛЕВОЕ СОЕДИНЕНИЕ, для отсутствующих записей система возвращает пустоту. Чтобы это исправить, выполним следующие шаги в конструкторе запроса:
ЕСТЬNULL.Рассмотрим пример кода в запросе (его также можно проверить через модифицированную консоль запросов УФ — для этого подойдёт инструментарий разработчика с консолью запросов и СКД):
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ЕСТЬNULL(ТоварыНаСкладахОстатки.В НаличииОстаток, 0) КАК ОстатокНаКонец
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
Важно: Функция ЕСТЬNULL принимает два параметра. Первый — проверяемое поле, второй — значение, которое будет подставлено, если первое поле равно NULL. Использование этого метода гарантирует, что в СКД придут уже подготовленные числовые данные.
Если вы не хотите менять логику запроса или данные формируются программно, можно воспользоваться средствами оформления самой системы компоновки данных. Это визуальный метод, который не меняет значение в памяти, но меняет его представление для пользователя.
Разберем по шагам, как настроить формат:
КонечныйОстаток).ЧН=0.Параметр ЧН=0 (Число: Ноль = 0) сообщает системе: «Если значение числовое и оно пустое или равно нулю, выведи на экран цифру 0».
Иногда требуется выводить ноль только при определенных условиях или в конкретных группировках. В этом случае нам поможет механизм «Условного оформления» на закладке «Настройки» СКД.
Проанализируем алгоритм настройки:
ВашеПоле НЕ Заполнено (или ВашеПоле Равно <пусто>).Этот метод хорош тем, что он позволяет визуально «подменить» текст в ячейке, не затрагивая математическую суть данных. Это часто используется в кросс-таблицах.
Выясним причину, по которой ЕСТЬNULL в запросе иногда не помогает. В кросс-отчетах (матрицах), где по строкам идет Номенклатура, а по колонкам Склады, на пересечении может просто не быть записи в базе. В этом случае поле даже не вычисляется в запросе для этой конкретной «дырки».
Чтобы решить проблему на уровне итогов, разберем настройку на закладке «Ресурсы»:
Сумма(Остаток) напишем выражение с проверкой.Пример выражения в ресурсах:
Сумма(ЕСТЬNULL(КонечныйОстаток, 0))
Такой подход заставит СКД выводить ноль на пересечении строк и колонок даже там, где данных в базе нет совсем (а при необходимости можно скрыть столбцы, в которых нет данных).
Если поле является сложным и рассчитывается уже внутри СКД, мы можем использовать вкладку «Вычисляемые поля». Создадим новое поле и в колонке «Выражение» пропишем ту же логику ЕСТЬNULL(МоеСложноеПоле, 0).
Также у каждого поля в СКД есть свойство «Выражение представления». Рассмотрим его подробнее. Если мы напишем там:
Формат(ИмяПоля, "ЧН=0"), то система будет использовать эту функцию при каждом выводе данных в отчет. Это удобно, если вы хотите централизованно управлять форматом вывода конкретного показателя во всех вариантах отчета.
Рассмотрим ситуацию с «Конечными остатками». Если за выбранный период по товару не было движений и остаток равен нулю, виртуальная таблица 1С может вообще не вернуть строку. В итоге товар исчезнет из отчета.
Чтобы этого избежать и увидеть заветный «0»:
ПОЛНОЕ СОЕДИНЕНИЕ или ЛЕВОЕ СОЕДИНЕНИЕ со справочником (например, Справочник.Номенклатура), чтобы основной список объектов всегда присутствовал в результате.Мы рассмотрели различные способы борьбы с пустыми ячейками в отчетах. Подведем итоги: Запрос (ЕСТЬNULL) — лучший выбор для простых списков. Формат поля (ЧН=0) — самый быстрый способ для СКД. Ресурсы — обязателен для кросс-таблиц и матриц. Условное оформление — если нужно заменить пустоту на 0 только визуально в определенных строках.
Выбор метода зависит от архитектуры вашего отчета (в качестве упражнения можно изучить пример реализации таблицы умножения на СКД), но наиболее профессиональным считается сочетание обработки в запросе и настройки ресурсов для корректного отображения итогов.