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