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