Разработка и Конфигурация · 10 мин
1С запрос: условие ГДЕ и значение ИСТИНА
Разбираем условие ГДЕ в запросах 1С: синтаксис ИСТИНА, ЛОЖЬ, операторы сравнения, И/ИЛИ, проверка NULL и типичные ошибки при фильтрации данных.
Условие ГДЕ (WHERE) в языке запросов 1С — основной инструмент фильтрации данных: оно определяет, какие строки попадут в результат выборки. Ключевые слова ИСТИНА и ЛОЖЬ в языке запросов обозначают булевы значения и используются как в самих условиях, так и при сравнении реквизитов типа «Булево» с конкретным значением.
Типовая задача выглядит так: нужно выбрать только активные элементы справочника, непомеченные на удаление документы или записи с заполненным реквизитом. Все эти сценарии решаются через секцию ГДЕ с правильно построенным логическим выражением. Ошибка в условии приводит либо к пустой выборке, либо к лишним данным, которые потом искажают отчёты и обработки.
Ниже разобран синтаксис условий, работа с булевыми значениями, логические операторы, проверка NULL и типичные ошибки, которые допускают даже опытные разработчики.
Синтаксис условия ГДЕ в языке запросов 1С
Секция ГДЕ ставится после указания источника данных и содержит логическое выражение. Если выражение для строки истинно — строка попадает в результат. Простейший пример — фильтрация справочника по реквизиту:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
Здесь условие ЭтоГруппа = ЛОЖЬ отбирает только элементы, исключая папки. Обратите внимание: значения ИСТИНА и ЛОЖЬ в языке запросов пишутся без кавычек — это литералы булева типа, а не строки.
Условие ГДЕ ИСТИНА без сравнения — допустимая конструкция: она всегда истинна и не фильтрует ничего. Такой приём используют при программной сборке текста запроса, когда список условий формируется динамически: начальное «ИСТИНА» позволяет дописывать остальные условия через «И», не проверяя, первое это условие или нет.
ТекстЗапроса = "ГДЕ ИСТИНА";
Если ОтборПоОрганизации Тогда
ТекстЗапроса = ТекстЗапроса + " И Регистратор.Организация = &Организация";
КонецЕсли;Сравнение булевых реквизитов с ИСТИНА и ЛОЖЬ
Реквизиты типа «Булево» в запросе сравниваются напрямую с литералами ИСТИНА или ЛОЖЬ. Типичный пример — отбор непомеченных на удаление объектов:
ГДЕ
Документ.ПометкаУдаления = ЛОЖЬ
И Документ.Проведен = ИСТИНА
Допустима и короткая форма: ГДЕ Документ.Проведен — если реквизит булев, само его значение является условием. Аналогично ГДЕ НЕ Документ.ПометкаУдаления отберёт непомеченные объекты. Обе формы дают одинаковый результат, выбор — вопрос стиля и читаемости.
Важный нюанс: если булев реквизит может содержать NULL (например, при левом соединении или в составном типе), сравнение = ЛОЖЬ не отберёт строки с NULL. Сравнение с NULL всегда даёт неопределённый результат, и такая строка в выборку не попадёт.
Логические операторы И, ИЛИ, НЕ и приоритет условий
Несколько условий объединяются операторами И и ИЛИ, отрицание задаётся через НЕ. Приоритет стандартный: сначала НЕ, затем И, затем ИЛИ. Из-за этого смешанные выражения без скобок — частый источник ошибок:
ГДЕ
(Товары.Склад = &Склад1 ИЛИ Товары.Склад = &Склад2)
И Товары.Количество > 0
Без скобок условие ИЛИ «прилипнет» не туда: А ИЛИ Б И В интерпретируется как А ИЛИ (Б И В), а не как (А ИЛИ Б) И В. Правило простое: при смешивании И и ИЛИ всегда расставляйте скобки явно, даже если вам кажется, что приоритет очевиден.
Для проверки вхождения в список вместо цепочки ИЛИ используйте оператор В: ГДЕ Склад В (&СписокСкладов). Это короче, читаемее и обычно эффективнее. Обратный вариант — В ИЕРАРХИИ для отбора по группе справочника с учётом вложенности.
Проверка NULL и пустых значений в условиях
NULL в запросах 1С — это отсутствие значения, возникающее при левых соединениях и необязательных реквизитах. Проверка выполняется только специальным оператором:
ГДЕ
Остатки.Количество ЕСТЬ NULL
Сравнение = NULL не работает: результат такого выражения неопределён, и строка не попадёт в выборку. Это одна из самых распространённых ошибок начинающих разработчиков, переносящих привычки из встроенного языка.
Для ссылочных реквизитов «пустота» проверяется сравнением с пустой ссылкой через параметр: ГДЕ Реквизит = &ПустаяСсылка, где параметр заполняется как Справочники.Контрагенты.ПустаяСсылка(). Либо используется функция ЗНАЧЕНИЕ: ГДЕ Реквизит = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).
Как проверить результат
Совпадает с ожидаемым по данным в пользовательском режиме
Строк заметно меньше — вероятно, отсекаются NULL
Используется ЕСТЬNULL(Поле, ЛОЖЬ)
Прямое сравнение = ЛОЖЬ теряет строки с NULL
Скобки расставлены явно
Приоритет операторов меняет логику фильтра
Условия с параметрами и динамическая фильтрация
Параметры запроса объявляются через символ & и подставляются до выполнения. Условие с параметром выглядит так: ГДЕ Дата >= &НачалоПериода И Дата <= &КонецПериода. Параметры — единственный безопасный способ передачи значений: конкатенация строк с данными пользователя в текст запроса открывает путь к ошибкам и потенциально к инъекциям.
Когда условие нужно включать или отключать в зависимости от настроек, применяют два подхода. Первый — программная сборка текста запроса с добавлением фрагментов ГДЕ. Второй — условие-переключатель прямо в тексте:
ГДЕ
(&ВсеСклады ИЛИ Товары.Склад = &Склад)
Если параметр &ВсеСклады равен ИСТИНА, условие по складу фактически отключается. Такой приём удобен в универсальных отчётах, где пользователь сам решает, фильтровать ли по конкретному измерению.
Как выбрать действие
Условия в СКД и виртуальных таблицах
В системе компоновки данных условия чаще задаются через настройки отбора, а не в тексте запроса. Отбор вида «Реквизит = Истина» добавляется в коллекцию отборов компоновщика и применяется поверх основного запроса. Это предпочтительнее для отчётов: пользователь может менять фильтры без правки кода.
Отдельный случай — параметры виртуальных таблиц регистров. Фильтрацию по измерениям лучше задавать в параметрах виртуальной таблицы (в фигурных скобках или через список параметров), а не в секции ГДЕ: тогда платформа отберёт данные на уровне СУБД до соединения, что существенно быстрее на больших объёмах.
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода, &КонецПериода, ,
Номенклатура = &Номенклатура) КАК Продажи
Типичные ошибки и как их избежать
Первая группа ошибок связана с NULL: сравнение = NULL вместо ЕСТЬ NULL и потеря строк при сравнении булевых полей после левого соединения. Обе проблемы решаются функцией ЕСТЬNULL и явной проверкой на NULL.
Вторая группа — логические: отсутствие скобок при смешивании И/ИЛИ, двойное отрицание НЕ ... = ЛОЖЬ, которое запутывает читающего, и сравнение строки с булевым литералом. Третья группа — производительность: условия над функциями от индексированных полей (например, ПОДСТРОКА(Наименование, 1, 3) = &Префикс) отключают использование индекса и замедляют запрос.
Что важно запомнить
ГДЕ ИСТИНА — приём для динамической сборки условий; булевы реквизиты сравниваются с ИСТИНА/ЛОЖЬ напрямую; NULL проверяется только через ЕСТЬ NULL; скобки обязательны при смешивании И и ИЛИ; фильтры виртуальных таблиц переносятся в их параметры.
Частые вопросы
Что означает запись «ГДЕ ИСТИНА» в запросе 1С?
Это условие, которое всегда истинно, то есть не отсекает ни одной строки. На практике его используют как заглушку при программной сборке запроса: к нему удобно дописывать дополнительные условия через «И», не отслеживая, есть ли уже первое условие.
Чем отличается «ГДЕ Проведен» от «ГДЕ Проведен = ИСТИНА»?
Для булева поля без NULL обе записи эквивалентны — само значение поля уже является логическим выражением. Разница проявляется, если поле может быть NULL: краткая форма и явное сравнение одинаково отсекут NULL-строки, но для читаемости в сложных запросах предпочтительнее явное сравнение или ЕСТЬNULL.
Почему условие «= ЛОЖЬ» не отбирает часть записей?
Скорее всего, в отфильтрованных строках поле содержит NULL — например, из-за левого соединения с таблицей, где нет соответствия. Сравнение NULL с любым значением даёт неопределённый результат, и строка не попадает в выборку. Решение: ГДЕ ЕСТЬNULL(Поле, ЛОЖЬ) = ЛОЖЬ.
Как выбрать документы, у которых реквизит не заполнен?
Для ссылочного реквизита сравните его с пустой ссылкой: ГДЕ Реквизит = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Если реквизит может быть NULL, добавьте условие ИЛИ Реквизит ЕСТЬ NULL, объединив обе проверки скобками.
Можно ли использовать ИСТИНА в отборе СКД?
Да. В настройках отбора компоновки данных для поля булева типа выбирается вид сравнения «Равно» и значение «Истина». Программно значение задаётся как булево Истина встроенного языка, а не строка — иначе отбор не сработает из-за несовпадения типов.
Почему запрос с условием работает медленно, хотя данных немного?
Частые причины: функция применена к индексированному полю в условии (индекс перестаёт использоваться), фильтр по измерению регистра задан в ГДЕ вместо параметров виртуальной таблицы, либо условие через ИЛИ объединяет поля разных таблиц. Проверьте план запроса в консоли и перенесите фильтрацию ближе к источнику данных.