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