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

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

Булевы значения ИСТИНА и ЛОЖЬ в запросах 1С: как задать, сравнить и применить

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

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

Типичная ситуация: разработчик пишет запрос и задаётся вопросом, как в поле выборки «поставить ИСТИНУ» — то есть добавить колонку с постоянным логическим значением или вычислить его по условию. Синтаксис простой: ВЫБРАТЬ ИСТИНА КАК Признак — но есть нюансы с типизацией, сравнением с параметрами и поведением в СКД, о которых стоит знать заранее.

Ниже разобраны все практические сценарии: литералы в списке выборки, условия ГДЕ, параметры типа «Булево», конструкция ВЫБОР КОГДА, работа в консоли запросов и типичные ошибки, из-за которых запрос возвращает не то, что ожидалось.

Литералы ИСТИНА и ЛОЖЬ в списке полей запроса

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

ВЫБРАТЬ

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

ИСТИНА КАК ВключатьВОтчет

ИЗ

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

Колонка «ВключатьВОтчет» будет иметь тип «Булево» и значение Истина во всех строках. Такой приём используют при объединении запросов, когда в одной части признак вычисляется, а в другой должен быть константой, либо при подготовке данных для последующей обработки в коде.

Аналогично работает ЛОЖЬ: ВЫБРАТЬ ЛОЖЬ КАК Отмечен. Регистр написания не важен — платформа одинаково воспринимает ИСТИНА, Истина и истина, но по стандартам разработки принято писать литералы запроса в верхнем регистре.

bsl
ВЫБРАТЬ
	Товары.Ссылка КАК Товар,
	ИСТИНА КАК ЕстьНаСкладе
ИЗ
	Справочник.Номенклатура КАК Товары
ГДЕ
	НЕ Товары.ПометкаУдаления

Фильтрация по булеву реквизиту в условии ГДЕ

Булевы реквизиты встречаются повсеместно: ПометкаУдаления у ссылочных объектов, Проведен у документов, пользовательские признаки вроде «Активен» или «НеИспользовать». Отфильтровать по ним можно двумя равнозначными способами:

ГДЕ Номенклатура.ПометкаУдаления = ИСТИНА

// или короче:

ГДЕ Номенклатура.ПометкаУдаления

Краткая форма ГДЕ Реквизит эквивалентна проверке на ИСТИНУ и считается более читаемой. Для отрицания используют ГДЕ НЕ Номенклатура.ПометкаУдаления вместо ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ — результат тот же, но запись компактнее.

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

Вычисляемый булев признак через ВЫБОР КОГДА

Когда признак зависит от условия, применяется конструкция ВЫБОР КОГДА, где ветки ТОГДА и ИНАЧЕ возвращают ИСТИНА или ЛОЖЬ:

ВЫБРАТЬ

Заказы.Ссылка КАК Заказ,

ВЫБОР

КОГДА Заказы.СуммаДокумента > 100000

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК КрупныйЗаказ

ИЗ

Документ.ЗаказКлиента КАК Заказы

Обе ветки должны возвращать один тип — «Булево». Если в одной ветке написать ИСТИНА, а в другой число или строку, колонка получит составной тип, что усложнит дальнейшую обработку и может сломать вывод в СКД или динамический список.

Если ветка ИНАЧЕ опущена, при невыполнении условия поле примет значение NULL, а не ЛОЖЬ. Это частая причина ошибок: разработчик ожидает булево, а получает NULL. Всегда явно указывайте ИНАЧЕ ЛОЖЬ для булевых признаков.

Как добавить булев признак в запрос
  1. 1
    Определите условие, по которому признак должен быть Истиной
  2. 2
    Напишите ВЫБОР КОГДА условие ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ с псевдонимом КАК
  3. 3
    Проверьте запрос в консоли: убедитесь, что в колонке только Истина/Ложь, без NULL
  4. 4
    Если поле участвует в соединениях, оберните его в ЕСТЬNULL(Поле, ЛОЖЬ)
  5. 5
    Используйте признак в ГДЕ или в коде через строгую проверку Значение = Истина

Параметры типа «Булево» и сравнение с ними

Если значение приходит из кода, его передают параметром, а не подстановкой литерала:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Контрагенты.Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Архивный = &Архивный";

Запрос.УстановитьПараметр("Архивный", Ложь);

Параметр типа «Булево» корректно сравнивается с булевым реквизитом. Не передавайте вместо булева строки «Истина»/«Ложь» или числа 1/0 — платформа не выполнит неявное приведение в запросе, и условие либо не сработает, либо вызовет ошибку несовместимости типов.

Иногда требуется обратная задача — сравнить результат запроса с булевым в коде. Значения ИСТИНА/ЛОЖЬ из запроса приходят в выборку как обычные булевы значения встроенного языка, поэтому проверка Если Выборка.Признак = Истина Тогда работает без преобразований.

ИСТИНА и ЛОЖЬ в СКД, динамических списках и виртуальных таблицах

В схеме компоновки данных булевы литералы в тексте запроса работают так же, но есть особенности при использовании в отборах. Если поле вычисляемое (через ВЫБОР КОГДА), отбор по нему в настройках СКД будет работать только если поле явно добавлено в список полей набора данных и доступно для отбора.

В динамических списках с произвольным запросом булевы колонки отображаются как флажки. Учтите: если признак вычисляется сложным условием, список может замедлиться, потому что условие вычисляется для каждой выводимой строки. Для тяжёлых условий лучше хранить признак в реквизите и обновлять его регламентно.

В параметрах виртуальных таблиц регистров булевы значения также передаются через параметры запроса. Например, отбор по измерению типа «Булево» в регистре сведений задаётся стандартно: ГДЕ Регистр.Активна = &Активна с установкой параметра в Истина или Ложь.

Типичные ошибки с булевыми значениями в запросах
01
Пропуск ветки ИНАЧЕ в ВЫБОР КОГДА — вместо ЛОЖЬ получается NULL, и последующие сравнения не срабатывают
02
Передача строки "Истина" или числа 1 в параметр вместо булева значения — условие ГДЕ не выполняется
03
Сравнение с NULL через = ИСТИНА после левого соединения — строки с NULL теряются, нужен ЕСТЬNULL
04
Разные типы в ветках ТОГДА и ИНАЧЕ — колонка получает составной тип и ломает вывод в СКД
05
Объединение запросов, где в одной части поле булево, а в другой число — ошибка несовместимости типов при ОБЪЕДИНИТЬ

Проверка результата и отладка в консоли запросов

Прежде чем встраивать запрос в код, проверьте его в консоли запросов (в режиме предприятия или через инструменты разработчика). Обратите внимание на три вещи: тип колонки в результате, отсутствие пустых значений там, где ожидается Ложь, и корректность фильтрации при разных значениях параметра.

Быстрый способ убедиться, что литерал работает: выполните минимальный запрос ВЫБРАТЬ ИСТИНА КАК П — он должен вернуть одну строку со значением Истина. Если консоль показывает иное, проверьте, не перекрыт ли текст макетом или построителем запроса.

При отладке условий с параметрами выводите сам параметр рядом с полем: ВЫБРАТЬ &Архивный КАК Парам, Контрагенты.Архивный КАК Реквизит. Так сразу видно, совпадают ли типы и значения, и где именно ломается сравнение.

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

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

Тип колонки в результате запроса
Норма

Булево, значения только Истина и Ложь

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

Составной тип или пустые значения (NULL)

Фильтр ГДЕ Реквизит = &Параметр
Норма

При Истина и Ложь возвращаются разные наборы строк

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

Результат одинаковый или пустой при любом параметре

Поле из левого соединения
Норма

Обернуто в ЕСТЬNULL(Поле, ЛОЖЬ), пустых значений нет

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

В колонке встречается NULL

Ветки ВЫБОР КОГДА
Норма

ТОГДА и ИНАЧЕ возвращают ИСТИНА/ЛОЖЬ

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

Одна ветка возвращает другой тип или ИНАЧЕ отсутствует

FAQ

Как в запросе 1С вывести ИСТИНУ во всех строках?

Укажите литерал с псевдонимом в списке полей: ВЫБРАТЬ ИСТИНА КАК Признак. Колонка будет иметь тип «Булево» и значение Истина в каждой строке результата.

Чем ГДЕ Реквизит отличается от ГДЕ Реквизит = ИСТИНА?

Ничем по результату: обе формы отбирают строки, где булев реквизит равен Истине. Краткая форма ГДЕ Реквизит считается более читаемой, а для отрицания используют ГДЕ НЕ Реквизит.

Почему вместо ЛОЖЬ в поле приходит пустое значение?

Чаще всего причина в левом соединении (строкам без пары присваивается NULL) или в отсутствии ветки ИНАЧЕ в конструкции ВЫБОР КОГДА. Обработайте поле функцией ЕСТЬNULL(Поле, ЛОЖЬ) и всегда явно пишите ИНАЧЕ ЛОЖЬ.

Можно ли передать ИСТИНУ в запрос через параметр?

Да. Создайте параметр в тексте запроса (&Параметр) и установите его в коде: Запрос.УстановитьПараметр("Параметр", Истина). Передавайте именно булево значение, а не строку или число.

Работает ли ИСТИНА в запросах к табличным частям и регистрам?

Да, литералы ИСТИНА и ЛОЖЬ доступны в любых запросах: к справочникам, документам, их табличным частям, регистрам сведений, накопления и виртуальным таблицам. Синтаксис одинаковый.

Как сравнить булево поле запроса со значением в коде 1С?

Значение из выборки приходит как обычное булево встроенного языка, поэтому достаточно проверки: Если Выборка.Признак = Истина Тогда. Никаких преобразований типов не требуется.

Итог

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

ИСТИНА и ЛОЖЬ — литералы типа «Булево» языка запросов. Их пишут прямо в списке полей (ВЫБРАТЬ ИСТИНА КАК Признак), в условиях ГДЕ и в ветках ВЫБОР КОГДА. Главные риски — NULL вместо ЛОЖЬ после соединений и пропущенная ветка ИНАЧЕ; обе проблемы решаются через ЕСТЬNULL и явное ИНАЧЕ ЛОЖЬ.