При работе с языком запросов 1С:Предприятия 8 разработчики часто сталкиваются с необходимостью отбора записей, содержащих пустые ссылки на объекты базы данных. Пустая ссылка (NULL reference) — это специальное значение, указывающее на отсутствие связи с конкретным элементом справочника или документа. В этой статье мы подробно рассмотрим все способы фильтрации пустых ссылок в запросах 1С8, разберём практические примеры и типичные ошибки.
📋 Быстрый 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 запроса.
Синтаксис для справочников:
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ЗНАЧЕНИЕ(Документ.Реализация.ПустаяСсылка)
либо передавая в запрос в качестве параметра пустую ссылку:
Запрос.УстановитьПараметр("ПустаяСсылка"
Справочники.Номенклатура.ПустаяСсылка());
Вот пример запроса с проверкой на пустую ссылку:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| докТовары.Ссылка
|ИЗ
| Документ.ЭКОМ_Документы.ТЧ_Товары КАК докТовары
|ГДЕ
| докТовары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Разница между 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С и тестируйте запросы на небольших объемах данных перед внедрением в промышленную эксплуатацию.
Здравствуйте! Простите за глупый вопрос. Как написать запрос, чтобы, если значение пусто(значения в поле нет) подставлял 0? Делаю в запросе вот так ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток, не работает.
Спасибо за вопрос.
Пусто в Запросе может быть как NULL или как Неопределено.
NULL возникает при соединении таблиц когда соответствие не найдено.
Неопределено — тип данных 1С. Может возникать в других случаях.
Я предлагаю посмотреть через КонсольЗапросов какое значение возвращается в этом поле. А потом сделать вот такое поле с проверкой на это значение:
ВЫБОР КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток = Неопределено Тогда 0 Иначе СвободныеОстаткиОстатки.ВНаличииОстаток КОНЕЦ КАК Остаток,
но можно попробовать сразу эту конструкцию, а если не взлетит то попробовать узнать значение через консоль запросов