Разработка запросов в системе 1С:Предприятие требует от специалиста глубокого понимания того, как обрабатываются данные на стороне сервера баз данных. Одной из самых частых задач является фильтрация записей, где определенные реквизиты имеют значения или, напротив, пусты. Начинающие разработчики часто путают нулевые значения, пустые строки и неопределенные ссылки, что приводит к ошибкам в отчетах и некорректной работе документов.
В языке запросов 1С существуют специальные табличные функции, предназначенные именно для этих целей. Они позволяют выполнять проверку непосредственно в теле запроса, что значительно повышает производительность по сравнению с обработкой результатов в цикле на клиенте или сервере. Понимание различий между этими функциями критически важно для написания оптимального кода.
Базовые функции проверки значений
Основным инструментом для анализа данных в условии ГДЕ или в списке выборки являются три встроенные функции. Каждая из них решает свою уникальную задачу и возвращает булевское значение. Самой распространенной ошибкой является попытка использовать обычное сравнение с NULL для всех случаев, что не всегда работает корректно со ссылочными типами данных.
Функция ЕСТЬNULL() проверяет, является ли значение системным NULL. Это значение означает, что в поле базы данных ничего не записано. Однако для типов СправочникСсылка или ДокументСсылка ситуация сложнее: пустая ссылка не всегда равна NULL в контексте бизнес-логики, хотя технически может храниться так же.
Для работы со ссылками и составными типами используется функция ЗНАЧЕНИЕЗАПОЛНЕНО(). Она возвращает Истина, только если значение не является NULL и не является пустой ссылкой на объект. Это наиболее надежный способ убедиться, что в поле действительно выбран какой-то объект метаданных.
⚠️ Внимание. Использование функции
ЗНАЧЕНИЕЗАПОЛНЕНО()для полей, содержащих числа или даты, может дать неожиданный результат, если поле содержит 0 или дату 01.01.1900. В таких случаях лучше использовать специфические проверки илиЕСТЬNULL().
Используйте функцию ЗНАЧЕНИЕЗАПОЛНЕНО() для проверки ссылочных типов, а ЕСТЬNULL() — для числовых и строковых полей, где пустота равносильна отсутствию значения.
Использование функции ЕСТЬNULL в условиях
Функция ЕСТЬNULL() является аналогом стандартного SQL-оператора IS NULL. Она возвращает Истина, если переданное выражение равно NULL. Это фундаментальный инструмент для поиска записей, где данные не были внесены. Синтаксис функции предельно прост и интуитивно понятен любому, кто знаком с реляционными базами данных.
Часто возникает необходимость выбрать документы, у которых не заполнено какое-либо дополнительное поле, например, комментарий или основание. В этом случае условие ЕСТЬNULL(Документ.Комментарий) = ИСТИНА отфильтрует все записи, где текст присутствует.
Производительность запросов с использованием ЕСТЬNULL обычно высока, так как современные СУБД умеют эффективно использовать индексы для поиска пустых значений. Однако стоит избегать использования этой функции в вычисляемых полях списка выборки, если в этом нет прямой необходимости, чтобы не нагружать процессор сервера.
Проверка ссылочных типов через ЗНАЧЕНИЕЗАПОЛНЕНО
Когда речь заходит о полях типа СправочникСсылка, простая проверка на NULL становится недостаточной. В 1С существует понятие "пустая ссылка", которая технически может быть записана в базу как NULL или как ссылка на несуществующий объект с нулевым идентификатором. Функция ЗНАЧЕНИЕЗАПОЛНЕНО() создана специально для обработки таких нюансов платформы.
Эта функция возвращает Истина только тогда, когда в поле записана валидная ссылка на существующий объект конфигурации. Если в поле Контрагент ничего не выбрано, функция вернет Ложь. Это позволяет писать универсальные запросы, которые корректно работают независимо от внутренней реализации хранения пустых ссылок в конкретной версии СУБД.
Рассмотрим пример, где необходимо найти все заказы покупателей, в которых не указан менеджер. Использование ЗНАЧЕНИЕЗАПОЛНЕНО(Заказ.Менеджер) = ЛОЖЬ гарантирует, что мы получим только те документы, где ответственное лицо реально не назначено, исключая любые технические артефакты хранения данных.
ВЫБРАТЬ
Заказ.Ссылка КАК Ссылка,
Заказ.Дата КАК Дата
ИЗ
Документ.ЗаказПокупателя КАК Заказ
ГДЕ
ЗНАЧЕНИЕЗАПОЛНЕНО(Заказ.Менеджер) = ЛОЖЬ
⚠️ Внимание. В составных типах данных, где поле может содержать и ссылку, и строку, функция
ЗНАЧЕНИЕЗАПОЛНЕНО()вернет Истина для непустой строки, но Ложь для пустой ссылки. Учитывайте тип данных при проектировании структуры запроса.
Работа с неопределенными значениями ИСНЕОПРЕДЕЛЕНО
Функция ИСНЕОПРЕДЕЛЕНО() занимает промежуточное положение между двумя предыдущими. Она возвращает Истина, если значение является NULL или пустой ссылкой. Это делает её крайне полезной в ситуациях, когда нужно отсечь любые "пустые" состояния, не вдаваясь в детали типа данных.
Часто эту функцию используют в условиях соединения таблиц (ЛЕВОЕ СОЕДИНЕНИЕ), чтобы найти записи в главной таблице, для которых нет соответствующих записей в подчиненной. Если соединение не нашло совпадений, поля из правой таблицы будут неопределенными, и данная функция сработает как идеальный фильтр.
Логика работы функции проста: она объединяет проверки на NULL и на пустую ссылку в одно действие. Это сокращает объем кода и делает запросы более читаемыми. Однако, если вам нужно различать NULL и пустую ссылку (что бывает редко, но возможно в специфических задачах миграции данных), лучше использовать раздельные проверки.
Отличия ИСНЕОПРЕДЕЛЕНО и ЕСТЬNULL
Функция ИСНЕОПРЕДЕЛЕНО возвращает Истина для NULL и для ПустойСсылки. Функция ЕСТЬNULL возвращает Истина только для NULL. Для полей типа Число или Дата эти функции ведут себя одинаково, так как понятие пустой ссылки к ним неприменимо.
Условное вычисление с помощью ВЫБОР
Конструкция ВЫБОР в языке запросов 1С аналогична оператору CASE в SQL. Она позволяет выполнять проверку на заполненность прямо в списке полей и возвращать разные значения в зависимости от результата. Это мощный инструмент для формирования понятных отчетов без дополнительной обработки в коде.
С помощью ВЫБОР можно подставлять текстовые комментарии, например, "Не заполнено" или "Заполнено", вместо технических значений NULL или ссылок. Это упрощает восприятие данных пользователем и избавляет от необходимости писать обработчики событий в форме отчета.
Пример использования показывает, как можно гибко управлять выводом. Если поле пустое, мы выводим прочерк, если заполнено — само значение. Такой подход делает отчеты более презентабельными и готовыми к печати сразу после выполнения запроса.
ВЫБРАТЬ
Номенклатура.Наименование,
ВЫБОР
КОГДА ЗНАЧЕНИЕЗАПОЛНЕНО(Номенклатура.Артикул)
ТОГДА Номенклатура.Артикул
ИНАЧЕ "Нет артикула"
КОНЕЦ КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
Конструкция ВЫБОР позволяет трансформировать данные на лету, подменяя пустые значения на понятный текст прямо в запросе, что ускоряет формирование отчета.
Сравнительная таблица функций проверки
Для быстрого ориентирования в методах проверки удобно использовать сводную таблицу. Она демонстрирует поведение функций для различных типов данных и состояний. Запоминание этих различий поможет избегать логических ошибок при написании сложных запросов с множеством условий.
| Функция | Значение NULL | Пустая ссылка | Число 0 | Пустая строка |
|---|---|---|---|---|
ЕСТЬNULL() |
Истина | Истина (обычно) | Ложь | Ложь |
ЗНАЧЕНИЕЗАПОЛНЕНО() |
Ложь | Ложь | Истина | Истина |
ИСНЕОПРЕДЕЛЕНО() |
Истина | Истина | Ложь | Ложь |
ЕСТЬNULL() = ЛОЖЬ |
Ложь | Ложь | Истина | Истина |
Как видно из таблицы, функция ЗНАЧЕНИЕЗАПОЛНЕНО() является наиболее строгой для ссылочных типов, считая нули и пустые строки валидными данными. В то же время ИСНЕОПРЕДЕЛЕНО() наиболее чувствительна к отсутствию данных в ссылках. Выбор конкретной функции зависит от бизнес-требований к отчету или обработке.
☑️ Проверка корректности запроса
Частые ошибки и оптимизация производительности
Одной из самых распространенных ошибок является использование конструкций вида Поле = NULL. В стандарте SQL и в 1С такое сравнение всегда возвращает Неопределено (или Ложь в условиях фильтрации), а не Истина. Для проверки на null обязательно нужно использовать функцию ЕСТЬNULL().
Также стоит упомянуть о влиянии проверок на заполненность на использование индексов. Если условие сформулировано корректно, СУБД сможет использовать индекс для быстрого поиска записей. Однако сложные вычисляемые поля в условии ГДЕ могут привести к полному сканированию таблицы, что критично замедлит работу при больших объемах данных.
Функции проверки заполненности не предотвращают использование индексов, если они применяются непосредственно к полю таблицы без дополнительных преобразований. Старайтесь не оборачивать поля в другие функции внутри условия отбора, если это возможно.
⚠️ Внимание. Интерфейс и поведение конструктора запросов могут меняться в новых версиях платформы 1С. Всегда проверяйте синтаксис сгенерированного кода, особенно при переходе на новые релизы.
Почему Поле = NULL не работает?
В реляционной алгебре NULL означает "неизвестное значение". Сравнение "неизвестное равно неизвестному" не может быть истинным или ложным, оно само является неопределенным. Поэтому стандарт SQL требует использования специального предиката IS NULL.
FAQ: Вопросы и ответы
В чем разница между ЕСТЬNULL и ИСНЕОПРЕДЕЛЕНО?
Функция ЕСТЬNULL() проверяет только на системное значение NULL. Функция ИСНЕОПРЕДЕЛЕНО() проверяет и на NULL, и на пустую ссылку. Для полей типа Число, Дата, Строка они работают одинаково. Разница проявляется только на ссылочных типах данных.
Как проверить, что поле НЕ заполнено?
Для этого нужно приравнять результат функции к ЛОЖЬ. Например: ЗНАЧЕНИЕЗАПОЛНЕНО(Поле) = ЛОЖЬ или ЕСТЬNULL(Поле) = ИСТИНА. Обе конструкции допустимы, выбор зависит от типа данных.
Можно ли использовать эти функции в СКД?
Да, в Системе Компоновки Данных (СКД) эти функции работают точно так же, как и в обычных запросах. Их можно прописывать в настройках отбора или в выражениях полей на вкладке "Наборы данных".
Что вернет ЗНАЧЕНИЕЗАПОЛНЕНО для числа 0?
Функция вернет Истина. Ноль считается валидным числовым значением. Если нужно отфильтровать нули, используйте условие Поле = 0 или Поле <> 0 в зависимости от задачи.
Замедляет ли использование функций запрос?
Само по себе использование функций ЕСТЬNULL или ЗНАЧЕНИЕЗАПОЛНЕНО в условии ГДЕ не замедляет запрос, если оно применяется к индексируемому полю. Замедление может возникнуть при использовании сложных вычислений над полями в условиях отбора.