Ошибка 1С: Преобразование значения к типу Булево не может быть выполнено
- Аварийная остановка программы в условных операторах
Если <Выражение> Тогдаили тернарных операторах?(<Выражение>, ...). - Текст ошибки:
{Модуль(Строка)}: Преобразование значения к типу Булево не может быть выполнено. - Сбой при подстановке в условие переменных типа
Строка,Число,Неопределеноили ссылок БД без явного сравнения.
1. Причина строгой типизации булевых выражений в 1С
В отличие от JavaScript, PHP или Python, во встроенном языке 1С:Предприятие нет автоматического неявного приведения произвольных типов к булеву. Значения 0, 1, пустая строка "" или Неопределено НЕ конвертируются автоматически в Истина или Ложь.
Внутри условия Если ... Тогда должно находиться выражение, строго возвращающее тип Булево.
2. Анализ частых ошибок и их исправление
Ошибка 1: Использование числовых флагов (C/JS стиль)
// НЕПРАВИЛЬНО (Флаг = 1 или 0):
Если Флаг Тогда // Ошибка: Преобразование к Булево не может быть выполнено!
// ИСПРАВЛЕНИЕ:
Если Флаг = 1 Тогда
// ИЛИ явное приведение:
Если Булево(Флаг) Тогда // Булево(1) -> Истина, Булево(0) -> ЛожьОшибка 2: Проверка заполненности ссылки без функции ЗначениеЗаполнено()
// НЕПРАВИЛЬНО (Контрагент содержит СправочникСсылка или Неопределено):
Если Контрагент Тогда // Ошибка!
// ИСПРАВЛЕНИЕ:
Если ЗначениеЗаполнено(Контрагент) Тогда
// Выполняется, если ссылка не пустая и не Неопределено
КонецЕсли;Ошибка 3: Логические операции над небулевыми типами
// НЕПРАВИЛЬНО:
Если Реквизит1 И Реквизит2 Тогда // Если хотя бы один не Булево — сбой!
// ИСПРАВЛЕНИЕ:
Если ЗначениеЗаполнено(Реквизит1) И ЗначениеЗаполнено(Реквизит2) Тогда
// Логика
КонецЕсли;Ошибка 4: Неверная работа функции Булево() для строк
Функция Булево("Строка") вызовет исключение! Функция платформы Булево() преобразует только числа (0 -> Ложь, не 0 -> Истина) и сам тип Булево. Для строк используйте явное сравнение:
ЗначениеБулево = (ВРег(СокрЛП(СтроковоеЗначение)) = "ИСТИНА" ИЛИ СокрЛП(СтроковоеЗначение) = "1"); Частые вопросы (FAQ)
Что возвращает Булево(Неопределено) и Булево(Null)?
Оба вызова завершатся ошибкой 'Преобразование значения к типу Булево не может быть выполнено'. Функцию Булево() можно применять только к числам и булевым значениям.
Как безопасно проверить реквизит формы, который может быть не инициализирован?
Используйте конструкцию: 'Если Объект.Свойство = Истина Тогда'. Прямое сравнение с литералом Истина безопасно вернет Ложь, даже если реквизит содержит Неопределено или Null.
Почему тернарный оператор '?(Флаг, А, Б)' падает с этой ошибкой?
Первый операнд тернарного оператора '?(...)' обязан строго иметь тип Булево. Если туда передано число или ссылка, возникнет ошибка приведения типа.
Как проверить результат SQL-запроса на истинность поля?
В запросе используйте конструкцию ВЫБОР КОГДА Поле ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ, либо в коде сравнивайте: 'Если Выборка.БулевоПоле = Истина Тогда'.