Почему в запросе 1С появляются пустые записи и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

Разработка запросов — это основа работы в системе 1С:Предприятие. Нередко разработчики сталкиваются с ситуацией, когда после выполнения запроса в итоговой выборке появляются «пустые» записи, которые не ожидались. Давайте разберем, почему это происходит и как правильно настроить логику соединения таблиц, чтобы избежать появления NULL, «пустых ссылок» и значений НЕОПРЕДЕЛЕНО.

Понимание природы «пустых» данных

При использовании ЛЕВОЕ СОЕДИНЕНИЕ система выбирает все записи из левой таблицы и пытается найти им соответствие в правой. Если соответствие не найдено, все поля правой таблицы заполняются значением NULL. Новички часто путают NULL с ПустаяСсылка или Неопределено, однако с точки зрения платформы 1С это разные сущности:

Как решить проблему с пустыми результатами

Если ваша задача — исключить записи, которые не соединились, рассмотрите возможность изменения типа соединения. В случаях, когда «пустые» строки вам не нужны в принципе, ВНУТРЕННЕЕ СОЕДИНЕНИЕ является наиболее подходящим инструментом.

Разберем это на примере вашего запроса. Если записи из ЭтапПроизводства2_2.ХХХ_Товары должны существовать только в том случае, если документ-основание корректно найден, используйте конструкцию:


ВЫБРАТЬ
    ЭтапПроизводства2_2ХХХ_Товары.Номенклатура КАК Номенклатура,
    ЭтапПроизводства2_2ХХХ_Товары.Количество КАК Количество
ИЗ
    Документ.ХХХ_ВнутреннееПеремещение.ХХХ_Основание КАК ХХХ_ВнутреннееПеремещениеХХХ_Основание
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЭтапПроизводства2_2.ХХХ_Товары КАК ЭтапПроизводства2_2ХХХ_Товары
    ПО ХХХ_ВнутреннееПеремещениеХХХ_Основание.ДокументСсылка = ЭтапПроизводства2_2ХХХ_Товары.Ссылка
ГДЕ
    ХХХ_ВнутреннееПеремещениеХХХ_Основание.Ссылка = &ТекущийДокумент

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

Если вы хотите оставить левое соединение, но заменить «пустоту» на конкретное значение или отфильтровать записи, используйте встроенную функцию ЕСТЬNULL. Она позволяет принудительно заменить NULL на заданное значение:


ВЫБРАТЬ
    ЕСТЬNULL(ЭтапПроизводства2_2ХХХ_Товары.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Номенклатура
ИЗ
    ...

Советы по отладке запросов

  1. Консоль запросов: Всегда держите под рукой консоль запросов, адаптированную под управляемые формы. Это позволит вам видеть реальный результат выборки, включая значения NULL, которые могут быть не очевидны в обычном отладчике.
  2. Конструктор запросов: Используйте конструктор в конфигураторе. Он помогает визуализировать связи и автоматически подставляет нужные типы соединений. Если вы работаете с расширениями, добавляйте в расширение необходимые объекты метаданных, чтобы конструктор видел их структуру.
  3. Отладчик: Если запрос сложный и состоит из нескольких временных таблиц, используйте отладчик. Вы можете выполнить запрос по частям, просматривая содержимое временных таблиц через функцию Запрос.ВыполнитьПакет().
  4. Фильтрация: Помните, что условие ГДЕ Поле <> ЗНАЧЕНИЕ(...) не сработает для NULL. Всегда проверяйте поля на наличие NULL с помощью конструкции ГДЕ Поле ЕСТЬ НЕ NULL.

Использование правильных методов соединения и функций обработки NULL позволит вам создавать стабильные и производительные запросы, избавляясь от мусорных данных на этапе их выборки из базы данных. Работайте последовательно, проверяя каждый участок объединения ОБЪЕДИНИТЬ ВСЕ, чтобы исключить дублирование или пропуск данных.

← На главную