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