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