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