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