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