Почему вместо нулевого остатка в запросе 1С отображается пустое поле и как это исправить?

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

При разработке отчетов по остаткам товаров программисты часто сталкиваются с ситуацией, когда для товаров, которых нет в наличии, в колонке количества отображается пустое место вместо привычного нуля. Это вызывает путаницу у пользователей и затрудняет чтение отчета. Разберем детально, почему так происходит и какие механизмы платформы 1С позволяют корректно вывести заветную цифру «0».

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

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

Важно понимать разницу: NULL — это отсутствие значения как такового в базе данных, а 0 — это конкретное числовое значение. Платформа 1С по умолчанию часто отображает NULL и число 0 одинаково — как пустую ячейку, чтобы не загромождать интерфейс лишними данными. Однако для бизнес-логики нам часто требуется именно числовое представление.

Решение на уровне текста запроса: функция ЕСТЬNULL

Рассмотрим самый первый и основной способ исправления ситуации — обработку результата непосредственно в языке запросов. Для этого предназначена функция ЕСТЬNULL. Она проверяет первый аргумент, и если он равен NULL, подставляет значение второго аргумента.

Посмотрим на пример правильного написания запроса:


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

В данном примере, если поле Остатки.КоличествоОстаток окажется пустым (в состоянии NULL), система принудительно вернет число 0. Это фундаментальный шаг, без которого дальнейшие настройки могут не сработать корректно.

Особенности отображения в Консоли запросов

Выясним одну важную деталь, которая часто сбивает с толку новичков. Если вы применили функцию ЕСТЬNULL(..., 0) и запустили запрос в Консоли запросов, вы все равно можете увидеть пустое поле. Почему так происходит?

Проанализируем работу инструмента: многие консоли запросов программно скрывают нули в таблице результата для повышения читаемости. Чтобы проверить, действительно ли в поле находится число 0, а не NULL, попробуйте дважды щелкнуть по ячейке. Если ячейка позволяет ввод или выделение пустоты как числа, значит, там ноль. Если же значение действительно отсутствует, в некоторых консолях может отображаться надпись <NULL> или поле будет заблокировано для взаимодействия.

Использование форматных строк для вывода нуля

Если в запросе данные уже обработаны, но в отчете все равно «пусто», нам поможет механизм Формата. В 1С существует специальный параметр форматной строки ЧН (Число Ноль), который определяет, что выводить, если значение равно нулю.

Разберем, как это реализовать:

  1. В программном коде при выводе значения можно использовать функцию: Формат(Значение, "ЧН=0"). Это заставит систему вывести символ "0" вместо пустоты.
  2. В Системе компоновки данных (СКД) на вкладке Наборы данных или Выбранные поля найдите колонку Оформление.
  3. В параметре Формат введите строку: ЧН=0. Если вам нужно отображать десятичные знаки, используйте ЧН=0,00.

Этот способ является наиболее правильным с точки зрения архитектуры 1С, так как он разделяет данные (хранение числа) и представление (визуальный вывод).

Настройка в Системе компоновки данных (СКД)

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

Вариант А: Использование Условного оформления

Проанализируем ситуацию: мы хотим, чтобы абсолютно любое пустое или нулевое значение выглядело как "0". Для этого:

Вариант Б: Выражение представления

В схеме компоновки у каждого поля есть свойство Выражение представления. Мы можем прописать там логику:

Выбор Когда Значение = 0 Тогда "0" Иначе Формат(Значение, "ЧЦ=15; ЧДЦ=3") Конец

Обработка NULL в ресурсах СКД

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

Сумма(ЕСТЬNULL(КоличествоОстаток, 0))

Это гарантирует, что на уровне итогов по складу или организации вы также получите числовое значение, а не пустое поле.

Типизация полей и функция ВЫРАЗИТЬ

Иногда система не может корректно определить тип колонки, если в ней перемешаны числа и значения NULL. Чтобы принудительно заставить платформу считать колонку числовой, что способствует правильному выравниванию и выводу нулей, рекомендуем использовать конструкцию ВЫРАЗИТЬ.

Посмотрим на пример комбинированного подхода:


ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    ВЫРАЗИТЬ(ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК ЧИСЛО(15, 3)) КАК Остаток
ИЗ
    Справочник.Номенклатура КАК Товары
    ...

Подведем итог: если вы видите пустое поле вместо нуля, сначала убедитесь, что в запросе используется ЕСТЬNULL. Если это не помогло — используйте форматную строку ЧН=0 в настройках отчета или условное оформление в СКД. Помните, что визуальное отсутствие цифры в консоли запросов — это часто лишь особенность отображения самого инструмента разработки, а не ошибка в данных.

← На главную