Разработка и Конфигурация · 9 мин
Как в 1С выразить значение как булево
Как в 1С выразить значение как булево: функция Булево(), приведение типов в запросах и СКД, типичные ошибки и проверка результата с примерами кода.
Во встроенном языке 1С нет неявного преобразования строки или числа в булево «на лету», как в некоторых других языках. Попытка написать Если "Истина" Тогда приведёт к ошибке или к неожиданному поведению. Поэтому разработчику нужно явно выражать значение как булево — через функцию Булево(), конструкции запроса или логические сравнения.
Задача возникает в типовых сценариях: данные пришли из файла или веб-сервиса в виде строк «Да»/«Нет», «true»/«false», «1»/«0»; реквизит хранится как число, а в условии нужна Истина; в запросе или СКД требуется поле булева типа для отбора. В каждом случае есть свой корректный способ преобразования.
Ниже разобраны основные приёмы: функция Булево() в коде, оператор ВЫРАЗИТЬ и конструкция ВЫБОР в запросах, обработка строковых представлений и настройка типа в СКД. Отдельно рассмотрены ошибки, которые чаще всего приводят к неверным результатам.
Функция Булево() во встроенном языке
Основной инструмент — функция Булево(Значение). Она принимает число или строку и возвращает значение типа Булево. Для чисел правило простое: 0 преобразуется в Ложь, любое другое число — в Истину.
Для строк функция распознаёт ограниченный набор представлений, регистр не важен: «Истина», «True», «Ложь», «False», а также числовые строки «0» и «1» (через промежуточное преобразование). Строки «Да», «Нет», «Y», «N» функция не понимает — их нужно обрабатывать вручную через сравнение.
Флаг = Булево(1); // Истина
Флаг = Булево(0); // Ложь
Флаг = Булево("Истина"); // Истина
Флаг = Булево("false"); // Ложь
Флаг = Булево("Да"); // Ошибка преобразования!
Если передать значение неподдерживаемого типа (например, ссылку или дату), возникнет ошибка «Преобразование значения к типу Булево не может быть выполнено». Поэтому перед вызовом полезно проверять тип через ТипЗнч().
Функция СтрокаВБулево(Стр)
Стр = НРег(СокрЛП(Стр));
Если Стр = "да" Или Стр = "true" Или Стр = "истина" Или Стр = "1" Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункцииПреобразование строк «Да/Нет», «true/false», «1/0»
Самый частый практический случай — загрузка из Excel, CSV или JSON, где логическое поле записано текстом. Универсальный подход — нормализовать строку (обрезать пробелы, привести к нижнему регистру) и сравнить со списком «истинных» представлений.
Обратите внимание на пустые строки и значения Неопределено. Пустая строка через сравнение корректно даст Ложь, а вот Неопределено и NULL из запроса нужно обрабатывать отдельно — иначе логика отбора «только включённые» молча потеряет записи.
Если данные приходят из JSON через ПрочитатьJSON, учтите: стандартный JSON-литерал true уже читается как булево, а вот строка «true» останется строкой. Проверяйте фактический тип после чтения, а не предполагайте его по виду данных.
Выражение булева значения в запросе
В языке запросов нет функции Булево(). Булево значение получают двумя способами: литералами ИСТИНА/ЛОЖЬ внутри конструкции ВЫБОР или результатом логического сравнения.
ВЫБРАТЬ
ВЫБОР
КОГДА Товары.Количество > 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЕстьОстаток,
Товары.Код = "0001" КАК ЭтоНужныйТовар
ИЗ
Справочник.Товары КАК Товары
Оператор ВЫРАЗИТЬ(... КАК Булево) в запросах не поддерживается — приведение типов работает только для чисел, строк и дат. Попытка написать ВЫРАЗИТЬ(Поле КАК Булево) вызовет ошибку схемы запроса. Используйте ВЫБОР.
Для сравнения с параметром булева типа передавайте параметр именно как Булево: Запрос.УстановитьПараметр("Флаг", Истина). Если передать строку «Истина», сравнение булева реквизита со строкой даст Ложь без какой-либо ошибки — это коварный источник «пустых» отчётов.
Булево в СКД и динамических списках
В схеме компоновки данных вычисляемое поле булева типа создаётся выражением ВЫБОР КОГДА ... ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ на закладке «Вычисляемые поля». Тип платформа выведет автоматически, но для надёжности можно явно указать тип Булево в настройках поля.
Для отборов в динамических списках и отчётах булево поле сравнивайте напрямую: ГДЕ Товары.НеИспользовать = ЛОЖЬ. Не оборачивайте булево поле в дополнительное сравнение вида = ИСТИНА без необходимости — это усложняет запрос, хотя и не является ошибкой.
Если в пользовательских настройках отбора флажок «съезжает» или отбор не срабатывает, проверьте, что тип поля в наборе данных действительно Булево, а не Число(1,0). Числовой флаг 0/1 в отборе «равно Истина» работать не будет.
Проверка и обработка значений перед преобразованием
Безопасная схема преобразования произвольного значения в булево выглядит так: сначала определить тип, затем применить подходящий способ. Это защищает код от ошибок времени выполнения при загрузке «грязных» данных.
- 1Определите тип значения через ТипЗнч() и обработайте Неопределено и NULL отдельно
- 2Если это число — примените Булево(Число): 0 даст Ложь, остальное Истину
- 3Если это строка — нормализуйте (СокрЛП, НРег) и сравните со списком допустимых представлений
- 4Если это уже Булево — верните как есть
- 5Проверьте результат на тестовом наборе: распечатайте пары «исходное значение → результат»
Как проверить результат
ТипЗнч(Результат) = Тип("Булево")
Результат остался строкой или числом
0, «Ложь», пустая строка дают Ложь; 1, «Истина» дают Истину
Пустая строка вызывает ошибку или даёт Истину
Отбор по полю возвращает ожидаемое число строк
Отбор «= Истина» возвращает пустой результат при заполненных данных
Обратное преобразование и форматирование
Иногда нужна обратная операция — представить булево строкой или числом для выгрузки. Функция Формат(Значение, "БЛ=Ложь; БИ=Истина") позволяет задать собственные представления, например «Нет»/«Да». Для числа используйте тернарную логику через ?(Флаг, 1, 0).
При выгрузке в XML и JSON булево сериализуется как true/false автоматически, если тип значения действительно Булево. Если в выгрузке вдруг появляются строки «Истина»/«Ложь» кириллицей — значит, где-то в цепочке значение было преобразовано в строку, и это место стоит найти.
Как выбрать способ
Часто задаваемые вопросы
Почему Булево("Да") вызывает ошибку?
Функция Булево() распознаёт только встроенные представления: «Истина»/«Ложь», «True»/«False» и числовые строки. Слово «Да» в этот список не входит. Преобразуйте его сравнением: Результат = (НРег(СокрЛП(Строка)) = "да").
Можно ли использовать ВЫРАЗИТЬ как Булево в запросе?
Нет, оператор ВЫРАЗИТЬ в языке запросов поддерживает только приведение чисел, строк и дат, а также уточнение ссылочных типов. Для получения булева значения применяйте конструкцию ВЫБОР КОГДА условие ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ.
Чему равно Булево(Неопределено)?
Такое преобразование вызовет ошибку — Неопределено не приводится к Булево. Проверяйте значение заранее: Если Значение = Неопределено Тогда Результат = Ложь; .... В запросах аналогичная роль у ЕСТЬNULL.
Как в условии использовать числовой флаг 0/1?
Встроенный язык не преобразует число в условии автоматически — Если 1 Тогда даст ошибку. Напишите явно: Если Флаг <> 0 Тогда или предварительно Флаг = Булево(ЧисловоеЗначение).
Почему отбор по булеву полю в динамическом списке не работает?
Чаще всего причина в несовпадении типов: параметр передан строкой «Истина» вместо булева Истина, либо поле в запросе на самом деле числовое. Проверьте тип поля в схеме запроса и тип передаваемого параметра через ТипЗнч().
Как выгрузить булево в JSON как true/false?
Убедитесь, что значение имеет тип Булево, и используйте ЗаписатьJSON — платформа сериализует Истину как true автоматически. Если в JSON попадает строка «Истина», значит ранее в коде значение было преобразовано в строку.
Что важно запомнить
В коде используйте Булево() для чисел и распознаваемых строк, строки «Да/Нет» обрабатывайте сравнением. В запросах булево создаётся через ВЫБОР, а не ВЫРАЗИТЬ. Всегда учитывайте NULL и Неопределено и проверяйте тип параметров в отборах.