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

Когда вы формируете выборку, система считывает данные непосредственно из базы данных (SQL Server, PostgreSQL или встроенной). Если в ячейке таблицы базы данных ничего не записано, там хранится специальный маркер NULL. Однако в объектной модели пустое текстовое значение может быть представлено как строка длиной ноль символов. Неправильная интерпретация этих состояний в условии ГДЕ может исключить нужные записи или, наоборот, вернуть лишний мусор.

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

Фундаментальные отличия NULL и пустой строки

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

С другой стороны, пустая строка "" — это вполне конкретное значение. Это строка, длина которой равна нулю. Она существует, она записана в поле, и система знает, что там «ничего нет», но сам факт записи присутствует. В запросах 1С эти два состояния требуют разных подходов к проверке, и смешивать их в одном условии без специальной обработки нельзя.

Если вы попытаетесь сравнить поле со строкой "", а в базе там лежит NULL, условие вернет ЛОЖЬ. И наоборот, проверка на NULL не сработает для пустой строки. Для надежной фильтрации часто требуется комбинированная логика. Ошибки в этом месте часто приводят к тому, что документы с незаполненными комментариями просто не попадают в отчет, хотя пользователь ожидает их видеть.

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

💡

Используйте консоль запросов для быстрой проверки: выберите топ 10 записей и посмотрите, как отображаются пустые поля — как или как пустое пространство. Это даст понимание природы данных.

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

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

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

ЕСТЬNULL(Справочник.Номенклатура.Описание, "") = ""

В приведенном выше примере запрос вернет все элементы, у которых поле Описание либо равно NULL, либо является пустой строкой. Функция сначала подменяет NULL на "", а затем условие = "" отфильтровывает все записи, где описание действительно отсутствует. Это наиболее чистый способ получить полный список «пустых» записей.

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

💡

Оператор ЕСТЬNULL(Поле, "") = "" является универсальным решением для поиска записей, где поле не заполнено (ни NULL, ни текст).

Прямое сравнение с пустой строкой и оператором ИСТИНА

Иногда разработчики пытаются использовать более «человеческие» конструкции, полагаясь на неявные преобразования типов. В языке запросов 1С существует возможность проверять строку на истинность. Пустая строка в логическом контексте часто трактуется как ЛОЖЬ, а любая строка с символами — как ИСТИНА. Однако полагаться на это в явном виде без понимания механизма рискованно.

Рассмотрим вариант с явным сравнением. Если вы уверены, что в вашей базе данных NULL в текстовых полях не используется (что бывает редко, но возможно при жесткой схеме данных), можно использовать простое условие:

ГДЕ Справочник.Контрагенты.ИНН = ""

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

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

  • 🔍 Оператор = "" находит только явные пустые строки.
  • 🚫 Оператор != "" находит все строки с текстом, но также включает NULL (так как NULL не равен пустой строке).
  • ✅ Комбинация ЕСТЬNULL(Поле, "") выравнивает логику обработки.

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

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

В некоторых случаях рекомендуется использовать вычисляемые поля или дополнительные регистры сведений, где факт заполнения уже помечен булевым флагом. Это позволяет избегать вызова функций в условии выборки и использовать быстрые индексные поиски по флагу ИСТИНА/ЛОЖЬ.

Тем не менее, для разовых отчетов и административных выборок использование ЕСТЬNULL вполне допустимо. Платформа 1С:Предприятие 8.3 и новее обладает достаточно умным оптимизатором запросов, который в большинстве случаев корректно строит планы выполнения даже для функций-оберток.

Секрет оптимизации

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

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

Сравнительная таблица методов проверки

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

Метод проверки Находит NULL Находит "" Рекомендация
Поле = NULL Да Нет Только для чистого NULL
Поле = "" Нет Да Только для явной пустоты
ЕСТЬNULL(Поле, "") = "" Да Да Универсальный метод
Поле ЕСТЬ NULL Да Нет Альтернатива = NULL

Как видно из таблицы, единственный способ гарантированно захватить оба состояния «пустоты» — это использование функции замены. Прямые сравнения работают только с одним конкретным состоянием. Игнорирование этого факта — источник 90% багов в отчетах по незаполненным данным.

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

📊 Как вы обычно проверяете поля на пустоту?
Через ЕСТЬNULL
Через = ""
Через НЕ (Поле ЕСТЬ NULL)
Я не проверяю, у нас все заполнено

Обработка результатов в коде 1С

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

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

Если ТипЗнч(ЗначениеПоля) = Тип("Строка") И ЗначениеПоля = "" Тогда

// Обработка пустой строки

ИначеЕсли ЗначениеПоля = Неопределено Тогда

// Обработка NULL

КонецЕсли;

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

☑️ Проверка данных в коде

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

Специфика работы с регистраторами и документами

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

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

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

⚠️ Внимание: Условия хранения данных, структура таблиц и поведение СУБД могут меняться с обновлением платформы 1С. Сверяйте критические условия фильтрации с официальной документацией к вашей версии платформы.

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

Можно ли использовать оператор IS NULL как в SQL?

В языке запросов 1С синтаксис отличается от чистого SQL. Оператор IS NULL не используется. Вместо него применяется конструкция Поле ЕСТЬ NULL или функция ЕСТЬNULL. Попытка использовать SQL-синтаксис приведет к ошибке компиляции запроса.

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

Скорее всего, в базе данных в этом поле записан NULL, а вы проверяете условие Поле = "". Визуально в интерфейсе 1С и NULL, и пустая строка часто отображаются одинаково (как пустое место), но внутри это разные данные. Используйте ЕСТЬNULL(Поле, "") = "".

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

Для этого нужно инвертировать логику. Надежный вариант: ЕСТЬNULL(Поле, "") != "". Это условие вернет ИСТИНА только для тех записей, где в поле есть какой-либо текст. Записи с NULL и "" будут отброшены.

Влияет ли проверка на пустоту на скорость отчета?

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