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

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

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

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

В языке запросов 1С нет литерала ИСТИНА/ЛОЖЬ, поэтому прямое написание ВЫБРАТЬ ИСТИНА вызовет ошибку. Булево значение в запросе получают через конструкцию ВЫБОР КОГДА ... ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ — именно так платформа возвращает поле типа «Булево», которое затем можно использовать в отчётах, СКД и программной обработке результата.

Задача возникает в нескольких типовых сценариях: нужно вывести признак в отчёт (например, «Просрочено» — да/нет), передать булево поле в СКД для отбора, сформировать временную таблицу с флагом или привести результат сравнения к строгому типу, чтобы избежать неоднозначности составного типа. Каждый сценарий решается немного по-разному.

Ниже разобраны рабочие способы: вычисляемое булево через ВЫБОР, булево из сравнения и условий, обработка NULL, приведение типов через ВЫРАЗИТЬ, а также типичные ошибки, из-за которых запрос либо не выполняется, либо возвращает не тот тип данных.

Почему в запросе нельзя написать ИСТИНА напрямую

Язык запросов 1С поддерживает литералы чисел, строк, дат и значения перечислений, но не имеет литералов ИСТИНА и ЛОЖЬ в списке выбираемых полей. Попытка написать ВЫБРАТЬ ИСТИНА КАК Флаг приводит к синтаксической ошибке ещё на этапе проверки запроса в консоли или конфигураторе.

При этом сами слова ИСТИНА и ЛОЖЬ в языке запросов существуют — но только как результат выражения внутри конструкции ВЫБОР. Это и есть штатный способ «выразить как булево»: обернуть условие в ВЫБОР и вернуть ИСТИНА или ЛОЖЬ в ветках ТОГДА и ИНАЧЕ.

Основной способ: конструкция ВЫБОР КОГДА

Универсальный шаблон выглядит так:

ВЫБРАТЬ

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

ВЫБОР

КОГДА Товары.Цена > 1000

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ДорогойТовар

ИЗ

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

Поле ДорогойТовар в результате запроса будет иметь тип «Булево». Его можно проверять в коде: Если Выборка.ДорогойТовар Тогда ..., использовать в отборах СКД и выводить в табличный документ — значение отобразится как «Да»/«Нет» в зависимости от настроек формата.

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

ВЫБОР

КОГДА Заказ.Сумма > 100000 ТОГДА ИСТИНА

КОГДА Заказ.Клиент.ВипКлиент ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ТребуетСогласования

Когда условие уже булево

Если в базе есть реквизит типа «Булево» (например, Клиент.ВипКлиент), выбирать его можно напрямую — конструкция ВЫБОР не нужна. Оборачивать существующее булево поле в ВЫБОР только ради «приведения типа» — лишняя операция: тип уже строгий.

Булево из сравнений, NULL и проверок принадлежности

Частый источник ошибок — сравнение с NULL. Если поле может быть не заполнено (NULL в результате левого соединения), сравнение КОГДА Таблица.Поле > 0 для NULL-строк вернёт не ЛОЖЬ, а неопределённость, которая в ветвлении трактуется как «условие не выполнено» — формально в ИНАЧЕ попадут и NULL-строки. Это часто устраивает, но если нужно явно отличать NULL, добавьте отдельную ветку:

ВЫБОР

КОГДА Остатки.Количество ЕСТЬ NULL ТОГДА ЛОЖЬ

КОГДА Остатки.Количество > 0 ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ЕстьНаСкладе

Для проверки вхождения в список используйте оператор В внутри условия КОГДА:

ВЫБОР

КОГДА Номенклатура.Вид В (&ВидыУслуг) ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ЭтоУслуга

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

Роль ВЫРАЗИТЬ и приведение типов

Функция ВЫРАЗИТЬ в языке запросов приводит значение к указанному типу, но для булева она не применяется: синтаксис ВЫРАЗИТЬ(Поле КАК БУЛЕВО) платформа не поддерживает. ВЫРАЗИТЬ работает с числами, строками, датами и ссылочными типами.

Поэтому фраза «выразить как булево» на практике означает именно формирование булева через ВЫБОР. Если исходное поле хранит признак в виде числа (0/1) или строки («Да»/«Нет»), преобразование делается так:

ВЫБОР

КОГДА Таблица.ФлагЧислом = 1 ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК Флаг

Обратное преобразование — булево в число для суммирования — тоже делается через ВЫБОР: ВЫБОР КОГДА Условие ТОГДА 1 ИНАЧЕ 0 КОНЕЦ. Такой приём позволяет, например, посчитать количество документов с признаком через СУММА.

Булево поле в СКД и отборах

В схеме компоновки данных булево поле удобно для отборов: пользователь видит флажок или выбор «Да/Нет». Чтобы отбор работал корректно, поле в наборе данных должно иметь строгий тип «Булево» — то есть снова формироваться через ВЫБОР. Если поле составного типа (например, Булево + NULL из-за соединения), отбор может вести себя непредсказуемо.

При выводе в отчёт булево по умолчанию отображается как «Да»/«Нет». Если нужен другой текст («Просрочено»/«В срок»), либо настройте формат поля в СКД, либо сразу верните строки в ветках ТОГДА/ИНАЧЕ — но тогда поле перестанет быть булевым, и отбор по нему станет строковым.

Сравнение вариантов

ВЫБОР КОГДА ... ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ

Строгий тип Булево, подходит для отборов и программной проверки. Основной способ.

Строки в ветках ТОГДА/ИНАЧЕ

Удобно для отображения пользователю, но теряется тип Булево и логика отборов.

Числа 1/0

Подходит для агрегации через СУММА и обмена с внешними системами, но требует преобразования при проверке в коде.

Типичные ошибки и их последствия

Первая ошибка — попытка написать ВЫБРАТЬ ИСТИНА или передать булево через параметр и сравнить его неявно. Запрос просто не выполнится. Вторая — забыть ветку ИНАЧЕ: если ни одно условие не сработало и ИНАЧЕ отсутствует, поле получит значение NULL, а не ЛОЖЬ, и тип станет составным.

Третья группа ошибок связана с NULL в условиях: сравнения с NULL всегда дают «не ИСТИНА», поэтому строки с незаполненными полями молча попадают в ветку ИНАЧЕ. Если бизнес-логика требует отличать «нет данных» от «ложь», явно обрабатывайте ЕСТЬ NULL отдельной веткой.

Типичные ошибки
01
ВЫБРАТЬ ИСТИНА в списке полей — синтаксическая ошибка, литерала булева нет
02
Пропуск ИНАЧЕ — поле получает NULL и составной тип вместо строгого Булево
03
Игнорирование NULL в условии — строки с незаполненными полями молча уходят в ЛОЖЬ
04
Попытка ВЫРАЗИТЬ(... КАК БУЛЕВО) — такая конструкция не поддерживается
05
Оборачивание уже булева реквизита в ВЫБОР — лишняя операция без эффекта

Проверка результата

После написания запроса проверьте тип поля в консоли запросов: в таблице результата колонка должна показывать значения «Да»/«Нет» (или Истина/Ложь), а не пустые ячейки. Пустые ячейки — признак NULL, значит, где-то потеряна ветка ИНАЧЕ или условие вернуло неопределённость.

Программно тип проверяется через выборку: ТипЗнч(Выборка.Флаг) = Тип("Булево"). Если вместо булева пришёл NULL, сравнение Если Выборка.Флаг Тогда вызовет ошибку преобразования — это надёжный сигнал, что запрос нужно исправить.

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

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

Тип колонки в консоли запросов
Норма

Булево, значения Да/Нет

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

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

Проверка в коде Если Выборка.Флаг Тогда
Норма

Условие выполняется без ошибок

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

Ошибка преобразования значения к типу Булево

Отбор по полю в СКД
Норма

Отбор «равно Истина» фильтрует строки

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

Отбор не срабатывает или пропадают строки

FAQ

Можно ли передать булево значение параметром запроса?

Да. Параметр типа «Булево» передаётся штатно: Запрос.УстановитьПараметр("Флаг", Истина), а в тексте запроса его можно использовать в условиях и сравнениях, например ГДЕ Документ.Проведен = &Флаг. Ограничение касается только списка выбираемых полей — там параметр выводить можно, но тип результата будет зависеть от контекста.

Почему поле со значением ИСТИНА в отчёте отображается пустым?

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

Как посчитать количество строк, где признак истинен?

Преобразуйте булево в число: СУММА(ВЫБОР КОГДА Условие ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК Количество. Агрегатная функция СУММА по числовому выражению даст точное количество строк, удовлетворяющих условию.

Работает ли конструкция ВЫБОР с ИСТИНА в виртуальных таблицах?

Да, конструкция ВЫБОР доступна везде, где допустимы вычисляемые выражения: в полях выборки из виртуальных таблиц регистров, в условиях соединений и в секции ИМЕЮЩИЕ. Ограничений именно для булева результата нет.

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

Это одно логическое значение, но в разных синтаксисах. В запросе ИСТИНА может появиться только внутри ВЫБОР, во встроенном языке Истина — полноценный литерал типа Булево. При передаче результата запроса в код значение корректно превращается в Истина/Ложь встроенного языка.

Итог

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

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