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