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

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

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

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

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

Чаще всего ошибка проявляется в операторах условий Если ... Тогда, в циклах Пока, в параметрах запросов и при обращении к реквизитам объектов, которые по какой-то причине не заполнены. Пользователь видит окно с текстом ошибки, а работа документа, отчёта или обработки прерывается.

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

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

Во встроенном языке 1С тип Булево имеет только два значения — Истина и Ложь. Платформа умеет автоматически приводить к булеву далеко не все типы. Безопасно преобразуются сами булевы значения; а вот строка «Да», число 1, Неопределено или NULL в условии вызовут именно эту ошибку, потому что платформа не знает, считать ли их истиной.

Типичные места возникновения:

  • условия Если, ИначеЕсли, циклы Пока;
  • логические операции с реквизитами, имеющими составной тип;
  • результаты функций, которые в отдельных ситуациях возвращают Неопределено;
  • параметры и выражения в запросах (там текст ошибки может отличаться, но суть та же);
  • настройки отборов в динамических списках и СКД, куда попали некорректные значения.

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

Как найти проблемное место в коде

Первый шаг — прочитать текст ошибки полностью. Платформа указывает модуль и номер строки, где произошло исключение, например: {ОбщийМодуль.Расчеты.Модуль(245)}: Преобразование значения к типу Булево не может быть выполнено. Это прямой указатель на проблемную строку.

Если текст ошибки не содержит позиции (так бывает при выполнении кода на сервере с тонкой обёрткой сообщений), включите отладку. В конфигураторе: «Отладка» → «Подключение», убедитесь, что включены нужные предметы отладки (клиентские и серверные), затем воспроизведите ошибку. Исполнение остановится на проблемной строке, и через «Вычислить выражение» (Shift+F9) можно посмотреть фактическое значение и тип переменной: ТипЗнч(МояПеременная).

Для пользователя без доступа к конфигуратору полезно зафиксировать, при каком действии возникает ошибка: при проведении конкретного документа, формировании отчёта с определёнными отборами, открытии формы. Это сильно сужает поиск — чаще всего виноват незаполненный реквизит или «битая» ссылка в данных.

Порядок диагностики
  1. 1
    Скопируйте полный текст ошибки и найдите указание на модуль и строку
  2. 2
    Откройте эту строку в конфигураторе и определите, какое выражение используется как условие
  3. 3
    Через отладку проверьте тип и значение каждой переменной в условии (ТипЗнч, ВычислитьВыражение)
  4. 4
    Установите, почему значение получило небулев тип: незаполненный реквизит, функция вернула Неопределено, NULL из запроса
  5. 5
    Примените исправление и повторите сценарий на тех же данных

Типовые причины и их исправление

Неопределено в условии

Самый частый сценарий: функция или метод в части случаев возвращает Неопределено, а вызывающий код использует результат напрямую в условии: Если Результат Тогда. Исправление — явная проверка: Если Результат = Истина Тогда или предварительная проверка Если Результат <> Неопределено И Результат Тогда.

NULL из запроса

При левом соединении в запросе поле может вернуть NULL. Если затем это поле попадает в условие или в выражение СКД, возникает ошибка. В самом запросе используйте ЕСТЬNULL(Поле, Ложь) для булевых полей — это устраняет проблему на уровне данных.

Составной тип реквизита

Если реквизит имеет составной тип (например, Булево и СправочникСсылка), то в зависимости от заполненности значение может оказаться ссылкой. Сравнение Если Реквизит Тогда упадёт, когда там не Булево. Решение — сузить тип реквизита в метаданных или проверять тип перед использованием.

Строка или число вместо Булево

Значения, загруженные из файлов обмена, Excel или веб-сервисов, часто приходят строками: «Истина», «1», «Да». Перед использованием в условии их нужно явно преобразовать: сравнить с ожидаемой строкой (Если СтрокаЗначение = "Истина" Тогда) или написать функцию нормализации входных данных.

bsl
// Плохо: если ЗначениеФлага = Неопределено или строка — будет ошибка
Если ЗначениеФлага Тогда ... КонецЕсли;

// Хорошо: явная проверка
Если ЗначениеФлага = Истина Тогда ... КонецЕсли;

// Для полей запроса
ЕСТЬNULL(Таблица.Признак, Ложь) КАК Признак

Исправление в типовой конфигурации без доработки кода

Если ошибка возникает в типовой конфигурации (1С:Бухгалтерия, УТ, ERP и др.), а доступа к изменению кода нет или снимать конфигурацию с поддержки нежелательно, начните с данных. Частая причина — незаполненный служебный реквизит, некорректная настройка или «битая» ссылка после обмена.

Практические шаги: проверьте заполненность всех обязательных полей объекта, на котором возникает ошибка; перепроведите документ; очистите отборы отчёта и задайте их заново. Если ошибка появилась после обновления — проверьте, не завершились ли не до конца отложенные обработчики обновления (в типовых это видно в разделе «Результаты обновления программы»).

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

Как проверить, что исправление сработало

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

Дополнительно проверьте граничные случаи: пустой реквизит, объект без заполненного признака, запись с NULL из соединения. Если исправление сделано через Значение = Истина или ЕСТЬNULL, такие случаи должны обрабатываться корректно — условие просто не выполнится, а не упадёт с исключением.

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

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

Повтор исходного сценария
Норма

Операция выполняется без окна ошибки

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

Ошибка возникает снова, возможно с другим номером строки

Граничные данные (пустые реквизиты, NULL)
Норма

Условие корректно отрабатывает как Ложь

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

Исключение на незаполненных данных

Журнал регистрации
Норма

Нет новых записей об ошибках по этому сценарию

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

Ошибки фиксируются, значит проблемное место не единственное

Типичные ошибки при исправлении

Распространённая ошибка — «заглушить» проблему обёрткой Попытка ... Исключение КонецПопытки без анализа причины. Код перестаёт падать, но логика работает неправильно: условие молча не выполняется, и, например, сумма в документе не пересчитывается. Такие скрытые дефекты всплывают позже и дороже.

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

Типичные ошибки
01
Обёртка в Попытка/Исключение без анализа причины — маскирует дефект и ломает логику
02
Исправление одного вызова вместо источника Неопределено — ошибка возвращается в другом сценарии
03
Сравнение строки с Истина без учёта регистра и локали («истина» ≠ «Истина» в некоторых контекстах)
04
Исправление на копии базы без переноса в рабочую — проблема остаётся у пользователей

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

Главное правило: в условиях используйте только значения, гарантированно имеющие тип Булево. Если данные приходят извне (файлы, обмены, запросы, пользовательский ввод) — нормализуйте их на входе. Для полей запросов применяйте ЕСТЬNULL, для реквизитов — проверку ЗначениеЗаполнено() перед логикой.

При проектировании функций фиксируйте контракт: если функция должна вернуть Булево, она обязана вернуть Истина или Ложь во всех ветках, включая исключительные ситуации. Это избавляет всех вызывающих от необходимости защищаться.

Для команд полезно включить в код-ревью проверку условий на неявные преобразования — эта ошибка легко выявляется глазами при чтении кода, если знать, что искать.

Итог

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

Ошибка «Преобразование к типу Булево не может быть выполнено» означает, что в условие попало Неопределено, NULL, строка или число. Диагностируйте по номеру строки из текста ошибки и отладчику, исправляйте явными проверками (Значение = Истина, ЕСТЬNULL, ЗначениеЗаполнено), а не обёртками Попытка/Исключение. Перед любыми изменениями делайте резервную копию базы.

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

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

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

Чем отличается проверка «= Истина» от ЗначениеЗаполнено()?

Сравнение Значение = Истина подходит, когда нужен именно логический признак: Неопределено, NULL и Ложь будут корректно отброшены. ЗначениеЗаполнено() проверяет заполненность любого типа (непустая строка, ненулевое число тоже дадут Истина), поэтому для булевых флагов она может дать неверный результат — например, для строки «Ложь» вернёт Истина.

Ошибка возникает в отчёте на СКД, кода я не писал. Что делать?

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

Как исправить ошибку, если конфигурация на поддержке и менять код нельзя?

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

Почему ошибка появляется только у одного пользователя или на одном документе?

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

Поможет ли перезапуск сервера 1С или чистка кэша?

Иногда — если ошибка вызвана устаревшим кэшем метаданных на клиенте или сервере после обновления. Очистка кэша (удаление папок кэша клиентского приложения или перезапуск сервера 1С) — безопасная и быстрая проверка. Но если ошибка воспроизводится стабильно на конкретных данных, причина почти наверняка в коде или данных, и чистка кэша не поможет.