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

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

Запрос 1С: ВЫРАЗИТЬ КАК БУЛЕВО — синтаксис и практика

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

Оператор ВЫРАЗИТЬ в языке запросов 1С приводит значение поля к указанному типу, и приведение к типу Булево — один из самых частых приёмов при работе с составными полями, параметрами виртуальных таблиц и условиями соединений. Типичная ситуация: поле хранится как строка или число, а для отбора или дальнейшей логики нужен именно булев тип.

Важно понимать ограничение: ВЫРАЗИТЬ КАК БУЛЕВО в чистом виде поддерживается не во всех контекстах и не для всех исходных типов. Надёжная практика — приводить к булеву через конструкцию ВЫБОР с явным сравнением, а ВЫРАЗИТЬ использовать для сужения составного типа до Булево, когда поле уже потенциально булево. Ниже разобраны оба подхода, границы применимости и способы проверить результат.

Материал ориентирован на разработчиков и консультантов, которые пишут запросы в консоли запросов, в модулях или в СКД. Все примеры синтаксически корректны для встроенного языка запросов платформы 1С:Предприятие.

Как работает ВЫРАЗИТЬ КАК БУЛЕВО

Оператор ВЫРАЗИТЬ меняет тип значения на уровне запроса. Основное назначение — сузить составной тип поля (например, строку произвольной длины до строки фиксированной длины или составную ссылку до конкретного справочника) и отсечь значения, не соответствующие целевому типу: они превращаются в NULL.

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Данные.Значение КАК Булево) КАК Признак

ИЗ

РегистрСведений.ЗначенияСвойств КАК Данные

Такой запрос корректен, когда «Значение» — поле составного типа, частью которого является Булево. Во всех остальных случаях нужен ВЫБОР.

Преобразование числа и строки в булево через ВЫБОР

Когда исходное значение — число (0/1), строка («Да»/«Нет») или NULL, приведение делают через условную конструкцию ВЫБОР. Это универсальный и предсказуемый способ, работающий на любой поддерживаемой СУБД.

ВЫБРАТЬ

ВЫБОР

КОГДА Товары.НеОтслеживатьОстаток = 1

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК НеОтслеживать,

ВЫБОР

КОГДА Товары.Статус = "Активен"

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК Активен

ИЗ

Справочник.Товары КАК Товары

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

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

bsl
ВЫБОР
	КОГДА ЕСТЬNULL(Поле, 0) <> 0
		ТОГДА ИСТИНА
	ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК Признак

Приведение булева в параметрах и условиях отбора

Обратная задача встречается чаще: параметр запроса булев типа, а поле в базе — число или строка. Сравнивать напрямую «Поле = &Параметр» нельзя — типы не совпадут, и условие либо не сработает, либо запрос упадёт с ошибкой несовместимости типов.

Правильный приём — привести поле к булеву прямо в условии через ВЫБОР, либо привести параметр к типу поля. Первый вариант нагляднее:

ВЫБРАТЬ

Заказы.Ссылка

ИЗ

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

ГДЕ

ВЫБОР

КОГДА Заказы.КодСинхронизации = 1

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ = &ПризнакСинхронизации

Для виртуальных таблиц регистров параметры типа Булево передаются напрямую, без преобразований: например, в условии отбора по булеву реквизиту достаточно написать «Реквизит = &Значение», где параметр имеет тип Булево. Проблемы возникают только при смешении типов.

Булево в СКД и динамических списках

В схеме компоновки данных поле, вычисленное через ВЫБОР с ИСТИНА/ЛОЖЬ, автоматически получает тип Булево, и в настройках отчёта для него доступны стандартные сравнения «Равно», «В списке» и т.д. Это удобно для флагов вроде «Просрочен», «Требует внимания».

Если нужно, чтобы в отчёте флаг отображался как «Да/Нет», а не как «Истина/Ложь», используйте форматную строку в настройках поля СКД (на закладке «Наборы данных» — поле «Формат»): БЛ=Нет; БИ=Да. Это чище, чем превращать поле в строку в запросе, потому что сохраняет возможность фильтрации по булеву типу.

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

Типичные ошибки и как их избежать

Самая частая ошибка — ожидание, что ВЫРАЗИТЬ(ЧисловоеПоле КАК Булево) превратит 1 в ИСТИНА. Такого преобразования нет: результатом будет NULL для значений, не являющихся булевыми. Второе место занимает сравнение булева поля со строкой или числом в условии — запрос либо падает, либо молча возвращает пустой результат.

Третья группа ошибок связана с NULL: левое соединение даёт NULL в булевом поле, и условие «ГДЕ Поле = ИСТИНА» отсекает такие строки, что не всегда ожидается. Если NULL должен трактоваться как ЛОЖЬ, оберните поле в ЕСТЬNULL(Поле, ЛОЖЬ).

Типичные ошибки
01
ВЫРАЗИТЬ(Число КАК Булево) вместо ВЫБОР — получаете NULL вместо ИСТИНА/ЛОЖЬ
02
Сравнение булева поля со строкой "Истина" — условие никогда не выполняется
03
Игнорирование NULL после левого соединения — строки теряются из отбора
04
Передача в параметр булева типа числа 1 из кода — ошибка несовместимости типов при выполнении

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

Проверять приведение удобнее всего в консоли запросов: выполните запрос на небольшой выборке и посмотрите тип колонки результата. Если вместо флажков видите пустые ячейки — значит, значения не привелись и стали NULL.

Полезный приём — временно вывести рядом исходное и преобразованное поле и добавить ТипЗначения через ВЫБОР с перечислением вариантов. Так сразу видно, какие значения теряются при приведении и почему.

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

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

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

Отображаются флажки Истина/Ложь

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

Пустые ячейки или строки вместо флажков

Количество строк до и после отбора
Норма

Совпадает с ожидаемым по данным

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

Строки с NULL исчезли незаметно

Значения NULL в результате
Норма

NULL присутствуют только там, где это задумано

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

NULL появились вместо ЛОЖЬ из-за ВЫРАЗИТЬ по небулеву типу

Когда какой способ выбрать

Маршрут решения

Как выбрать действие

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

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

Итог

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

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

Частые вопросы

Можно ли написать ВЫРАЗИТЬ(1 КАК Булево) и получить ИСТИНА?

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

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

Лучше сменить тип параметра на Булево в коде (Истина/Ложь). Если это невозможно, приведите поле к числу через ВЫБОР КОГДА Поле ТОГДА 1 ИНАЧЕ 0 КОНЕЦ и сравнивайте с числовым параметром.

Почему после ВЫРАЗИТЬ КАК Булево в колонке пусто?

Пустая ячейка означает NULL: исходные значения не были булевого типа, и приведение отбросило их. Проверьте фактический тип поля в метаданных и перейдите на конструкцию ВЫБОР.

Как обработать NULL в булевом поле после левого соединения?

Оберните поле в ЕСТЬNULL(Поле, ЛОЖЬ) — тогда отсутствующие записи дадут ЛОЖЬ вместо NULL, и условия отбора будут работать предсказуемо.

Работает ли ВЫРАЗИТЬ КАК Булево в СКД и динамических списках?

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

Можно ли вывести булево как «Да/Нет» прямо в запросе?

Можно через ВЫБОР КОГДА Поле ТОГДА "Да" ИНАЧЕ "Нет" КОНЕЦ, но поле станет строковым и потеряет булевы отборы. В СКД лучше оставить тип Булево и задать форматную строку БЛ=Нет; БИ=Да.