Разработка и Конфигурация · 12 мин
Ошибка преобразования к типу Булево в 1С: как найти и исправить
Разбираем ошибку «Преобразование значения к типу Булево не может быть выполнено» в 1С: причины, поиск места в коде, способы исправления и профилактика.
Ошибка «Преобразование значения к типу Булево не может быть выполнено» — одна из самых частых ошибок времени выполнения в 1С:Предприятие. Она возникает, когда платформа пытается интерпретировать значение как «Истина» или «Ложь», но тип данных этого не позволяет: например, в условии «Если» подставлена строка, число, дата или значение «Неопределено».
Чаще всего с этой ошибкой сталкиваются пользователи типовых конфигураций после обновления, при открытии отчётов, проведении документов или работе обменов данными. Разработчики встречают её при написании собственных условий, когда в проверку попадает результат функции, реквизит объекта или параметр запроса неожиданного типа.
Хорошая новость в том, что ошибка почти всегда локализуема: в сообщении об ошибке платформа указывает модуль, строку и выражение, в котором произошёл сбой. Дальше остаётся понять, какое значение туда попало, и либо исправить данные, либо скорректировать код проверки.
Что означает эта ошибка и когда она возникает
Тип «Булево» в 1С имеет только два значения: «Истина» и «Ложь». Платформа автоматически не преобразует в булево произвольные типы — в отличие от некоторых других языков, где непустая строка или ненулевое число считаются «истиной». В 1С выражение Если "Текст" Тогда или Если 5 Тогда приведёт именно к этой ошибке.
Типичные ситуации появления ошибки: условие «Если» в модуле объекта или формы, тернарный оператор «?», логические операции «И», «ИЛИ», «НЕ» над небулевскими операндами, а также параметры методов, ожидающие булево значение, но получающие что-то другое.
Отдельный частный случай — значения «Неопределено» и «NULL». Результат запроса может вернуть NULL при левом соединении, функция может вернуть «Неопределено», если ветка кода не задала возврат. Попадание такого значения в условие вызывает ту же ошибку, хотя визуально код выглядит корректно.
Как найти место ошибки в коде
Первый шаг — внимательно прочитать окно сообщения об ошибке. Платформа показывает текст вида: «{ОбщийМодуль.ИмяМодуля.Модуль(123)}: Преобразование значения к типу Булево не может быть выполнено». Число в скобках — номер строки модуля. Двойной щелчок по сообщению в конфигураторе открывает модуль на нужной строке.
Если ошибка возникает в режиме предприятия у пользователя, а конфигуратор недоступен, запишите полный текст сообщения и действия, которые к нему привели: какой документ проводился, какой отчёт формировался, какие данные были введены. Это позволит воспроизвести ситуацию на тестовой копии базы.
Для сложных случаев используйте отладчик: установите точку останова на указанной строке, повторите действие и посмотрите в табло значений всех переменных, участвующих в условии. Чаще всего оказывается, что одна из переменных содержит «Неопределено», NULL или строку вместо ожидаемого булева значения.
- 1Скопируйте полный текст сообщения об ошибке с указанием модуля и строки
- 2Откройте конфигуратор и перейдите к указанной строке двойным щелчком по сообщению
- 3Установите точку останова и запустите отладку, воспроизведите действие пользователя
- 4Проверьте в табло типы и значения всех переменных в условии
- 5Определите, откуда пришло неправильное значение: функция, реквизит, запрос, параметр
Типичные причины и способы исправления
Неопределено в условии
Функция без явного «Возврат» во всех ветках возвращает «Неопределено». Если результат такой функции используется в условии, возникает ошибка. Исправление — либо гарантировать возврат булева значения из функции, либо проверять результат: Если Результат = Истина Тогда вместо Если Результат Тогда.
NULL из запроса
При левом соединении таблиц поля присоединённой таблицы могут содержать NULL. Если выборка попадает в условие напрямую, ошибка неизбежна. Используйте функцию «ЕСТЬNULL» в тексте запроса или проверку Если Значение = NULL Тогда перед использованием. Обратите внимание: в 1С NULL сравнивается только через «= NULL», а не через «Если Значение Тогда».
Строка или число вместо флага
Иногда в параметры или реквизиты сохраняют строки «Да»/«Нет» или числа 0/1, а затем используют их как флаг. Платформа такое не примет. Замените условие на явное сравнение: Если Флаг = "Да" Тогда или Если КодСтатуса = 1 Тогда.
Реквизит составного типа
Если реквизит объекта имеет составной тип (например, строка или булево), при чтении он может вернуть пустую строку. Перед использованием в условии проверяйте тип через «ТипЗнч» или приводите логику к явному сравнению с ожидаемым значением.
// Неправильно: ошибка, если Результат = Неопределено
Если ПроверитьДоступ() Тогда
// ...
КонецЕсли;
// Правильно: явное сравнение
Если ПроверитьДоступ() = Истина Тогда
// ...
КонецЕсли;
// Правильно: проверка заполнения для произвольных типов
Если ЗначениеЗаполнено(Результат) И Результат = Истина Тогда
// ...
КонецЕсли;Что делать, если ошибка в типовой конфигурации
Если ошибка возникает в типовой конфигурации на поддержке и вы код не меняли, причина обычно в данных: некорректно заполненный реквизит, результат обмена, «битая» ссылка или значение, оставшееся после незавершённого обновления. Начните с проверки данных объекта, на котором возникает ошибка.
Проверьте, не установлены ли расширения конфигурации — они частая причина подобных сбоев после обновления платформы или конфигурации. Отключите расширения по очереди (Администрирование → Печатные формы, отчеты и обработки → Расширения) и проверьте, исчезла ли ошибка. Если да — проблема в конкретном расширении, его нужно обновить или доработать.
Перед любыми правками кода типовой конфигурации сделайте резервную копию базы. Изменение типового кода снимает объекты с полной поддержки и усложняет будущие обновления — предпочтительнее исправить данные или оформить доработку через расширение.
Ошибка после обновления конфигурации или платформы
Заметная доля обращений с этой ошибкой приходится на период после обновлений. Типичный сценарий: обновление конфигурации завершилось с ошибками или было прервано, и часть обработчиков обновления данных не выполнилась. Проверьте журнал регистрации на наличие ошибок в момент обновления и статус отложенных обработчиков (в типовых конфигурациях: Администрирование → Обслуживание → Результаты обновления программы).
Другой сценарий — несовместимость версии платформы с конфигурацией. Если ошибка появилась сразу после обновления платформы, проверьте рекомендуемую версию платформы для вашей конфигурации в документации поставщика и при необходимости откатитесь на поддерживаемую версию.
Если обновление прервано, не пытайтесь «дожать» его повторным запуском на той же базе без анализа. Восстановите копию, сделанную до обновления, и повторите процедуру, контролируя журнал регистрации.
Как выбрать действие
Как проверить, что проблема решена
После исправления воспроизведите исходный сценарий на тестовой копии: откройте тот же документ, сформируйте тот же отчёт, запустите тот же обмен. Ошибка не должна появиться, а прикладной результат (проведение, движения по регистрам, сформированный отчёт) должен соответствовать ожиданиям.
Если исправлялся код, прогоните смежные сценарии: условие может использоваться в нескольких ветках логики, и исправление одной ситуации не гарантирует корректность остальных. Полезно поискать по конфигурации все места вызова изменённой функции.
На рабочей базе после переноса исправления попросите пользователя повторить действие и убедитесь, что в журнале регистрации нет новых ошибок за этот период.
Как проверить результат
Документ проводится, отчёт формируется без сообщений об ошибке
Ошибка повторяется или появилась новая
В условии — Истина/Ложь или результат явного сравнения
Неопределено, NULL, строка или число в логическом выражении
Нет ошибок за период после исправления
Ошибки продолжают записываться
Движения документа и связанные данные корректны
Частичные записи, пустые движения, разрывы в данных
Профилактика: как не допустить повторения
Разработчикам: всегда возвращайте из функций с логическим результатом явное булево значение «Возврат Истина» или «Возврат Ложь» во всех ветках. В условиях используйте явные сравнения вместо неявного приведения, а для проверки заполненности — «ЗначениеЗаполнено». В запросах оборачивайте потенциально NULL-поля в «ЕСТЬNULL».
Администраторам: перед обновлением делайте полную резервную копию, обновляйте сначала тестовую копию базы и проверяйте ключевые сценарии. Следите за совместимостью версий платформы и конфигурации, а расширения после каждого обновления проверяйте на работоспособность.
Частые вопросы
Может ли эта ошибка появиться у обычного пользователя, который не пишет код?
Да. Пользователь видит её, когда сбой происходит в коде конфигурации, расширения или внешней обработки при работе с конкретными данными. Самостоятельно пользователь может проверить заполненность реквизитов объекта и сообщить администратору полный текст ошибки и последовательность действий.
Чем отличаются Неопределено и NULL в контексте этой ошибки?
«Неопределено» — значение по умолчанию для переменных и невозвращённых результатов функций в коде. NULL — значение из базы данных, появляющееся в результатах запросов, например при левом соединении. Оба вызывают ошибку в условии, но обрабатываются по-разному: NULL — через ЕСТЬNULL в запросе, «Неопределено» — проверкой в коде.
Ошибка возникает только у одного пользователя. В чём причина?
Скорее всего, дело в данных, с которыми работает этот пользователь: он открывает документ с определённым сочетанием реквизитов, которое и приводит к сбою. Также возможны отличающиеся настройки пользователя или права, влияющие на ветку выполняемого кода. Воспроизведите действие под этим пользователем на копии базы.
Поможет ли тестирование и исправление базы?
Нет, «Тестирование и исправление» устраняет физические повреждения данных и нарушения ссылочной целостности, но не исправляет логическую ошибку в коде или некорректный тип значения в условии. Оно имеет смысл только если диагностика показала именно повреждение данных, например битые ссылки.
Как исправить ошибку, если конфигурация на поддержке без возможности изменения?
Вариантов три: исправить данные, вызывающие сбой; отключить или обновить расширение, если причина в нём; написать собственное расширение, переопределяющее проблемный метод. Прямая правка типового кода — крайняя мера, требующая снятия объекта с поддержки.
Почему ошибка появляется не всегда, а «плавает»?
Плавающий характер означает зависимость от данных: условие срабатывает только при определённом значении реквизита, результате запроса или состоянии регистра. Найдите закономерность — какие документы, контрагенты или периоды участвуют в сбойных случаях — и проверяйте типы значений именно в этих ситуациях.
Что важно запомнить
Ошибка преобразования к типу Булево всегда означает небулево значение в логическом выражении. Найдите строку по сообщению об ошибке, проверьте типы значений в отладчике, исправьте условие явным сравнением или проверкой заполненности. В типовых конфигурациях сначала проверяйте данные, расширения и результаты обновления, а правки кода выполняйте только после резервного копирования.