Как отобрать пустые ссылки в запросе 1c8

При работе с языком запросов 1С:Предприятия 8 разработчики часто сталкиваются с необходимостью отбора записей, содержащих пустые ссылки на объекты базы данных. Пустая ссылка (NULL reference) — это специальное значение, указывающее на отсутствие связи с конкретным элементом справочника или документа. В этой статье мы подробно рассмотрим все способы фильтрации пустых ссылок в запросах 1С8, разберём практические примеры и типичные ошибки.

Table of Contents

📋 Быстрый FAQ: Пустые ссылки в запросах 1С8

❓ Как определить пустую ссылку в 1С?

Ответ: Используйте функцию Пустая(Ссылка) в коде или конструкцию ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка) в запросах. Пустая ссылка имеет тип, но не указывает на реальный объект.

❓ Как фильтровать пустые ссылки в запросе 1С8?

Ответ: В условии WHERE используйте: ГДЕ Поле = ЗНАЧЕНИЕ(Справочник.Тип.ПустаяСсылка) для отбора пустых ссылок или ГДЕ Поле <> ЗНАЧЕНИЕ(Справочник.Тип.ПустаяСсылка) для исключения пустых.

❓ В чем разница между NULL и пустой ссылкой?

Ответ: Пустая ссылка — это типизированное значение (например, СправочникСсылка.Контрагенты), не указывающее на объект. NULL — отсутствие значения в поле базы данных. В запросах для NULL используйте ЕСТЬ NULL.

❓ Как заменить NULL на 0 в запросе?

Ответ: Используйте функцию ЕСТЬNULL(Поле, 0) — она вернет 0, если поле содержит NULL, или само значение поля в противном случае.


🔧 Пошаговая инструкция: Работа с пустыми ссылками в запросах 1С8

Шаг 1: Определите тип ссылочного поля

Выясните точный тип поля (Справочник, Документ, Перечисление), с которым работаете.

Шаг 2: Выберите способ проверки

  • В коде: Если Пустая(Объект.Поле) Тогда
  • В запросе: ГДЕ Поле = ЗНАЧЕНИЕ(Справочник.Тип.ПустаяСсылка)

Шаг 3: Напишите условие отбора

Добавьте в секцию WHERE запроса проверку на пустую ссылку с правильной типизацией.

Шаг 4: Обработайте NULL-значения

Для LEFT JOIN и возможных NULL используйте ЕСТЬNULL() для замены пустых значений.

Шаг 5: Протестируйте запрос

Проверьте работу запроса на тестовых данных с заведомо пустыми и заполненными значениями.


✅ Чек-лист корректности запроса на пустые ссылки

Перед выполнением запроса проверьте:

  • [ ] Указан правильный тип в ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)
  • [ ] Для NULL-значений используется ЕСТЬNULL() или ЕСТЬ NULL
  • [ ] Учтена иерархия справочников (проверка ЭтоГруппа при необходимости)
  • [ ] Для составных типов проверены все варианты пустых ссылок
  • [ ] В LEFT JOIN обработаны возможные NULL-значения
  • [ ] Параметры запроса типизированы корректно
  • [ ] Запрос протестирован на небольшом объеме данных
  • [ ] Производительность проверена для больших таблиц

Что такое пустая ссылка в 1С:Предприятие 8

Пустая ссылка — это особое значение типа данных «Ссылка», которое не указывает ни на один реальный объект информационной базы. Она используется для обозначения отсутствия значения в реквизитах типа «Справочник», «Документ», «Перечисление» и других ссылочных типах.

Основные характеристики пустой ссылки:

  • Имеет определённый тип (например, СправочникСсылка.Номенклатура)
  • Не ссылается ни на какой существующий объект
  • Возвращает ИСТИНА при проверке методом Пустая()
  • Эквивалентна NULL в SQL-базах данных

Способы отбора пустых ссылок в запросах 1С8

Способ 1: Использование функции ЗНАЧЕНИЕ() в тексте запроса

Самый распространённый и рекомендуемый способ — использование конструкции ЗНАЧЕНИЕ() непосредственно в условии WHERE запроса.

Синтаксис для справочников:

ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ЗНАЧЕНИЕ(Документ.Реализация.ПустаяСсылка)

либо передавая в запрос в качестве параметра пустую ссылку:

Запрос.УстановитьПараметр(&quot;ПустаяСсылка&quot;
Справочники.Номенклатура.ПустаяСсылка());

Вот пример запроса с проверкой на пустую ссылку:

Запрос = Новый Запрос;
    Запрос.Текст = &quot;
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   докТовары.Ссылка 
    |ИЗ
    |   Документ.ЭКОМ_Документы.ТЧ_Товары КАК докТовары
    |ГДЕ
    |   докТовары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    |&quot;;
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

Разница между NULL и Неопределено при проверке пустых ссылок

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

Для корректной проверки используйте следующие конструкции:

// Проверка пустой ссылки
Если Пустая(Документ.Ссылка) Тогда
    // Действия
КонецЕсли;

// Проверка на Неопределено
Если Значение = Неопределено Тогда
    // Действия
КонецЕсли;

// Универсальная проверка
Если НЕ ЗначениеЗаполнено(Значение) Тогда
    // Обрабатывает и пустые ссылки, и Неопределено, и пустые строки
КонецЕсли;

В запросах для фильтрации NULL используйте конструкцию:

ГДЕ
    Таблица.Поле ЕСТЬ NULL
    ИЛИ Таблица.Поле = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Практические примеры работы с типами данных в запросах 1С

Пример 1: Отбор документов с незаполненными реквизитами

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|    Реализация.Ссылка КАК Документ,
|    Реализация.Дата,
|    Реализация.Контрагент
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
|    Реализация.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
|    И Реализация.Проведен = ИСТИНА
";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Этот запрос находит все проведенные документы реализации без указанного контрагента.

Пример 2: Подсчет записей с пустыми и заполненными значениями

Запрос.Текст = "
|ВЫБРАТЬ
|    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ 
|        ВЫБОР КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|            ТОГДА 1
|        ИНАЧЕ NULL
|        КОНЕЦ) КАК БезРодителя,
|    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ 
|        ВЫБОР КОГДА Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|            ТОГДА 1
|        ИНАЧЕ NULL
|        КОНЕЦ) КАК СРодителем
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
";

Пример 3: Использование ЕСТЬNULL для замены пустых значений

В языке запросов 1С для работы с NULL-значениями применяется функция ЕСТЬNULL (аналог ISNULL/COALESCE в SQL):

ВЫБРАТЬ
    Товары.Номенклатура.Наименование КАК Товар,
    ЕСТЬNULL(Товары.Склад.Наименование, "Склад не указан") КАК Склад,
    Товары.Количество
ИЗ
    Документ.ПриходнаяНакладная.Товары КАК Товары

Более подробно о работе с данными в 1С можно узнать в статье Язык запросов 1С.

Как подставить 0 вместо пустого значения в запросе

Часто при работе с числовыми полями требуется заменить NULL или пустое значение на 0 для корректных расчетов. Это особенно актуально при суммировании или математических операциях.

Способ 1: Использование ЕСТЬNULL

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

Способ 2: Использование конструкции ВЫБОР КОГДА

ВЫБРАТЬ
    Документы.Ссылка,
    ВЫБОР
        КОГДА Документы.Сумма ЕСТЬ NULL
            ТОГДА 0
        ИНАЧЕ Документы.Сумма
    КОНЕЦ КАК СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг КАК Документы

Способ 3: Замена пустых ссылок значением по умолчанию

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

Дополнительную информацию о работе с регистрами можно найти в материале Работа с регистрами в 1С.

Типичные ошибки при работе с пустыми ссылками и их решение

Ошибка 1: Сравнение с NULL вместо пустой ссылки

Неправильно:

ГДЕ Документы.Контрагент = NULL

Правильно:

ГДЕ Документы.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

Причина: В языке запросов 1С NULL не является значением для сравнения со ссылочными типами.

Ошибка 2: Забытая типизация пустой ссылки

Неправильно:

Запрос.УстановитьПараметр("ПустаяСсылка", NULL);

Правильно:

Запрос.УстановитьПараметр("ПустаяСсылка", 
    Справочники.Контрагенты.ПустаяСсылка());

Ошибка 3: Игнорирование иерархии справочников

При работе с иерархическими справочниками важно учитывать, что элемент может быть группой:

ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    И НЕ Номенклатура.ЭтоГруппа

Ошибка 4: Неучет составных типов

Если реквизит имеет составной тип данных (например, СправочникСсылка.Контрагенты, СправочникСсылка.Номенклатура), проверка должна учитывать все типы:

ГДЕ
    (Объект.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    ИЛИ Объект.Владелец = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))

Подробнее о типах данных читайте в статье Типы данных в 1С Предприятие.

Чек-лист по работе с запросами и пустыми ссылками

Перед написанием запроса:

  • [ ] Определите точный тип ссылочного поля
  • [ ] Уточните, является ли справочник иерархическим
  • [ ] Проверьте, может ли поле содержать составной тип
  • [ ] Решите, нужна ли проверка на NULL или на пустую ссылку

При написании запроса:

  • [ ] Используйте ЗНАЧЕНИЕ() для указания пустой ссылки нужного типа
  • [ ] Применяйте ЕСТЬNULL() для замены NULL-значений
  • [ ] Используйте ЗначениеЗаполнено() в коде для универсальной проверки
  • [ ] Учитывайте производительность: проверка на пустую ссылку выполняется быстрее сложных условий
  • [ ] Для LEFT JOIN всегда обрабатывайте возможные NULL значения

При отладке:

  • [ ] Проверьте типизацию параметров запроса
  • [ ] Убедитесь, что используется правильный синтаксис пустой ссылки
  • [ ] Протестируйте запрос на тестовой базе с заведомо пустыми значениями
  • [ ] Проверьте план запроса через консоль запросов
  • [ ] Замерьте время выполнения на реальных объемах данных

Оптимизация:

  • [ ] Используйте индексы для полей с частой проверкой на пустоту
  • [ ] Избегайте множественных проверок одного поля
  • [ ] Выносите проверки пустых ссылок в секцию WHERE, а не в SELECT
  • [ ] Применяйте виртуальные таблицы с параметрами для фильтрации

Полезные ссылки

Для углубленного изучения языка запросов 1С рекомендуется ознакомиться с официальной документацией:

Заключение

Работа с пустыми ссылками в запросах 1С требует понимания специфики типов данных платформы. Правильное использование функций ЗНАЧЕНИЕ(), ЕСТЬNULL() и ЗначениеЗаполнено() позволяет создавать надежные и производительные запросы. Следование чек-листу и знание типичных ошибок помогут избежать проблем на этапе разработки и эксплуатации конфигураций.

При возникновении сложностей всегда обращайтесь к официальной документации 1С и тестируйте запросы на небольших объемах данных перед внедрением в промышленную эксплуатацию.

2Comments

Add yours
  1. 1
    Инара

    Здравствуйте! Простите за глупый вопрос. Как написать запрос, чтобы, если значение пусто(значения в поле нет) подставлял 0? Делаю в запросе вот так ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток, не работает.

    • 2
      Владимир Тюрюков

      Спасибо за вопрос.
      Пусто в Запросе может быть как NULL или как Неопределено.
      NULL возникает при соединении таблиц когда соответствие не найдено.
      Неопределено — тип данных 1С. Может возникать в других случаях.

      Я предлагаю посмотреть через КонсольЗапросов какое значение возвращается в этом поле. А потом сделать вот такое поле с проверкой на это значение:
      ВЫБОР КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток = Неопределено Тогда 0 Иначе СвободныеОстаткиОстатки.ВНаличииОстаток КОНЕЦ КАК Остаток,

      но можно попробовать сразу эту конструкцию, а если не взлетит то попробовать узнать значение через консоль запросов

+ Leave a Comment