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

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

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

Прежде чем писать код, необходимо четко понимать, как платформа хранит отсутствие данных. В реляционных базах данных, которые используются под капотом , существует специальное состояние поля, называемое NULL. Это не пустая строка и не ноль, это именно отсутствие какого-либо значения.

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

Если вы попытаетесь использовать обычное сравнение на равенство или неравенство с NULL, результат всегда будет ложным. Это фундаментальное правило SQL, которое действует и в запросах 1С. Поэтому стандартные операторы = или <> здесь не подходят.

⚠️ Внимание: Попытка сравнить поле с NULL через оператор = (например, Где Поле = NULL) всегда вернет пустую выборку, так как неизвестное значение не может быть равно самому себе в логике баз данных.

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

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

Самый надежный и читаемый способ проверить, заполнен ли реквизит в запросе 1С — это использование ключевого слова ЕСТЬ НЕ NULL. Эта фраза явно указывает движку базы данных, что нас интересуют только строки, где в указанном поле хранится какое-либо конкретное значение.

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

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

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Комментарий

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Комментарий ЕСТЬ НЕ NULL

Обратная ситуация возникает, когда нужно найти документы без комментария. Для этого используется конструкция ЕСТЬ NULL. Она выбирает только те записи, где поле не инициализировано.

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

Специфика проверки строковых реквизитов

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

Если ваша задача — найти записи, где пользователь действительно ввел какой-то текст, использования только ЕСТЬ НЕ NULL может быть недостаточно. Вам придется комбинировать проверку на NULL с проверкой длины строки или сравнением с пустой строкой.

Для этого в условии ГДЕ можно использовать логическое И. Сначала мы отсеиваем NULL, а затем проверяем, что строка не пустая. Это гарантирует, что в выборку попадут только осмысленные данные.

ВЫБРАТЬ

Контрагенты.Наименование,

Контрагенты.ИНН

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.ИНН ЕСТЬ НЕ NULL

И Контрагенты.ИНН <> ""

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

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

Помните, что сравнение строк чувствительно к пробелам. Строка, содержащая один пробел, не равна пустой строке. Если требуется строгая проверка, возможно, потребуется использовать функцию СТРОКА или обработку на стороне приложения.

Проверка ссылочных типов и составных типов

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

Когда вы проверяете такое поле на заполненность через ЕСТЬ НЕ NULL, вы фактически проверяете, не является ли значение неопределенным. Если в поле записана конкретная ссылка на элемент справочника, условие выполнится.

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

📊 Как вы чаще всего проверяете строки на пустоту?
Только ЕСТЬ НЕ NULL
Комбинация с <> ""
Функция СТРОКА
Не проверяю, это делает пользователь

Если реквизит является составным и может содержать, например, Число или Строку, то NULL будет означать отсутствие любого из этих значений. Логика проверки остается прежней: ЕСТЬ НЕ NULL отфильтрует случаи, когда поле вообще не заполнено.

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

Функции обработки NULL в выражениях

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

Функция ЕСТЬNULL принимает два аргумента. Первый — проверяемое выражение, второй — значение, которое будет возвращено, если первое равно NULL. Это позволяет избежать ошибок при дальнейших вычислениях, например, при суммировании.

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

ВЫБРАТЬ

Товары.Наименование,

ЕСТЬNULL(Товары.Остаток, 0) КАК Остаток

ИЗ

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

Существует также функция NULLIF, которая работает в обратном направлении: она возвращает NULL, если два выражения равны. Это полезно, если нужно программно "обнулить" поле при определенных условиях прямо в запросе.

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

Сравнение производительности различных методов

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

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

Использование функций над полями в условии ГДЕ (например, СТРОКА(Поле) <> "") может привести к полному сканированию таблицы (Table Scan), что критически замедлит работу при больших объемах данных.

Ниже приведена таблица, сравнивающая основные подходы к проверке и их влияние на производительность:

Метод проверки Читаемость Использование индекса Рекомендация
ЕСТЬ НЕ NULL Высокая Да (эффективно) Основной метод
<> "" (для строк) Средняя Зависит от СУБД Только в паре с ЕСТЬ НЕ NULL
Функции в WHERE Низкая Нет (полный обход) Избегать
ИСТИНА / ЛОЖЬ Высокая Да Только для булевых полей
💡

Использование конструкции ЕСТЬ НЕ NULL обеспечивает наилучшую производительность за счет корректной работы с индексами базы данных.

Всегда старайтесь писать условия так, чтобы поле оставалось "чистым" в левой части оператора сравнения. Это золотое правило оптимизации SQL-запросов, которое полностью применимо и к платформе 1С.

Типичные ошибки и отладка запросов

Даже опытные разработчики иногда допускают ошибки при работе с пустыми значениями. Одна из самых частых проблем — ожидание, что NULL ведет себя как обычное значение. Это приводит к тому, что отчеты показывают неверные итоговые суммы или количество строк.

Еще одна распространенная ошибка — проверка булевых реквизитов. Поле типа Булево может принимать значения ИСТИНА, ЛОЖЬ или NULL (если поле допускает пустое значение). Проверка Где Поле = ИСТИНА отсечет и ЛОЖЬ, и NULL.

Если вам нужно найти все записи, где флаг не установлен (включая случаи, когда он вообще не заполнен), условие ЕСТЬ НЕ NULL не подойдет, так как оно выберет и ИСТИНА, и ЛОЖЬ. В таком случае нужно явно писать Где Поле = ЛОЖЬ ИЛИ Поле ЕСТЬ NULL.

Почему мой запрос возвращает лишние строки?

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

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

⚠️ Внимание: Поведение NULL может различаться в разных СУБД (MSSQL, PostgreSQL, Oracle), на которых работает 1С. Хотя платформа старается унифицировать это, в сложных вычислениях на стороне СУБД могут быть нюансы.

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

Практические примеры для разных задач

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

ВЫБРАТЬ

ФизическиеЛица.Ссылка,

ФизическиеЛица.Наименование

ИЗ

Справочник.ФизическиеЛица КАК ФизическиеЛица

ГДЕ

ФизическиеЛица.Телефон ЕСТЬ NULL

ИЛИ ФизическиеЛица.Телефон = ""

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

Третий пример — расчет зарплаты. Если ставка не заполнена, нельзя рассчитывать доход. Здесь мы используем ЕСТЬNULL для подстановки минимального значения, чтобы расчет не прерывался ошибкой деления на ноль или отсутствия операнда.

☑️ Проверка качества запроса

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

Эти примеры демонстрируют, что универсального рецепта нет, но есть набор инструментов. Комбинируя их, вы можете решать любые задачи по фильтрации данных в 1С.

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

В чем разница между ЕСТЬ NULL и = NULL?

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

Как проверить, что строка не пустая и не NULL?

Необходимо использовать составное условие: ГДЕ Поле ЕСТЬ НЕ NULL И Поле <> "". Первая часть отсеивает записи, где поле не заполнено вовсе, вторая — где записана пустая строка.

Влияет ли проверка на NULL на скорость работы 1С?

Да, влияет положительно, если используется конструкция ЕСТЬ НЕ NULL. Она позволяет базе данных использовать индексы. Использование функций для проверки (например, ДЛИНА(Поле) > 0) в условии ГДЕ может отключить индексы и замедлить выборку.

Что вернет запрос, если в таблице все поля NULL?

Если в условии ГДЕ указано Поле ЕСТЬ НЕ NULL, а во всей таблице в этом поле стоит NULL, то результат выборки будет пустым. Запрос не вернет ни одной строки.

Можно ли использовать ЕСТЬ НЕ NULL для полей типа Число?

Да, можно. Для числовых полей NULL означает, что число не введено. Это отличается от числа 0. Проверка ЕСТЬ НЕ NULL найдет все записи, где введено любое число, включая ноль, если только ноль не записан явно как значение, а поле не пустое.