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

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

Ошибка «преобразование значения к типу Булево не может быть выполнено» в 1С: причины и исправление

Разбираем ошибку «преобразование значения к типу Булево не может быть выполнено» в 1С: причины, типичные места в коде, способы исправления и профилактика.

Ошибка «Преобразование значения к типу Булево не может быть выполнено» возникает, когда платформа 1С пытается неявно или явно привести значение к логическому типу, но значение этому преобразованию не подлежит. Чаще всего это происходит в операторах Если ... Тогда, в условиях циклов Пока, в параметрах условного оформления и при вычислении выражений, где ожидается Истина или Ложь, а приходит строка, число, Неопределено или NULL.

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

Материал ниже разбирает типичные сценарии появления ошибки, показывает безопасные способы проверки и приведения значений, а также помогает отличить ситуацию, которую можно исправить правкой кода, от ситуации, где требуется чистка данных или доработка запроса.

Что означает эта ошибка и где она возникает

Встроенный язык 1С строго относится к типам в логических выражениях: условие оператора Если должно вычисляться именно в Булево. Если в условие подставить, например, строку «Истина» или число 1, платформа не станет «догадываться» о намерении разработчика, как это делают некоторые другие языки, а выдаст ошибку преобразования.

Типичные места возникновения: условия Если и Пока, тернарная логика в выражениях, вычисляемые поля СКД, условное оформление форм, параметры запросов с условиями, обработчики ожидания и регламентные задания. В управляемых формах ошибка часто всплывает при обращении к реквизитам объекта, который ещё не инициализирован.

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

Типичные причины: от Неопределено до NULL в запросе

Самая частая причина — переменная содержит Неопределено. Такое случается, когда функция не вернула значение во всех ветках, когда реквизит объекта не найден, когда из структуры читают несуществующий ключ через Структура.Свойство() без проверки результата. Условие вида Если Результат Тогда, где Результат = Неопределено, гарантированно падает.

Вторая по частоте причина — NULL из запроса. Левое соединение таблиц, обращение к реквизиту через точку от пустой ссылки («разыменование»), агрегатные функции по пустой выборке — всё это возвращает NULL. Если такое поле напрямую использовать в условии, получаем ошибку преобразования.

Третья группа причин — строки и числа вместо Булево. Например, значение настройки хранится в строковом виде «Да»/«Нет», а код пишется как Если Настройка Тогда. Или из внешнего источника (файла, веб-сервиса, обмена) приходит число 0/1, которое пытаются использовать как логический флаг без сравнения.

Строка модуля в тексте ошибкиМесто падения

Какое выражение стоит в условии и какие переменные в нём участвуют

Тип значения в отладчикеНеопределено, NULL, Строка, Число

Откуда переменная получила это значение — функция, запрос, реквизит

Стек вызововЦепочка процедур

Какая функция вернула неподходящее значение

Контекст: клиент или серверТонкий/толстый клиент, сервер

Доступность данных и отличия поведения на разных контекстах

Диагностика: как найти источник проблемного значения

Откройте конфигуратор, включите отладку и поставьте точку останова на строке, указанной в тексте ошибки. При остановке посмотрите в табло значение каждой переменной условия: именно та, что имеет тип Неопределено, NULL, Строка или Число, и является виновником.

Если отладка недоступна (ошибка у пользователя, в регламентном задании), добавьте временное логирование через ЗаписьЖурналаРегистрации с выводом типа значения: ТипЗнч(Переменная) и самого значения через Строка(Переменная). Это безопасно и не меняет логику работы.

Проверьте функции, возвращающие значение в проблемную переменную: есть ли Возврат во всех ветках, не возвращается ли Неопределено при исключительных ситуациях. Для запросов — выполните запрос в консоли и посмотрите, в каких строках поле принимает NULL.

Порядок диагностики
  1. 1
    Воспроизведите ошибку и зафиксируйте точную строку модуля из текста сообщения
  2. 2
    Остановитесь отладчиком на этой строке и проверьте тип каждой переменной в условии через табло
  3. 3
    Проследите по стеку вызовов, где переменная получила значение: функция, запрос, реквизит объекта
  4. 4
    Для запросов выполните текст запроса в консоли и найдите строки с NULL в проблемном поле
  5. 5
    После исправления повторите сценарий на тех же данных и убедитесь, что условие вычисляется в Истина или Ложь

Исправление в коде: явные проверки вместо неявного приведения

Главный принцип исправления — заменить неявное приведение на явную проверку. Вместо Если Значение Тогда пишите конкретное сравнение: Если Значение = Истина Тогда, Если ЗначениеЗаполнено(Значение) Тогда или Если Значение <> 0 Тогда — в зависимости от реального типа и смысла данных.

Для защиты от Неопределено используйте проверку типа до условия: Если ТипЗнч(Результат) = Тип("Булево") И Результат Тогда. Такая конструкция безопасна, потому что вторая часть условия вычисляется только если первая истинна (платформа применяет сокращённое вычисление логических выражений).

Если проблема в функции, которая иногда не возвращает значение, исправлять нужно её: добавьте Возврат Ложь; в конце тела функции или во все ветки, где результат не определён. Это устраняет причину, а не маскирует следствие во всех местах вызова.

bsl
// Было: Если Результат Тогда — падение при Неопределено
// Стало — безопасные варианты:
Если Результат = Истина Тогда
    // сработает только при явной Истине
КонецЕсли;

Если ТипЗнч(Результат) = Тип("Булево") И Результат Тогда
    // защита по типу
КонецЕсли;

Исправление в запросах: NULL и логические поля

В запросах защита от NULL делается функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию). Для логического поля типичная конструкция: ЕСТЬNULL(Таблица.Признак, ЛОЖЬ) КАК Признак. Тогда в коде после выборки поле всегда будет Булево, и условие не упадёт.

Отдельный случай — разыменование через точку: Документ.Контрагент.ПометкаУдаления. Если ссылка на контрагента пустая, выражение вернёт NULL. Либо оборачивайте в ЕСТЬNULL, либо проверяйте заполненность ссылки до обращения к вложенным полям.

Если логическое условие строится прямо в запросе (в секции ГДЕ или в ВЫБОР), убедитесь, что сравнение явное: ГДЕ ЕСТЬNULL(Т.Активен, ЛОЖЬ) допустимо как условие, но надёжнее писать ГДЕ ЕСТЬNULL(Т.Активен, ЛОЖЬ) = ИСТИНА — так намерение читается однозначно и не зависит от неявных правил.

Когда проблема в данных, а не в коде

Иногда код написан корректно, но ошибка возникает из-за данных: в реквизите с типом Булево оказалось значение, загруженное обменом или обработкой с отключённым контролем, либо тип реквизита составной (например, Булево и Строка), и в нём лежит строка.

Проверьте тип реквизита в конфигураторе: если он составной, любое условие вида Если Объект.Флаг Тогда потенциально опасно — нужна проверка типа значения. Для поиска «грязных» данных выполните запрос по объекту с отбором по типу значения или выгрузите выборку и посмотрите нестандартные значения.

После исправления данных (заполнение корректных значений обработкой) добавьте защиту в код, если составной тип необходим по логике прикладного решения. Если же составной тип появился случайно — лучше сузить тип реквизита до Булево, это устранит класс ошибок целиком.

Типичные ошибки
01
Оборачивание условия в Попытка/Исключение: ошибка проглатывается, логика работает непредсказуемо, причина остаётся
02
Сравнение строки с булевым литералом: Если Настройка = "Истина" — работает только при точном совпадении регистра и пробелов
03
Исправление только в одном месте вызова, когда функция возвращает Неопределено в десятке сценариев
04
Использование ЕСТЬNULL в коде вместо запроса — встроенный язык такой функции не имеет, это синтаксис только языка запросов
05
Замена условия на ЗначениеЗаполнено для числового флага: 0 считается незаполненным, что может совпадать со смыслом, а может и нет — проверяйте семантику

Профилактика: как не допустить повторения ошибки

Установите правило: функции, возвращающие Булево, всегда возвращают Булево — без Неопределено и без «молчаливых» веток. В конце тела такой функции должен стоять явный Возврат со значением по умолчанию.

В запросах с левыми соединениями и разыменованиями сразу оборачивайте логические поля в ЕСТЬNULL. Это дешёвая страховка, которая не меняет результат для корректных данных.

При получении значений извне — из файлов, веб-сервисов, обменов — нормализуйте их на входе: преобразуйте «Да»/«Нет», 0/1 в настоящее Булево один раз, в точке загрузки, а не разбрасывайте преобразования по всему коду.

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

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

Повторный запуск сценария на тех же данных
Норма

Условие вычисляется, ошибка не возникает

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

Ошибка повторяется на той же или соседней строке

Тип значения в отладчике перед условием
Норма

Булево (Истина или Ложь)

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

Неопределено, NULL, Строка или Число

Результат запроса в консоли
Норма

В логическом поле только Истина/Ложь

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

Присутствуют NULL в строках выборки

Поведение на пустых данных
Норма

Ветка Ложь отрабатывает корректно

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

Падение при пустой ссылке или пустом результате запроса

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

Можно ли просто обернуть условие в Попытка/Исключение?

Технически можно, но это плохое решение: ошибка преобразования — симптом некорректных данных или логики, а попытка её скрывает. Ветка исключения будет срабатывать молча, и вы не узнаете, что часть сценариев выполняется не так, как задумано. Исправляйте источник значения, а не симптом.

Почему сравнение «Если Значение = Истина Тогда» безопаснее, чем «Если Значение Тогда»?

Потому что сравнение с литералом Истина не требует приведения типов: для Неопределено, NULL, строки или числа результат сравнения будет Ложь, а не ошибка. Условие просто не выполнится, и программа продолжит работу предсказуемо.

Чем NULL отличается от Неопределено в 1С?

NULL — значение, которое возвращают запросы и СКД, когда данных нет (например, при левом соединении без совпадений). Неопределено — значение переменных и реквизитов встроенного языка, когда им ничего не присвоено. Оба вызывают ошибку преобразования к Булево, но защищаются по-разному: NULL — через ЕСТЬNULL в запросе, Неопределено — через проверку типа или инициализацию в коде.

Ошибка возникает только у одного пользователя. Что проверить?

Скорее всего, дело в данных, с которыми работает именно этот пользователь: конкретный документ с незаполненным реквизитом, элемент справочника с пустой ссылкой, персональные настройки со строковым значением. Воспроизведите сценарий с теми же объектами и сравните значения реквизитов с «рабочим» случаем.

Может ли ошибка появиться после обновления конфигурации?

Да. Типичные сценарии: у реквизита изменили тип на составной, переименовали реквизит (обращение по старому имени даёт Неопределено), изменили состав возвращаемых значений функции из библиотеки. После обновления проверьте места обращения к изменённым объектам и выполните синтаксический контроль модулей.

Как безопасно преобразовать строку «Да»/«Нет» или число 1/0 в Булево?

Явным сравнением или функцией-нормализатором: например, Флаг = (ВРег(СокрЛП(СтрокаЗначения)) = "ДА") для строк или Флаг = (ЧислоЗначение = 1) для чисел. Такой код не падает на неожиданных значениях — он просто возвращает Ложь, что обычно и требуется для некорректных входных данных.

Итог

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

Ошибка преобразования к Булево всегда означает неподходящее значение в условии: Неопределено, NULL, строку или число. Ищите источник значения через отладчик и стек вызовов, исправляйте явными сравнениями, проверкой типа и ЕСТЬNULL в запросах, а функции приводите к гарантированному возврату Булево. Попытка/Исключение проблему маскирует, но не решает.