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