При разработке конфигураций в системе 1С:Предприятие одной из самых частых задач является выборка данных по критериям наличия или отсутствия информации в полях. Разработчики постоянно сталкиваются с необходимостью отфильтровать записи, где реквизиты уже введены, или, наоборот, найти документы, ожидающие заполнения. Неправильная трактовка условий в языке запросов часто приводит к потере данных или возникновению ошибок при исполнении кода.
В языке запросов платформы существуют специфические конструкции для работы с неопределенными значениями. Важно понимать фундаментальную разницу между логической константой ИСТИНА, значением ЛОЖЬ и специальным маркером ПУСТО. Именно эти понятия лежат в основе корректной фильтрации. Если вы привыкли к SQL, то здесь есть свои нюансы, которые необходимо учитывать для написания эффективного и безопасного кода.
Далее мы подробно разберем синтаксис операторов, рассмотрим типичные ошибки и предоставим готовые шаблоны решений для различных типов данных. Вы научитесь писать запросы, которые работают предсказуемо в любой версии платформы, будь то тонкий клиент или веб-сервер.
Фундаментальные различия ПУСТО и ЛОЖЬ
Первое правило, которое должен усвоить программист 1С: значение ПУСТО не равно ЛОЖЬ. В языке запросов это два принципиально разных состояния объекта. ПУСТО означает отсутствие значения как такового, своего рода "дыру" в данных, тогда как ЛОЖЬ — это конкретное логическое значение, которое было явно записано в поле. Смешение этих понятий — классическая ошибка новичков.
Когда вы проверяете поле типа Булево, оно может содержать одно из трех состояний: Истина, Ложь или Пусто. Если в базе данных в поле ничего не записано, система вернет именно ПУСТО. Если же пользователь установил галочку или снял её, в поле будут значения ИСТИНА или ЛОЖЬ соответственно. Для проверки на заполненность используется специальный оператор ЕСТЬ.
Рассмотрим пример. Допустим, у нас есть справочник контрагентов, где есть признак "Является резидентом". Нам нужно выбрать всех, у кого этот признак определен (не важно, плюс или минус), и отсечь тех, где вопрос еще не решен. В этом случае мы ищем все записи, где значение НЕ ПУСТО.
⚠️ Внимание: ОператорЕСТЬработает только с проверяемым значением. Попытка написатьГДЕ Поле = ПУСТОв некоторых контекстах может сработать, но использование конструкцииЕСТЬявляется стандартом де-факто и гарантирует корректную работу индексов базы данных.
Использование правильных конструкций критически влияет на производительность. Платформа 1С:Предприятие оптимизирует запросы с оператором ЕСТЬ лучше, чем сравнения через функции преобразования типов. Всегда отдавайте предпочтение нативным операторам языка запросов.
Синтаксис оператора ЕСТЬ в условиях WHERE
Основным инструментом для проверки заполнения является оператор ЕСТЬ. Он возвращает логическое значение Истина, если проверяемое выражение не является пустым, и Ложь в противном случае. Этот оператор универсален и применим к полям любых типов: числам, строкам, датам, ссылкам и булевым значениям.
Синтаксически конструкция выглядит предельно просто. В секции ГДЕ вы указываете имя поля и оператор. Если необходимо найти незаполненные поля, используется инверсия через ключевое слово НЕ. Это позволяет гибко формировать выборки для отчетов по незавершенным документам или справочникам с отсутствующими реквизитами.
ВЫБРАТЬ
Документ.Ссылка,
Документ.Контрагент
ИЗ
Документ.ЗаказКлиента КАК Документ
ГДЕ
ЕСТЬ Документ.Контрагент
В приведенном выше примере мы получим только те заказы, в которых указан контрагент. Все записи, где поле Контрагент не заполнено, будут исключены из результата. Это базовый паттерн, который используется в 90% случаев фильтрации по наличию данных.
Для обратной ситуации, когда нужно найти "пробелы" в учете, применяется отрицание. Например, поиск товаров без указания основного единицы измерения или сотрудников без табельного номера. Конструкция НЕ ЕСТЬ четко отделяет такие записи от остальных.
- 🔍 Оператор
ЕСТЬвозвращает Истина, если значение определено. - 🚫 Конструкция
НЕ ЕСТЬнаходит все пустые значения в колонке. - ⚡ Использование оператора предпочтительнее функций типа
ЕСТЬНЕдля производительности.
Для строк это означает не только пустую строку "", но и значение ПУСТО. Однако в языке запросов 1С пустая строка и системное ПУСТО для типа Строка часто трактуются по-разному в зависимости от настроек типа данных в метаданных.
Если поле имеет тип "Строка" и не является обязательным, пустая строка "" и значение ПУСТО — это разные вещи. Оператор ЕСТЬ вернет Истину для пустой строки, так как строка существует, просто она пустая. Для проверки на длину используйте функцию СТРОКА.
Работа со строковыми полями и длиной значения
При работе с текстовыми данными возникает нюанс, который часто упускают из виду. Поле типа Строка может содержать пустую строку (длина 0 символов) или быть неопределенным (ПУСТО). Оператор ЕСТЬ вернет Истина в обоих случаях, так как объект типа "Строка" существует. Для строгой проверки на наличие текста необходимо использовать функцию ДЛИНА.
Функция ДЛИНА возвращает количество символов в строке. Если поле пустое (системное ПУСТО), функция вернет 0. Если поле содержит пробелы, функция также вернет количество символов, включая пробелы. Поэтому для качественной проверки часто используют комбинацию условий или предварительную обработку строки функцией СОКРЛ (сокращение слева) или СОКРП.
ВЫБРАТЬ
Справочник.Номенклатура,
Справочник.Артикул
ИЗ
Справочник.Номенклатура КАК Справочник
ГДЕ
ДЛИНА(Справочник.Артикул) > 0
Такой запрос выберет только те элементы, где в поле "Артикул" действительно есть символы. Записи с пустой строкой или неопределенным значением будут отсеяны. Это критически важно при выгрузке данных во внешние системы, где пустые строки могут вызывать ошибки валидации.
Иногда требуется проверить, что строка не состоит только из пробелов. В этом случае применяется вложенная функция сокращения. Мы убираем пробелы по краям и проверяем длину остатка. Это надежный способ фильтрации "мусорных" данных, введенных пользователями по ошибке.
⚠️ Внимание: ФункцияДЛИНАне работает с типами данных, отличными от Строки. Попытка применить её к Числу или Дате вызовет ошибку выполнения запроса. Всегда приводите типы или используйте операторЕСТЬдля универсальной проверки.
Для сложных случаев, когда нужно игнорировать регистр или специальные символы, логика проверки выносится во временные таблицы. Однако для стандартных задач проверки заполнения достаточно комбинации ЕСТЬ и ДЛИНА.
Особенности проверки дат и числовых полей
С полями типа Дата и Число ситуация обстоит иначе, чем со строками. Здесь понятие "пустой строки" не существует. Поле либо содержит конкретное числовое значение или момент времени, либо оно равно ПУСТО. Поэтому оператор ЕСТЬ является единственным корректным способом проверки для этих типов данных.
Частая ошибка — попытка сравнить дату с нулем или пустой строкой. В 1С дата "0001-01-01" является допустимым значением (начало эры), а не признаком пустоты. Пустая дата — это именно системное значение ПУСТО, которое не имеет числового эквивалента. Сравнение Дата = 0 может дать непредсказуемый результат или ошибку типов.
Если вам нужно выбрать документы за определенный период, но только те, у которых заполнена дата проведения, вы комбинируете условия. Сначала проверяете диапазон дат, а затем добавляете условие на заполненность, если это необходимо по логике бизнеса. Часто это требуется для регламентных отчетов, где важно отсечь черновики.
| Тип поля | Оператор проверки | Пример условия | Описание |
|---|---|---|---|
| Булево | ЕСТЬ | ЕСТЬ Поле |
Проверяет, задано ли значение (Истина/Ложь) |
| Строка | ДЛИНА | ДЛИНА(Поле) > 0 |
Проверяет наличие символов (не пустая строка) |
| Дата | ЕСТЬ | ЕСТЬ Поле |
Проверяет, установлена ли дата |
| Число | ЕСТЬ | ЕСТЬ Поле |
Проверяет, введено ли число (включая 0) |
Обратите внимание на строку с типом "Число". Если в поле записан ноль, оператор ЕСТЬ вернет Истина, так как ноль — это валидное числовое значение. Если же поле очищено, оно станет ПУСТО, и оператор вернет Ложь. Это важное различие для финансовых отчетов, где ноль может быть значимым итогом.
Нюансы работы с типом Время
Поля типа Время ведут себя аналогично Датам. Пустое время — это ПУСТО. Однако при выгрузке в внешние БД (например, MS SQL) могут возникать проблемы, если не настроено преобразование типов. Рекомендуется явно проверять ЕСТЬ Время перед конвертацией.
Использование функции ЗНАЧЕНИЕЗАПОЛНЕНО
Помимо оператора ЕСТЬ, в языке запросов существует функция ЗНАЧЕНИЕЗАПОЛНЕНО. Она выполняет схожую задачу, но имеет свои особенности поведения и области применения. Функция возвращает Истина, если значение не является пустым, и Ложь в обратном случае.
Главное отличие функции от оператора заключается в том, что ЗНАЧЕНИЕЗАПОЛНЕНО может принимать выражения и результаты вычислений, а не только имена полей. Это делает её незаменимой в сложных условиях, где проверка зависит от результата математической операции или конкатенации строк.
ВЫБРАТЬ
Документ.Сумма,
Документ.СуммаНДС
ИЗ
Документ.Реализация КАК Документ
ГДЕ
ЗНАЧЕНИЕЗАПОЛНЕНО(Документ.СуммаНДС)
В данном примере мы выбираем документы, где рассчитан НДС. Если поле СуммаНДС не заполнено (например, документ без налога или не проведен расчет), запись не попадет в выборку. Функция удобна тем, что её логика интуитивно понятна разработчикам, переходящим с других языков программирования.
Тем не менее, в простых случаях проверки полей таблиц рекомендуется использовать оператор ЕСТЬ. Он читается лаконичнее и в некоторых версиях платформы обрабатывается оптимизатором запросов эффективнее. Функцию стоит оставлять для сложных составных условий.
- ✅ Функция
ЗНАЧЕНИЕЗАПОЛНЕНОуниверсальна для любых выражений. - 📉 Оператор
ЕСТЬчасто работает быстрее на больших объемах данных. - 🔄 Оба метода возвращают одинаковый логический результат для полей таблиц.
Выбор между оператором и функцией часто дело вкуса команды разработки. Главное — соблюдать консистентность: не смешивать стили в одном запросе без веской причины. Это упрощает поддержку кода в будущем.
Для полей таблиц используйте оператор ЕСТЬ. Для сложных выражений и вычисляемых полей используйте функцию ЗНАЧЕНИЕЗАПОЛНЕНО.
Типичные ошибки и способы их устранения
Даже опытные разработчики иногда допускают ошибки при фильтрации данных. Самая распространенная из них — попытка сравнить поле со строкой "ПУСТО" или числом 0 в надежде найти незаполненные ячейки. Это фундаментальное непонимание природы данных в 1С приводит к тому, что запрос возвращает пустой результат или, хуже того, неверные данные.
Другая частая проблема возникает при работе с объединениями запросов (ОБЪЕДИНИТЬ). Если в первом запросе поле заполнено, а во втором — нет, типы данных могут конфликтовать. В таких случаях необходимо явно приводить типы или использовать функцию ЕСТЬНЕ для подстановки значений по умолчанию, чтобы структура результатов совпадала.
Также стоит упомянуть ошибку при проверке булевых полей. Конструкция ГДЕ Поле = ИСТИНА отсечет все записи, где поле равно ЛОЖЬ или ПУСТО. Если ваша задача — найти все записи, где значение определено (и да, и нет), то такое условие ошибочно. Нужно использовать ЕСТЬ Поле.
⚠️ Внимание: Интерфейс и возможности конструктора запросов могут меняться в новых релизах платформы 1С. Всегда сверяйтесь с синтаксис-помощником вашей конкретной версии конфигурации, если стандартные конструкции ведут себя неожиданно.
Для отладки сложных условий рекомендуется выводить промежуточные поля в результат запроса. Добавьте в секцию ВЫБРАТЬ проверяемое поле и посмотрите на его фактическое значение в консоли запросов. Это сразу покажет, что там на самом деле: ПУСТО, ноль или пустая строка.
☑️ Диагностика проблемы с запросом
В чем разница между ЕСТЬ и ЗНАЧЕНИЕЗАПОЛНЕНО?
Оператор ЕСТЬ — это часть синтаксиса языка запросов, оптимизированная для проверки полей таблиц. Функция ЗНАЧЕНИЕЗАПОЛНЕНО — это встроенная функция, которая может проверять любые выражения. Результат одинаков, но контекст использования разный.
Как проверить, что строка не состоит только из пробелов?
Используйте комбинацию функций: ДЛИНА(СОКРЛ(СОКРП(Поле))) > 0. Это удалит пробелы слева и справа, а затем проверит, осталась ли в строке хоть какая-то длина.
Почему запрос с ПУСТО работает медленно?
Если условие написано некорректно (например, через функции преобразования типов вместо оператора ЕСТЬ), база данных может не использовать индексы. Это приводит к полному сканированию таблицы (table scan), что резко снижает скорость.
Можно ли использовать ЕСТЬ в секции ИМЕЮЩИЕ?
Да, оператор ЕСТЬ доступен во всех секциях запроса, включая ГДЕ, ИМЕЮЩИЕ и условия соединений ЛЕВОЕ СОЕДИНЕНИЕ.. ПО. Логика работы остается неизменной.
Что вернет запрос, если поле типа Число содержит 0?
Оператор ЕСТЬ Поле вернет Истина, так как 0 — это валидное числовое значение. Поле считается заполненным. Если нужно отсеять нули, добавьте дополнительное условие И Поле <> 0.