В процессе разработки и администрирования конфигураций на платформе 1С:Предприятие программисты часто сталкиваются с необходимостью выборки данных, где определенные поля остаются незаполненными. Стандартный подход к фильтрации подразумевает использование условий, однако работа со значениями NULL имеет свои фундаментальные отличия от проверки на ноль или пустую строку.

Игнорирование этой специфики приводит к тому, что выборка либо возвращает лишние данные, либо, наоборот, не находит нужные записи. Разница между пустой ссылкой на объект и отсутствием значения в регистре может быть критичной для корректности бизнес-логики.

В данном материале мы подробно разберем синтаксис оператора IS NULL, рассмотрим особенности работы с типами данных и покажем, как правильно формировать условия в секции ГДЕ для надежной фильтрации. Это знание является базовым для любого специалиста по программированию в 1С.

Специфика проверки на неопределенное значение

В языке запросов 1С, как и в классических реляционных базах данных (например, PostgreSQL или MS SQL), значение NULL означает отсутствие данных, а не конкретное числовое или строковое значение. Логика сравнения здесь отличается от обычной арифметики.

Попытка использовать стандартные операторы сравнения, такие как = или <>, для поиска пустых значений приведет к ошибке или некорректному результату выполнения запроса. Система просто не сможет сопоставить"отсутствие значения" с каким-либо конкретным параметром.

Для решения этой задачи предусмотрен специальный синтаксический оператор. Необходимо использовать конструкцию IS NULL для поиска записей с пустым полем и IS NOT NULL для исключения таких записей. Это единственный корректный способ фильтрации отсутствующих данных в среде 1С.

Рассмотрим пример кода, демонстрирующий правильный подход к формированию условия:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Родитель IS NULL

Данный запрос вернет список всех элементов справочника, у которых не указан родительский элемент. Важно понимать, что поле Родитель в данном контексте должно быть именно пустым, а не ссылаться на какой-либо предопределенный элемент.

💡

Всегда проверяйте тип поля перед написанием условия. Для ссылочных типов NULL означает отсутствие ссылки, а для числовых — отсутствие числа, что логически эквивалентно, но семантически различается в отчетах.

Различия между нулем, пустой строкой и NULL

Начинающие разработчики часто путают понятия"пусто","ноль" и"пустая строка". В системе 1С эти сущности имеют разную природу и требуют разных подходов к фильтрации в тексте запроса.

Числовое поле может хранить значение 0. Это вполне конкретное число, которое участвует в вычислениях. Если вы напишете условие Поле = 0, вы получите все записи, где хранится ноль, но пропустите записи, где поле вообще не заполнено (NULL).

  • 🔢 Числовой ноль: проверяется через оператор равенства = 0.
  • 📝 Пустая строка: проверяется как ="" (две кавычки подряд).
  • NULL (Неопределено): проверяется исключительно через IS NULL.

Ошибки в разграничении этих понятий могут привести к серьезным искажениям в бухгалтерской или управленческой отчетности. Например, при расчете себестоимости пропуск записи с NULL вместо 0 может изменить итоговую сумму.

Поэтому при проектировании структуры метаданных и написании запросов следует четко определять, какое именно состояние поля считается"отсутствующим" для вашей задачи. Иногда требуется комбинированная проверка.

📊 С чем вы чаще всего путаете NULL в 1С?
Пустая строка
Числовой ноль
Ложь (Булево)
Не путаю, знаю различия

Особенности работы со ссылочными типами данных

Ссылочные типы данных (Справочники, Документы, Планы видов характеристик) являются основой архитектуры 1С. Пустая ссылка (ПустаяСсылка) в объектной модели и значение NULL в запросах тесно связаны, но имеют нюансы использования.

В коде встроенного языка вы можете создать пустую ссылку программно и сравнить её с переменной. Однако в тексте запроса к таблице базы данных мы оперируем непосредственно значением поля. Если поле ссылки не заполнено, в базе данных хранится NULL.

Частая ситуация: необходимо найти документы, по которым еще не проведен взаиморасчет или не указан контрагент. В таких случаях использование оператора IS NULL является наиболее производительным решением, так как оно позволяет оптимизатору запросов эффективно использовать индексы.

Тип поля Значение в базе Условие в запросе Пример результата
Ссылка (Справочник) NULL Поле IS NULL Ссылка не выбрана
Число NULL Поле IS NULL Число не введено
Строка NULL Поле IS NULL Текст не введен
Число 0 Поле = 0 Введен ноль

Следует помнить, что попытка обратиться к реквизитам пустой ссылки в запросе (например, Ссылка.Наименование) без предварительной проверки на NULL может привести к ошибкам выполнения или непредсказуемому поведению в зависимости от версии платформы.

💡

Использование IS NULL для ссылочных полей обеспечивает максимальную производительность выборки и корректную обработку случаев, когда связь между объектами еще не установлена.

Использование параметров и конструктора запросов

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

Конструктор запросов, встроенный в среду разработки 1С:Предприятие, автоматически генерирует правильный синтаксис при установке галочки"Не заполнено" в условиях отбора. Однако при ручном редактировании текста запроса разработчик должен самостоятельно контролировать написание оператора.

Рассмотрим пример использования параметра, который может принимать значение для фильтрации или быть неопределенным. В таких случаях удобно применять логику в условии ГДЕ:

ВЫБРАТЬ

РегистрНакопления.ТоварыНаСкладах.Номенклатура,

СУММА(РегистрНакопления.ТоварыНаСкладах.Количество) КАК Количество

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

ГДЕ

ТоварыНаСкладах.Серия &ПараметрСерии ИЛИ &ПараметрСерии IS NULL

Здесь конструкция &ПараметрСерии IS NULL позволяет игнорировать фильтр по серии, если параметр не передан. Это стандартный паттерн построения гибких отчетов.

Также стоит отметить возможность использования функции ЕСТЬNULL в выражениях, хотя для условий отбора в секции ГДЕ предпочтительнее именно оператор IS. Функция больше подходит для подстановки значений по умолчанию в списке выбора.

Нюанс работы с параметрами типа Массив

Если вы передаете в параметр массив значений, одним из элементов может быть Неопределено. В этом случае проверка через В (...) требует особого внимания к типизации элементов массива.

Оптимизация производительности при фильтрации

Вопрос производительности при работе с большими объемами данных всегда стоит остро. Проверка на IS NULL является"дружественной" для индексов базы данных, в отличие от некоторых функций, применяемых к полям в условии.

Если поле, по которому идет отбор, проиндексировано, то запрос с условием Поле IS NULL будет выполняться крайне быстро, так как СУБД может сразу обратиться к специальной части индекса, хранящей метки пустых значений.

  • 🚀 Индексы: Убедитесь, что для часто используемых в отборах полей созданы индексы в конфигураторе.
  • 🛑 Избегайте функций: Не пишите ЕСТЬNULL(Поле, 0) = 0 в условии ГДЕ, это может отключить использование индекса.
  • 📊 Планы выполнения: Анализируйте план выполнения запроса через панель администрирования сервера 1С для проверки эффективности.

В конфигурациях с высокой интенсивностью документооборота, таких как 1С:ERP или 1С:УТ, некорректные запросы могут блокировать таблицы и замедлять работу всех пользователей. Правильная фильтрация — залог стабильности системы.

⚠️ Внимание: В распределенных информационных базах (РИБ) логика заполнения полей может различаться на узлах. Проверка на NULL в центральном узле может дать результат, отличный от ожидаемого, если данные еще не синхронизированы.

Также следует учитывать специфику работы с виртуальными таблицами регистраов. Некоторые срезы могут автоматически подставлять значения по умолчанию, и явная проверка на NULL в таких случаях может не дать результатов, так как"пустых" записей в выборке виртуальной таблицы просто не существует.

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

Даже опытные специалисты иногда допускают опечатки или логические ошибки при формировании условий. Самая распространенная проблема — попытка сравнить поле со строкой"NULL" или значением Неопределено из встроенного языка в тексте запроса.

В тексте запроса слово NULL является ключевым словом, а не строковой константой. Его не нужно заключать в кавычки. Написание Поле ="NULL" приведет к поиску строки, состоящей из четырех букв, а не к поиску пустого значения.

Еще одна ошибка возникает при работе с составными типами. Если поле может хранить, например, Справочник или Число, то проверка IS NULL сработает корректно только если значение действительно не установлено. Если же там хранится пустая ссылка на справочник, это не всегда тождественно NULL в зависимости от настроек типа данных.

☑️ Диагностика проблемного запроса

Выполнено: 0 / 4

Для отладки сложных запросов рекомендуется использовать панель инструментов разработчика. Вы можете выполнить запрос по фрагменту и посмотреть полученные данные в табличном документе, чтобы убедиться, что фильтрация работает так, как задумано.

⚠️ Внимание: Структура метаданных и поведение виртуальных таблиц могут меняться при обновлении типовых конфигураций. Всегда сверяйте имена полей и их свойства после обновления релиза платформы или конфигурации.

Часто задаваемые вопросы (FAQ)

Можно ли использовать оператор IS NULL в предложениях Соединение (JOIN)?

Да, оператор IS NULL можно использовать в условиях соединения таблиц, однако чаще его применяют в секции ГДЕ или в условии ЛЕВОЕ СОЕДИНЕНИЕ... ПО... IS NULL для поиска записей, которые не нашли пару в другой таблице (аналог анти-соединения).

В чем разница между ПустаяСсылка в коде и NULL в запросе?

ПустаяСсылка — это объект встроенного языка, представляющий пустую ссылку. NULL — это значение в базе данных. При записи пустой ссылки в базу она сохраняется как NULL, поэтому в запросе мы проверяем именно NULL.

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

Возможно, поле заполнено значением по умолчанию (например, 0 или пустой строкой), а не является неопределенным (NULL). Проверьте содержимое базы данных или используйте отладчик для просмотра точного значения переменной.

Как обработать NULL в результатах запроса перед выводом в форму?

Для этого удобно использовать функцию ЕСТЬNULL(Значение, ЗаменяющееЗначение) прямо в списке выбираемых полей запроса, чтобы подставить понятное пользователю значение вместо пустоты.