Почему запрос не выводит товары, у которых нет записи в регистре цен?

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

При работе с запросами в 1С часто возникает ситуация, когда нужно получить список всей номенклатуры, включая те позиции, для которых в регистре сведений еще не задана цена. Разберем, почему стандартный подход с использованием ЛЕВОГО СОЕДИНЕНИЯ может приводить к исчезновению части данных из выборки.

Разбор проблемы: работа с NULL в запросах

Когда вы используете ЛЕВОЕ СОЕДИНЕНИЕ, 1С пытается найти соответствие между записями в справочнике и регистре. Если для товара не найдено ни одной записи в регистре ЦеныНоменклатуры, то в колонке Цена для этого товара будет установлено значение NULL.

В языке запросов 1С NULL — это не ноль и не пустое значение. Это индикатор отсутствия данных. Любая операция сравнения, например Цены.Цена = 0, при встрече с NULL возвращает значение «Ложь». В результате товары, для которых цена не задана, просто отсекаются условием ГДЕ, так как для них условие не выполняется.

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

Чтобы включить в выборку как товары с нулевой ценой, так и те, у которых записи в регистре отсутствуют вообще, нам необходимо привести значение NULL к числовому значению 0. Для этого используется встроенная функция ЕСТЬNULL (в английской версии ISNULL).

Давайте перепишем текст запроса, чтобы он стал корректным:


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

Почему это работает?

Функция ЕСТЬNULL(Выражение, ЗначениеЗамены) работает по следующему принципу:

  1. Она анализирует переданное выражение (в нашем случае — Цены.Цена).
  2. Если там есть реальное значение (число), она оставляет его без изменений.
  3. Если там обнаруживается NULL, она подставляет значение, которое мы указали вторым аргументом (в нашем случае — 0).

Таким образом, после применения этой функции, товары без цен «превращаются» в товары с ценой 0, что позволяет нам успешно отфильтровать их в блоке ГДЕ.

Оптимизация условий в запросе

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

Вместо того чтобы передавать параметр &ЭтоГруппа, который всегда равен Ложь, гораздо проще использовать логическое отрицание. Конструкция НЕ СправочникНоменклатура.ЭтоГруппа работает значительно быстрее, так как не требует передачи дополнительных параметров через метод УстановитьПараметр.

Советы по отладке

Чтобы всегда понимать, почему запрос возвращает те или иные данные, мы рекомендуем придерживаться следующих правил:

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

← На главную