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