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

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

Тип Булево в 1С: что это значит и как с ним работать

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

Тип Булево — один из примитивных типов данных встроенного языка 1С:Предприятие. Он может принимать только два значения: Истина и Ложь. Название происходит от имени математика Джорджа Буля, а сам тип представляет классическую логику «да/нет», «включено/выключено», «подходит/не подходит».

В конфигурациях 1С Булево встречается повсюду: в условных операторах «Если…Тогда», в реквизитах справочников и документов (например, флажок «Архивный» или «Не использовать»), в отборах динамических списков, в параметрах запросов и в результатах функций проверок. Понимание того, как устроен этот тип, напрямую влияет на корректность бизнес-логики.

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

Что такое тип Булево и какие значения он принимает

Булево — это логический тип, который хранит результат проверки условия. Два возможных литерала — Истина и Ложь — являются ключевыми словами встроенного языка и пишутся без кавычек. В англоязычной нотации им соответствуют True и False.

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

Пример объявления и присвоения:

Пометка = Истина;

Проведен = Ложь;

Результат = (СуммаДокумента > 10000); // Булево — результат сравнения

В третьей строке переменная Результат получает тип Булево автоматически, потому что операция сравнения всегда возвращает Истина или Ложь. Это основной способ «рождения» булевых значений в коде.

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

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

Если КонтрагентАктивен И НЕ ЕстьЗадолженность Тогда

// отгрузка разрешена

КонецЕсли;

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

Полезная особенность платформы — сокращённое вычисление логических выражений. Если в условии «А И Б» первое условие ложно, второе не вычисляется. Это позволяет безопасно писать цепочки вида «Если ЗначениеЗаполнено(Ссылка) И Ссылка.Активен Тогда» — обращения к реквизиту пустой ссылки не произойдёт.

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

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

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

Третья область — отборы и запросы. В динамических списках, СКД и параметрах запросов булевы значения фильтруют данные. Например, отбор «Показывать только активных» реализуется условием по булеву реквизиту.

Функции-проверки

Распространённый приём — функции, возвращающие Булево. Их имена принято начинать с глагола состояния: ЭтоПроведенныйДокумент, ЕстьОшибкиЗаполнения, МожноРедактировать. Такой стиль делает код читаемым: условие «Если МожноРедактировать(Объект) Тогда» читается как обычная фраза.

Булево в запросах: NULL и особенности сравнения

В языке запросов 1С логика трёхзначная: помимо ИСТИНА и ЛОЖЬ существует NULL — отсутствие значения. NULL возникает, например, при левом соединении, когда для строки основной таблицы не нашлось пары. Сравнение с NULL никогда не даёт ИСТИНА: выражение «Реквизит = NULL» всегда ложно.

Поэтому проверку отсутствующего значения выполняют через ЕСТЬ NULL, а при необходимости подставляют значение по умолчанию функцией ЕСТЬNULL(Поле, ЛОЖЬ). Это критично для булевых полей в соединениях: без ЕСТЬNULL условие «НЕ Поле» для NULL-строк сработает не так, как ожидает разработчик.

ВЫБРАТЬ

ЕСТЬNULL(ДопСвойства.Архивный, ЛОЖЬ) КАК Архивный

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДопСвойства КАК ДопСвойства

ПО ДопСвойства.Объект = Товары.Ссылка

Чем Булево отличается от Неопределено, NULL и числа

Неопределено — значение по умолчанию для незаполненных переменных и реквизитов составного типа. Это не Ложь: сравнение «Неопределено = Ложь» возвращает Ложь. Если переменная должна быть строго булевой, инициализируйте её явно: Флаг = Ложь;.

NULL существует только в запросах, Неопределено — только во встроенном языке. Смешивать эти понятия — распространённая ошибка новичков. При передаче Неопределено в параметр запроса платформа преобразует его в NULL, что тоже нужно учитывать в условиях.

ЗначениеГде существуетСмыслКак проверять
Истина / ЛожьЯзык и запросыЛогическое значениеПрямое сравнение
НеопределеноВстроенный языкЗначение не заданоЗначение = Неопределено
NULLЯзык запросовНет данных (соединение)ЕСТЬ NULL / ЕСТЬNULL()

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

Булево реквизит

Подходит для строгих признаков да/нет. Ограничение: нельзя хранить третье состояние «не задано».

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

Подходит, когда нужно отличать «не заполнено» от Ложь. Ограничение: сложнее проверки и отборы.

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

Подходит, когда состояний больше двух или они могут расшириться. Ограничение: больше кода на простые проверки.

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

Первая ошибка — избыточное сравнение в условиях. Конструкция «Если Флаг = Истина Тогда» работает, но избыточна: достаточно «Если Флаг Тогда». Обратный случай опаснее: «Если Флаг = Ложь» и «Если НЕ Флаг» эквивалентны только при гарантированно булевом значении; для Неопределено результаты различаются.

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

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

Типичные ошибки
01
Сравнение с NULL через знак равенства в запросе — условие никогда не выполняется, строки теряются
02
Использование строк "Истина"/"Ложь" вместо булевых литералов — сравнения дают неожиданный результат
03
Функция-проверка возвращает в разных ветках Истина и Неопределено — условия ведут себя непредсказуемо
04
Отсутствие скобок в выражениях с И и ИЛИ — логика меняется из-за приоритета операторов

Практический порядок написания надёжных условий

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

Порядок действий
  1. 1
    Объявите переменную и сразу присвойте Ложь или Истина — без Неопределено
  2. 2
    В условиях сначала проверьте заполненность ссылки или значения, затем обращайтесь к реквизитам
  3. 3
    Сгруппируйте условия скобками, особенно при смешении И и ИЛИ
  4. 4
    В запросах с соединениями оберните булевы поля в ЕСТЬNULL(Поле, ЛОЖЬ)
  5. 5
    Проверьте логику на трёх наборах данных: заполненном, пустом и частично заполненном
Контрольные точки

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

Значение переменной в отладчике
Норма

Тип Булево, значение Истина или Ложь

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

Неопределено, строка или число

Результат запроса с соединением
Норма

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

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

Часть строк пропала, в поле NULL

Условие в коде
Норма

Ветки Тогда и Иначе срабатывают на тестовых данных

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

Условие всегда ложно или всегда истинно

Если признак со временем обрастает состояниями («не задано», «в обработке», «отклонено»), не растягивайте Булево — переводите реквизит на перечисление заранее. Миграция булева реквизита с уже накопленными данными обходится заметно дороже, чем своевременная смена типа.
ПЗ
Практическое замечание

Итог

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

Итог

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

Булево — это Истина или Ложь, и ничего больше. NULL и Неопределено — отдельные сущности, которые требуют явной обработки. Явная инициализация, скобки в условиях и ЕСТЬNULL в запросах устраняют большинство проблем.

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

Чем Истина отличается от числа 1 в 1С?

В 1С нет автоматической эквивалентности между Булево и числами. Истина — это логическое значение, а 1 — число; прямое сравнение «Истина = 1» вернёт Ложь. Если данные приходят из внешнего источника в виде 0/1, преобразуйте их явно, например через условие «Флаг = (Код = 1)».

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

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

Почему условие «НЕ Поле» в запросе не отбирает часть строк?

Скорее всего, в поле присутствует NULL из-за левого соединения. Отрицание NULL даёт NULL, а не ИСТИНА, поэтому такие строки выпадают из результата. Оберните поле в ЕСТЬNULL(Поле, ЛОЖЬ) или отфильтруйте NULL отдельным условием.

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

Нет, реквизит типа Булево хранит только Истина или Ложь. Если нужно третье состояние, используйте перечисление или составной тип с возможностью Неопределено, но учтите, что отборы и условия станут сложнее.

Что вернёт сравнение Неопределено = Ложь?

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

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

Достаточно «Если Флаг Тогда» — это короче и считается хорошим стилем. Сравнение с Истина не добавляет смысла, а при чтении кода создаёт лишний шаблонный шум. Для обратной проверки используйте «Если НЕ Флаг Тогда».