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

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

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

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

Ошибка «Преобразование значения к типу Булево не может быть выполнено» возникает, когда платформа 1С пытается привести значение к логическому типу (Истина/Ложь), а исходные данные для этого не подходят. Чаще всего это происходит при сравнениях в условиях «Если», при чтении реквизитов объектов с неопределённым значением или при обработке данных из внешних источников — файлов, веб-сервисов, запросов.

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

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

Что означает ошибка и почему она возникает

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

Типичные значения-источники проблемы:

  • Неопределено — например, функция не вернула значение, или реквизит не был инициализирован;
  • NULL — результат запроса, когда поле в базе пустое или соединение таблиц не нашло соответствия;
  • Строка — данные из файла обмена, XML, JSON или веб-сервиса, где «Истина» хранится текстом;
  • Число — флаги 0/1 из внешних систем или старых форматов обмена;
  • Пустая ссылка или объект, переданный туда, где ожидался логический признак.

Шаг 1. Найдите точное место ошибки

Первое действие — определить строку кода, где происходит преобразование. Откройте текст ошибки полностью: в нём обычно указано «{Обработка.ИмяОбработки.Форма.Форма.Форма(123)}: Преобразование значения к типу Булево не может быть выполнено». Число в скобках — номер строки модуля.

Если ошибка возникает в типовой конфигурации при работе пользователя, откройте журнал регистрации (Администрирование → Обслуживание → Журнал регистрации), отфильтруйте по уровню «Ошибка» и посмотрите стек вызовов в комментарии. Там видно, какая процедура вызвала проблемную строку.

Если конфигурация доработанная или ошибка в собственной обработке, запустите отладку: конфигуратор → Отладка → Начать отладку, поставьте точку останова на найденной строке и посмотрите значения переменных в табло (Shift+F9). Именно здесь видно, что в условие попало Неопределено или строка.

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

Шаг 2. Исправьте условие с Неопределено или NULL

Самая частая причина — сравнение переменной, которая оказалась равна Неопределено или NULL. Конструкция вида «Если РезультатФункции() Тогда» безопасна только если функция гарантированно возвращает Булево. Если она может вернуть Неопределено, условие нужно переписать.

Рабочий вариант — явное сравнение с Истина:

Результат = ПолучитьПризнак(Документ);

Если Результат = Истина Тогда

// дальнейшие действия

КонецЕсли;

Для значений из запроса, где может прийти NULL, используйте функцию ЕСТЬNULL прямо в тексте запроса:

ВЫБРАТЬ

ЕСТЬNULL(Товары.НеОтгружать, ЛОЖЬ) КАК НеОтгружать

ИЗ

Справочник.Номенклатура КАК Товары

Такой подход гарантирует, что на выходе всегда будет Булево, и последующие условия в коде не упадут с ошибкой преобразования.

Шаг 3. Преобразуйте строки и числа из внешних источников

При загрузке данных из файлов обмена, XML, JSON или ответов веб-сервисов логические значения часто приходят текстом: «true», «Истина», «1», «Да». Перед использованием в условии их нужно привести к Булеву вручную.

Пример безопасного преобразования строки:

Функция СтрокаВБулево(ЗначениеСтрока)

Если СтрокаСтрока = "Истина" Или ЗначениеСтрока = "true"

Или ЗначениеСтрока = "1" Или ЗначениеСтрока = "Да" Тогда

Возврат Истина;

Иначе

Возврат Ложь;

КонецЕсли;

КонецФункции

Для числовых флагов достаточно сравнения: «Если КодФлага = 1 Тогда». Не пытайтесь передать число напрямую в условие — платформа не примет его как Булево.

При чтении JSON через «ПрочитатьJSON» проверяйте тип полученного значения функцией ТипЗнч() перед использованием: структура может не содержать нужного свойства, и обращение к нему вернёт Неопределено.

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

Шаг 4. Проверьте реквизиты объектов и настройки отбора

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

Порядок действий для отчёта на СКД: откройте «Ещё → Изменить вариант», перейдите на вкладку «Отбор» и временно отключите все условия. Если отчёт сформировался — включайте отборы по одному, пока не найдёте проблемный. Обычно это сравнение логического поля со значением неподходящего типа или отбор по полю, которое возвращает NULL из-за левого соединения.

Для реквизитов справочников и документов проверьте, не обращается ли код к реквизиту, которого нет у данного вида объекта — например, в общем модуле, обрабатывающем разные типы документов. Здесь помогает проверка через метаданные или обёртка в «Попытка … Исключение».

Маршрут решения

Как выбрать способ исправления

Ошибка в собственном коде или обработкеНайдите строку в отладчике и добавьте явное сравнение с Истина или проверку ТипЗнч()
Ошибка в отчёте на СКД или динамическом спискеОтключите отборы и условное оформление, включайте по одному, исправьте проблемное условие
Ошибка при обмене или загрузке файлаДобавьте функцию явного преобразования строки или числа в Булево
Ошибка в типовом коде без доработокОбновите конфигурацию до актуального релиза и проверьте, не повреждены ли данные (тестирование и исправление)

Шаг 5. Проверьте результат и защититесь от повторения

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

Чтобы проблема не вернулась, полезно принять простые правила для всего кода: функции, возвращающие признаки, всегда должны явно возвращать Истина или Ложь (без «пустого» Возврата); значения из запросов — оборачиваться в ЕСТЬNULL; данные из внешних источников — проходить через функции преобразования с проверкой типа.

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

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

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

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

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

Часто задаваемые вопросы

Можно ли преобразовать строку «Истина» в Булево напрямую?

Штатной функции автоматического преобразования строки в Булево в языке 1С нет. Нужно написать собственную функцию сравнения строки с допустимыми вариантами («Истина», «true», «1», «Да») и возвращать Истина или Ложь явно.

Почему ошибка не находится синтаксической проверкой конфигуратора?

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

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

Скорее всего, дело в данных или настройках этого пользователя: сохранённый вариант отчёта с некорректным отбором, настройки динамического списка или права, из-за которых запрос возвращает NULL. Попробуйте очистить настройки пользователя (Администрирование → Пользователи и права → Очистка настроек) и повторить действие.

Чем отличается NULL от Неопределено в этой ошибке?

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

Поможет ли обновление конфигурации, если код типовой?

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

Как быстро найти все места в коде с риском такой ошибки?

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

Итог

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

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