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

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

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

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

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

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

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

Что означает ошибка и когда она появляется

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

Триггерами служат конструкции, где платформа ожидает именно Булево:

  • условие Если Выражение Тогда — Выражение должно быть Булево;
  • условный оператор ?(Условие, Значение1, Значение2);
  • цикл Пока Условие Цикл;
  • параметры методов, принимающие Булево (например, видимость и доступность элементов формы);
  • отборы и параметры компоновки данных, где в сравнении участвует значение неподходящего типа.

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

Ошибка при открытии формыПроблема в коде формы или данных

Смотрите обработчики ПриСозданииНаСервере, ПриОткрытии и вычисляемые свойства элементов

Ошибка после обновленияИзменились данные или состав типов

Проверьте реквизиты, ставшие составными, и новые обязательные проверки

Ошибка при обменеПришло неожиданное значение из другой базы

Ищите поля, где в источнике пустая строка или NULL вместо Булево

Ошибка в отчётеПроблема в отборе или параметре СКД

Проверьте типы параметров и условия отбора в настройках

Типичные причины в коде

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Если Выборка.Признак Тогда // здесь может быть NULL

...

КонецЕсли;

КонецЦикла;

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

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

При загрузке данных из файлов, веб-сервисов или JSON логические поля часто приходят строками «true», «Истина», «1», «Да». Встроенный язык не преобразует такие строки к Булево автоматически, и конструкция Если СтрокаИзФайла Тогда завершится ошибкой.

Правильный подход — явное сравнение или функция нормализации:

Флаг = (НРег(СокрЛП(ЗначениеИзФайла)) = "истина")

ИЛИ (СокрЛП(ЗначениеИзФайла) = "1")

ИЛИ (НРег(СокрЛП(ЗначениеИзФайла)) = "да");

Неопределено и составные типы

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

Как найти место ошибки

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

Если стек вызовов не показан, действуйте так:

  1. Включите отладку в конфигураторе (Отладка → Подключение) и воспроизведите ошибку под отладчиком: остановка по ошибке покажет точное место.
  2. Поставьте точку останова с условием остановки по исключению — конфигуратор прервёт выполнение в момент ошибки.
  3. Изучите значения переменных в табло: найдите, какая переменная имеет тип, отличный от Булево.
  4. Проследите, откуда значение пришло: из запроса, параметра, реквизита объекта или результата функции.

В файловой базе без доступа к конфигуратору помогает технологический журнал: включите запись событий EXCP и воспроизведите ошибку — в логе будет контекст и стек вызовов.

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

Способы исправления

Универсальное правило: никогда не полагайтесь на неявное приведение к Булево. Всегда приводите значение к логическому явно — так код становится и надёжнее, и читабельнее.

СитуацияНадёжное решение
Значение из запроса может быть NULLЕСТЬNULL(Поле, Ложь) в запросе или проверка «= Истина» в коде
Строка «Истина»/«true»/«1» из файла или сервисаЯвное сравнение нормализованной строки с ожидаемыми вариантами
Необязательный параметр (может быть Неопределено)Значение по умолчанию в объявлении: Параметр = Ложь
Реквизит составного типаПроверка ТипЗнч() перед использованием в условии
Число 0/1 как флагСравнение: Если ЧисловойФлаг = 1 Тогда

Пример защитного шаблона для значения неизвестного происхождения:

Если ТипЗнч(Значение) = Тип("Булево") Тогда

Флаг = Значение;

ИначеЕсли Значение = Неопределено Тогда

Флаг = Ложь;

Иначе

Флаг = (СокрЛП(Строка(Значение)) = "Истина");

КонецЕсли;

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

Типичные ошибки
01
Использование результата левого соединения в условии без ЕСТЬNULL — ошибка на первой же записи без связи
02
Присвоение строке «Ложь» и ожидание, что условие сработает как Булево — непустая строка не преобразуется и вызовет ошибку
03
Сравнение с NULL обычным равенством в языке запросов — условие никогда не выполняется, логика искажается
04
Исправление только симптома обёрткой Попытка/Исключение — ошибка скрывается, но данные обрабатываются неправильно

Ошибка у пользователя типовой конфигурации

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

Практическая последовательность:

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

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

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

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

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

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

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

Действие выполняется без сообщения об ошибке

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

Ошибка возникает снова или появляется на другом объекте

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

Код отрабатывает по задуманной ветке по умолчанию

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

Ошибка или неверный результат на пустых данных

Результаты отчёта/проведения
Норма

Цифры совпадают с ожидаемыми, логика не изменилась

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

Ошибка ушла, но данные стали другими без причины

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

Почему 1С не преобразует строку «Истина» в Булево автоматически?

Встроенный язык 1С использует строгие правила приведения типов: к Булево не приводятся ни строки, ни числа. Это сделано сознательно, чтобы неоднозначные значения («да», «1», «true») не трактовались случайным образом. Преобразование нужно выполнять явно — сравнением или функцией нормализации.

Ошибка возникает только у одного пользователя. В чём дело?

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

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

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

Ошибка появилась после обновления конфигурации. Что проверить в первую очередь?

Посмотрите, не изменился ли тип реквизита (например, стал составным), не добавились ли новые проверки в типовом коде и нет ли доработок или расширений, конфликтующих с новой версией. Полезно сравнить проблемный модуль с поставкой предыдущего релиза.

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

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

Как быстро определить тип проблемного значения?

В отладчике добавьте в табло выражение ТипЗнч(Переменная) — оно покажет фактический тип. Вне отладчика можно временно вывести значение через Сообщить() вместе с ТипЗнч() и воспроизвести сценарий.

Итог

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

Ошибка «Преобразование к типу Булево не может быть выполнено» означает, что в логическое выражение попало значение неподходящего типа — NULL, Неопределено, строка или составное значение. Лечится она не маскировкой, а явной проверкой типа и нормализацией значения до использования в условии. Диагностику начинайте с точного места ошибки и типа проблемной переменной.