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