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

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

Что такое тип Булево в 1С и как с ним работать

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

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

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

Как устроен тип Булево в 1С

Булево — примитивный тип встроенного языка 1С. У него всего два литерала: Истина (True) и Ложь (False). Никаких промежуточных состояний у самого типа нет — если переменной ничего не присвоено, она содержит Неопределено, а это уже другой тип, не Булево.

Объявляется переменная логического типа простым присваиванием:

ДокументПроведен = Истина;

ЕстьОшибки = Ложь;

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

Логические операции: И, ИЛИ, НЕ

Над значениями Булево работают три базовых логических оператора:

  • И (AND) — результат Истина только если оба операнда истинны;
  • ИЛИ (OR) — результат Истина, если хотя бы один операнд истинен;
  • НЕ (NOT) — меняет значение на противоположное.
Если КонтрагентАктивен И НЕ ЕстьЗадолженность Тогда

ОтгрузитьТовар();

КонецЕсли;

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

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

Где Булево используется на практике

Наиболее частые сценарии применения типа в конфигурациях:

  • условные операторы Если ... Тогда ... Иначе ... КонецЕсли;
  • реквизиты-флажки: «Архив», «Не используется», «Основной договор»;
  • возвращаемые значения функций-проверок: ПроверитьЗаполнение();
  • параметры методов, включающие или отключающие поведение;
  • отборы в динамических списках и запросах.

В запросах Булево встречается как в полях выборки, так и в условиях отбора. Например, отобрать только активные элементы справочника: ГДЕ НЕ Справочник.ПометкаУдаления. Пометка удаления — типичный реквизит типа Булево.

Булево как возвращаемое значение функции

Функции-проверки должны возвращать Булево явно на всех ветках. Если в одной ветке разработчик забыл Возврат, функция вернёт Неопределено, и условие Если Проверка() Тогда сработает как Ложь — но при этом никакой ошибки не возникнет. Такой дефект трудно заметить при тестировании.

Преобразование типов и подводные камни

Главный источник ошибок — сравнение Булево со строками и числами. Встроенный язык не преобразует строку "Истина" в логическое значение автоматически при сравнении: выражение "Истина" = Истина вернёт Ложь, потому что сравниваются разные типы.

В условиях же 1С допускает неявную логическую оценку: пустая строка, число 0 и Неопределено в конструкции Если трактуются как Ложь. Это удобно, но маскирует ошибки типизации.

Типичные ошибки
01
Сравнение строки с Булево: "Истина" = Истина даёт Ложь, нужно явное преобразование или сравнение строк со строками
02
Функция возвращает значение не на всех ветках — результат Неопределено молча трактуется как Ложь
03
Проверка вида Если Флаг = Истина Тогда вместо Если Флаг Тогда — избыточно и хуже читается
04
Размещение вызова функции во втором операнде И/ИЛИ — функция выполнится всегда, даже когда не нужна
05
Использование Булево там, где нужны три состояния: Да / Нет / Не задано — для этого нужен другой тип

Для безопасного преобразования строки в Булево используется функция XMLЗначение(Тип("Булево"), СтрокаЗначения) либо явная проверка строки на равенство "Истина"/"true" с учётом регистра и формата источника данных.

Булево, Неопределено и NULL: в чём разница

Три значения, которые часто путают, имеют разный смысл:

ЗначениеТипКогда возникает
Истина / ЛожьБулевоЯвно заданное логическое состояние
НеопределеноНеопределеноПеременной ничего не присвоено, функция не вернула значение
NULLРезультат запросаВ запросе нет данных по соединению таблиц

Проверять их нужно по-разному: Если Флаг = Истина — для Булево, Если Значение = Неопределено — для неинициализированных переменных, а NULL в запросах проверяется функцией ЕСТЬNULL() или оператором ЕСТЬ NULL. Смешивать эти проверки нельзя: сравнение с NULL через обычное равенство не даст ожидаемого результата.

Сравнение вариантов

Булево

Два жёстких состояния: Да или Нет. Подходит для флажков, настроек, признаков

Перечисление

Когда состояний больше двух или они могут появиться в будущем: Статус, Вид операции

Неопределено + Булево

Три состояния (Да / Нет / Не задано), но код сложнее и требует дисциплины проверок

Как проверить и отладить логику с Булево

При отладке условий полезно выводить значение и тип переменной перед проверкой. Функция ТипЗнч(Переменная) покажет реальный тип, а Тип("Булево") позволит сравнить его с ожидаемым:

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

// работаем с логическим значением

Иначе

// значение пришло в другом типе — обрабатываем отдельно

КонецЕсли;

В конфигураторе точка останова на строке с условием позволяет посмотреть значение каждого операнда через табло. Если условие ведёт себя неожиданно, почти всегда причина в том, что один из операндов имеет не тот тип или содержит Неопределено.

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

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

Тип переменной перед условием
Норма

ТипЗнч() возвращает Булево

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

Неопределено, Строка или Число — условие поведёт себя непредсказуемо

Возвращаемое значение функции
Норма

На всех ветках есть Возврат Истина или Возврат Ложь

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

Хотя бы одна ветка завершается без Возврат

Сравнение в условии
Норма

Сравниваются значения одного типа

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

Строка сравнивается с Булево — результат всегда Ложь

Когда Булево — не лучший выбор

Булево подходит только для действительно бинарных признаков. Если бизнес-смысл допускает третье состояние («не заполнено», «в процессе», «не применимо»), флажок рано или поздно придётся заменять перечислением, а это потребует конвертации данных в базе.

Также не стоит хранить в Булево признаки, которые по смыслу являются датой: вместо флага «Закрыт» часто полезнее хранить «ДатаЗакрытия» — пустая дата сама по себе означает «не закрыт», плюс сохраняется информация о моменте события.

Итог

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

Булево — тип с двумя значениями: Истина и Ложь. Следите за типами в сравнениях, возвращайте значение на всех ветках функций, помните об отсутствии ленивых вычислений и не путайте Ложь с Неопределено и NULL.

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

Чем Булево отличается от числа 0 и 1 в 1С?

Это разные типы. В условиях число 0 трактуется как Ложь, а ненулевое — как Истина, но при строгом сравнении 1 = Истина результат будет Ложь. Для логических признаков корректнее использовать именно Булево — это делает код понятнее и защищает от ошибок типизации.

Почему условие «Если СтрокаРезультат = Истина» не срабатывает?

Потому что сравниваются разные типы: строка и Булево. Даже если строка содержит текст «Истина», равенства не будет. Нужно либо сравнивать строку со строкой, либо сначала преобразовать значение к типу Булево.

Можно ли в реквизите справочника хранить три состояния через Булево?

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

Как проверить, что функция вернула именно Булево, а не Неопределено?

Используйте ТипЗнч(Результат) = Тип("Булево"). Разработчику надёжнее гарантировать тип на стороне самой функции — добавить Возврат Ложь; в конце как значение по умолчанию.

Работает ли Булево в запросах 1С?

Да. Поля типа Булево доступны в выборке и отборах, значения задаются литералами ИСТИНА и ЛОЖЬ. В условиях соединений помните про NULL: при отсутствии связанной записи поле будет NULL, а не Ложь, поэтому применяйте ЕСТЬNULL.

Нужно ли писать «Если Флаг = Истина Тогда» или достаточно «Если Флаг Тогда»?

Достаточно Если Флаг Тогда — переменная типа Булево сама является условием. Сравнение с Истина избыточно, а если переменная вдруг окажется другого типа, короткая форма и развёрнутая могут дать разный результат, что ещё раз подчёркивает важность контроля типов.