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

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

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

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

Булево в 1С — это примитивный тип данных, который может принимать только два значения: Истина или Ложь. Он соответствует классическому логическому (boolean) типу из других языков программирования и используется везде, где нужен ответ «да/нет»: признак активности элемента справочника, флаг проведения документа, условие в запросе, видимость элемента формы.

Тип Булево встроен в платформу 1С:Предприятие и доступен на любом уровне: в конфигураторе при описании реквизитов, во встроенном языке, в запросах и в СКД. Понимание того, как 1С хранит, сравнивает и преобразует логические значения, избавляет от целого класса ошибок — от «пустых» условий в запросах до неверного отбора в отчётах.

Ниже разобрано, как объявить булев реквизит, какие операции допустимы, как тип ведёт себя в запросах и чем Булево отличается от похожих конструкций вроде перечислений и чисел 0/1.

Что представляет собой тип Булево

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

ФлагАктивен = Истина;

Если ФлагАктивен Тогда

Сообщить("Элемент активен");

КонецЕсли;

Третьего состояния у Булево нет. Значение Неопределено или NULL — это не булевы значения, а отдельные специальные значения платформы. Попытка сравнить Булево с NULL в запросе или присвоить Неопределено реквизиту типа Булево приводит к ошибкам или неочевидному поведению, поэтому инициализировать переменные лучше явно.

Как создать булев реквизит в конфигураторе

Чтобы добавить логическое поле в справочник, документ или регистр, откройте объект в конфигураторе, перейдите на вкладку «Данные» и добавьте реквизит. В свойстве «Тип» выберите «Булево» — составной тип здесь обычно не нужен, потому что Булево самодостаточно.

На форме булев реквизит по умолчанию отображается как флажок (checkbox). Это удобно: пользователь одним кликом переключает значение между Истина и Ложь. При желании вид элемента можно изменить на поле переключателя, но флажок — стандартное и самое понятное решение.

Порядок действий
  1. 1
    Откройте объект конфигурации (справочник, документ) в конфигураторе
  2. 2
    На вкладке «Данные» добавьте новый реквизит и задайте имя, например «НеИспользовать»
  3. 3
    В свойстве «Тип» выберите «Булево» и сохраните конфигурацию
  4. 4
    Перетащите реквизит на форму — платформа создаст флажок автоматически
  5. 5
    Запустите базу в режиме предприятия и проверьте, что значение сохраняется после записи объекта

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

Логические операции и условия в коде

С булевыми значениями работают три базовых оператора: И, ИЛИ, НЕ. Их поведение соответствует классической логике: И даёт Истина, только если оба операнда истинны; ИЛИ — если истинен хотя бы один; НЕ инвертирует значение.

Если ЗначениеЗаполнено(Контрагент) И НЕ Контрагент.ЭтоГруппа Тогда

// работаем с конкретным контрагентом

КонецЕсли;

Платформа 1С вычисляет оба операнда в логическом выражении — короткой схемы вычислений, как в некоторых языках, нет. Поэтому конструкция вида Если Ссылка <> Неопределено И Ссылка.Реквизит Тогда может вызвать ошибку обращения к свойству, если Ссылка равна Неопределено. Безопаснее разбивать проверку на вложенные условия.

Результат любого сравнения (равно, больше, меньше) также имеет тип Булево. Это позволяет писать компактно: ЭтоВыходной = (ДеньНедели(ТекущаяДата()) > 5); — переменная получит Истина или Ложь без конструкции Если.

Булево в запросах и СКД

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

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.НеИспользовать

ИЗ

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

ГДЕ

НЕ Номенклатура.НеИспользовать

Параметр булева типа передаётся в запрос обычным способом: Запрос.УстановитьПараметр("Флаг", Истина);. В отборах динамических списков и настроек СКД булев реквизит сравнивается с Истина/Ложь напрямую — пользователь видит в отборе поле с флажком или выпадающим списком «Да/Нет».

Особенность запросов: в них действует трёхзначная логика NULL. Если поле соединённой таблицы не найдено, результат будет NULL, а не Ложь, и условие ГДЕ Поле = ЛОЖЬ такую строку отфильтрует. Для полей-соединений используйте ЕСТЬNULL(Поле, ЛОЖЬ).

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

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

Значение булева реквизита после записи объекта
Норма

Сохраняется Истина или Ложь, флажок на форме отражает состояние

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

Значение сбрасывается или не сохраняется — проверьте тип реквизита и обработчики записи

Отбор в запросе по булеву полю
Норма

Возвращаются только строки с нужным значением

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

Пропадают строки из соединённых таблиц — вероятно, NULL, нужен ЕСТЬNULL

Поведение флажка на управляемой форме
Норма

Один клик переключает значение, данные уходят в объект

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

Флажок не связан с данными — проверьте свойство «ПутьКДанным» элемента формы

Преобразование типов и сравнение с другими значениями

1С не выполняет неявного преобразования чисел и строк в Булево в условиях. Конструкция Если 1 Тогда вызовет ошибку — условие обязано быть булевым. Это отличает 1С от языков вроде JavaScript, где «истиноподобными» считаются ненулевые числа и непустые строки.

Для явного преобразования используется функция Булево(): Булево(1) вернёт Истина, Булево(0) — Ложь. Обратное преобразование через Число(Истина) даст 1. Такие приёмы нужны редко — в основном при обмене данными с внешними системами, где логические значения хранятся как 0/1 или строки «true»/«false».

При выгрузке в XML и JSON булево значение сериализуется как true/false. При загрузке из внешних источников строки «Истина»/«Ложь» или «true»/«false» нужно преобразовывать вручную — автоматического распознавания строк нет.

Чем заменить или дополнить Булево

Перечисление (Да/Нет/Неизвестно)

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

Число (0/1)

Используется при интеграции с внешними системами. Ограничение: неочевидно для пользователя, нет автоматического флажка на форме

Булево

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

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

Самая частая ошибка — избыточное сравнение Если Флаг = Истина Тогда. Оно работает, но считается плохим стилем: сама переменная уже булева, дополнительное сравнение ничего не добавляет. Пишите просто Если Флаг Тогда.

Вторая группа ошибок связана с именованием. Реквизит «Активен» со значением по умолчанию Ложь ставит новые элементы в состояние «неактивен», что обычно противоречит ожиданиям. Лучше выбирать отрицательные имена («НеИспользовать», «Архив»), чтобы Ложь по умолчанию означала нормальное рабочее состояние.

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

Типичные ошибки
01
Сравнение «Если Флаг = Истина» вместо «Если Флаг» — лишний код и признак непонимания типа
02
Имя реквизита «Активен» при значении по умолчанию Ложь — новые объекты оказываются «неактивными»
03
Условие в запросе без ЕСТЬNULL по полю соединённой таблицы — строки с NULL теряются из выборки
04
Попытка использовать число в условии «Если 1 Тогда» — ошибка выполнения, 1С требует строго Булево
05
Ожидание короткой схемы вычислений в «И» — оба операнда вычисляются всегда, возможна ошибка обращения к свойству

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

Классические сценарии: признак «Не использовать» в справочниках номенклатуры и контрагентов, флаг «Закрыт» в документах, признак доступности функциональной опции, настройки вроде «Показывать удалённые записи». Во всех этих случаях Булево — самый лёгкий и понятный тип.

Булевы значения широко используются и в программном интерфейсе: функции возвращают Истина/Ложь как признак успеха (НачатьТранзакцию() в связке с проверками, методы проверки заполнения), а свойства форм («Видимость», «Доступность», «ТолькоПросмотр») управляются именно булевыми значениями.

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

Итог

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

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

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

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

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

Можно ли в запросе сравнивать булево поле с параметром?

Да. Передайте параметр через Запрос.УстановитьПараметр("Флаг", Истина) и используйте условие «ГДЕ Поле = &Флаг». Это предпочтительнее встраивания литерала ИСТИНА, если условие отбора зависит от логики программы.

Как сделать, чтобы флажок по умолчанию был установлен?

Для новых объектов задайте значение в обработчике «ПриСозданииНаСервере» или в модуле объекта в «ОбработкаЗаполнения»: Реквизит = Истина. Для уже существующих записей базы потребуется сервисная обработка, которая пройдёт по элементам и проставит нужное значение.

Почему условие «Если Число > 0 И Флаг Тогда» не работает как ожидается?

Чаще всего дело в приоритете операторов или в том, что один из операндов не является булевым. Заключите каждое сравнение в скобки: Если (Число > 0) И Флаг Тогда. Также помните, что оба операнда вычисляются всегда — короткой схемы в 1С нет.

Что вернёт Булево("Истина")?

Функция Булево() преобразует числа (0 — Ложь, остальное — Истина), но строковые литералы «Истина»/«Ложь» она не распознаёт как в языках с динамической типизацией. При загрузке строк из внешних файлов сравнивайте строку явно: Флаг = (СтрокаЗначение = "true").

Когда вместо Булево лучше использовать перечисление?

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