К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С запрос: условие ГДЕ и значение ИСТИНА

Разбираем условие ГДЕ в запросах 1С: синтаксис ИСТИНА, ЛОЖЬ, операторы сравнения, И/ИЛИ, проверка NULL и типичные ошибки при фильтрации данных.

Условие ГДЕ (WHERE) в языке запросов 1С — основной инструмент фильтрации данных: оно определяет, какие строки попадут в результат выборки. Ключевые слова ИСТИНА и ЛОЖЬ в языке запросов обозначают булевы значения и используются как в самих условиях, так и при сравнении реквизитов типа «Булево» с конкретным значением.

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

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

Синтаксис условия ГДЕ в языке запросов 1С

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

ВЫБРАТЬ

Номенклатура.Ссылка,

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

ИЗ

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

ГДЕ

Номенклатура.ЭтоГруппа = ЛОЖЬ

Здесь условие ЭтоГруппа = ЛОЖЬ отбирает только элементы, исключая папки. Обратите внимание: значения ИСТИНА и ЛОЖЬ в языке запросов пишутся без кавычек — это литералы булева типа, а не строки.

Условие ГДЕ ИСТИНА без сравнения — допустимая конструкция: она всегда истинна и не фильтрует ничего. Такой приём используют при программной сборке текста запроса, когда список условий формируется динамически: начальное «ИСТИНА» позволяет дописывать остальные условия через «И», не проверяя, первое это условие или нет.

bsl
ТекстЗапроса = "ГДЕ ИСТИНА";
Если ОтборПоОрганизации Тогда
    ТекстЗапроса = ТекстЗапроса + " И Регистратор.Организация = &Организация";
КонецЕсли;

Сравнение булевых реквизитов с ИСТИНА и ЛОЖЬ

Реквизиты типа «Булево» в запросе сравниваются напрямую с литералами ИСТИНА или ЛОЖЬ. Типичный пример — отбор непомеченных на удаление объектов:

ГДЕ

Документ.ПометкаУдаления = ЛОЖЬ

И Документ.Проведен = ИСТИНА

Допустима и короткая форма: ГДЕ Документ.Проведен — если реквизит булев, само его значение является условием. Аналогично ГДЕ НЕ Документ.ПометкаУдаления отберёт непомеченные объекты. Обе формы дают одинаковый результат, выбор — вопрос стиля и читаемости.

Важный нюанс: если булев реквизит может содержать NULL (например, при левом соединении или в составном типе), сравнение = ЛОЖЬ не отберёт строки с NULL. Сравнение с NULL всегда даёт неопределённый результат, и такая строка в выборку не попадёт.

Логические операторы И, ИЛИ, НЕ и приоритет условий

Несколько условий объединяются операторами И и ИЛИ, отрицание задаётся через НЕ. Приоритет стандартный: сначала НЕ, затем И, затем ИЛИ. Из-за этого смешанные выражения без скобок — частый источник ошибок:

ГДЕ

(Товары.Склад = &Склад1 ИЛИ Товары.Склад = &Склад2)

И Товары.Количество > 0

Без скобок условие ИЛИ «прилипнет» не туда: А ИЛИ Б И В интерпретируется как А ИЛИ (Б И В), а не как (А ИЛИ Б) И В. Правило простое: при смешивании И и ИЛИ всегда расставляйте скобки явно, даже если вам кажется, что приоритет очевиден.

Для проверки вхождения в список вместо цепочки ИЛИ используйте оператор В: ГДЕ Склад В (&СписокСкладов). Это короче, читаемее и обычно эффективнее. Обратный вариант — В ИЕРАРХИИ для отбора по группе справочника с учётом вложенности.

Проверка NULL и пустых значений в условиях

NULL в запросах 1С — это отсутствие значения, возникающее при левых соединениях и необязательных реквизитах. Проверка выполняется только специальным оператором:

ГДЕ

Остатки.Количество ЕСТЬ NULL

Сравнение = NULL не работает: результат такого выражения неопределён, и строка не попадёт в выборку. Это одна из самых распространённых ошибок начинающих разработчиков, переносящих привычки из встроенного языка.

Для ссылочных реквизитов «пустота» проверяется сравнением с пустой ссылкой через параметр: ГДЕ Реквизит = &ПустаяСсылка, где параметр заполняется как Справочники.Контрагенты.ПустаяСсылка(). Либо используется функция ЗНАЧЕНИЕ: ГДЕ Реквизит = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).

Контрольные точки

Как проверить результат

Количество строк в выборке
Норма

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

Тревожный признак

Строк заметно меньше — вероятно, отсекаются NULL

Условие по булеву полю после соединения
Норма

Используется ЕСТЬNULL(Поле, ЛОЖЬ)

Тревожный признак

Прямое сравнение = ЛОЖЬ теряет строки с NULL

Смешанные И/ИЛИ
Норма

Скобки расставлены явно

Тревожный признак

Приоритет операторов меняет логику фильтра

Условия с параметрами и динамическая фильтрация

Параметры запроса объявляются через символ & и подставляются до выполнения. Условие с параметром выглядит так: ГДЕ Дата >= &НачалоПериода И Дата <= &КонецПериода. Параметры — единственный безопасный способ передачи значений: конкатенация строк с данными пользователя в текст запроса открывает путь к ошибкам и потенциально к инъекциям.

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

ГДЕ

(&ВсеСклады ИЛИ Товары.Склад = &Склад)

Если параметр &ВсеСклады равен ИСТИНА, условие по складу фактически отключается. Такой приём удобен в универсальных отчётах, где пользователь сам решает, фильтровать ли по конкретному измерению.

Маршрут решения

Как выбрать действие

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

Условия в СКД и виртуальных таблицах

В системе компоновки данных условия чаще задаются через настройки отбора, а не в тексте запроса. Отбор вида «Реквизит = Истина» добавляется в коллекцию отборов компоновщика и применяется поверх основного запроса. Это предпочтительнее для отчётов: пользователь может менять фильтры без правки кода.

Отдельный случай — параметры виртуальных таблиц регистров. Фильтрацию по измерениям лучше задавать в параметрах виртуальной таблицы (в фигурных скобках или через список параметров), а не в секции ГДЕ: тогда платформа отберёт данные на уровне СУБД до соединения, что существенно быстрее на больших объёмах.

ИЗ

РегистрНакопления.Продажи.Обороты(

&НачалоПериода, &КонецПериода, ,

Номенклатура = &Номенклатура) КАК Продажи

Типичные ошибки и как их избежать

Первая группа ошибок связана с NULL: сравнение = NULL вместо ЕСТЬ NULL и потеря строк при сравнении булевых полей после левого соединения. Обе проблемы решаются функцией ЕСТЬNULL и явной проверкой на NULL.

Вторая группа — логические: отсутствие скобок при смешивании И/ИЛИ, двойное отрицание НЕ ... = ЛОЖЬ, которое запутывает читающего, и сравнение строки с булевым литералом. Третья группа — производительность: условия над функциями от индексированных полей (например, ПОДСТРОКА(Наименование, 1, 3) = &Префикс) отключают использование индекса и замедляют запрос.

Типичные ошибки
01
ГДЕ Поле = NULL — условие никогда не сработает, нужно ЕСТЬ NULL
02
Смешивание И и ИЛИ без скобок — логика фильтра искажается
03
Сравнение булева поля после ЛЕВОГО СОЕДИНЕНИЯ без ЕСТЬNULL — теряются строки
04
Конкатенация значений в текст запроса вместо параметров — риск ошибок и инъекций
05
Фильтр по измерению регистра в ГДЕ вместо параметров виртуальной таблицы — лишняя нагрузка
Итог

Что важно запомнить

ГДЕ ИСТИНА — приём для динамической сборки условий; булевы реквизиты сравниваются с ИСТИНА/ЛОЖЬ напрямую; NULL проверяется только через ЕСТЬ NULL; скобки обязательны при смешивании И и ИЛИ; фильтры виртуальных таблиц переносятся в их параметры.

Частые вопросы

Что означает запись «ГДЕ ИСТИНА» в запросе 1С?

Это условие, которое всегда истинно, то есть не отсекает ни одной строки. На практике его используют как заглушку при программной сборке запроса: к нему удобно дописывать дополнительные условия через «И», не отслеживая, есть ли уже первое условие.

Чем отличается «ГДЕ Проведен» от «ГДЕ Проведен = ИСТИНА»?

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

Почему условие «= ЛОЖЬ» не отбирает часть записей?

Скорее всего, в отфильтрованных строках поле содержит NULL — например, из-за левого соединения с таблицей, где нет соответствия. Сравнение NULL с любым значением даёт неопределённый результат, и строка не попадает в выборку. Решение: ГДЕ ЕСТЬNULL(Поле, ЛОЖЬ) = ЛОЖЬ.

Как выбрать документы, у которых реквизит не заполнен?

Для ссылочного реквизита сравните его с пустой ссылкой: ГДЕ Реквизит = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Если реквизит может быть NULL, добавьте условие ИЛИ Реквизит ЕСТЬ NULL, объединив обе проверки скобками.

Можно ли использовать ИСТИНА в отборе СКД?

Да. В настройках отбора компоновки данных для поля булева типа выбирается вид сравнения «Равно» и значение «Истина». Программно значение задаётся как булево Истина встроенного языка, а не строка — иначе отбор не сработает из-за несовпадения типов.

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

Частые причины: функция применена к индексированному полю в условии (индекс перестаёт использоваться), фильтр по измерению регистра задан в ГДЕ вместо параметров виртуальной таблицы, либо условие через ИЛИ объединяет поля разных таблиц. Проверьте план запроса в консоли и перенесите фильтрацию ближе к источнику данных.