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

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

Что такое значение типа Булево в 1С

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

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

Тип используется повсюду: в условиях Если ... Тогда, в реквизитах справочников и документов-флажках, в отборах динамических списков, в запросах и при настройке прав доступа. Практически ни один алгоритм на встроенном языке 1С не обходится без проверки булева условия.

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

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

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

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

Булево в условиях и логических операциях

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

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

bsl
Если ДокументПроведен И НЕ ПометкаУдаления Тогда
    Сообщить("Документ доступен для обработки");
ИначеЕсли ПометкаУдаления Тогда
    Сообщить("Документ помечен на удаление");
КонецЕсли;

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

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

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

После добавления реквизита поместите его на форму: на форме он отобразится как флажок (поле вида «Поле флажка»). Пользователь сможет переключать его одним кликом, а код сможет читать и изменять значение программно.

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

При добавлении булева реквизита в существующий объект с данными платформа заполнит старые записи значением по умолчанию — Ложь. Если бизнес-логика требует Истина для уже существующих элементов, потребуется отдельная обработка заполнения, иначе отборы и условия начнут работать не так, как ожидалось.

Булево в запросах и отборах

В языке запросов 1С булевы значения участвуют в условиях ГДЕ и в конструкции ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ. Сравнение с литералом выполняется через параметр или через ключевые слова ИСТИНА и ЛОЖЬ, которые доступны прямо в тексте запроса.

Типичная конструкция отбора выглядит так: ГДЕ НЕ Номенклатура.ПометкаУдаления. Пометка удаления — системный булев реквизит, поэтому сравнение с Истина можно опустить. Такой отбор работает быстрее и читается проще, чем ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.ЭтоГруппа = ЛОЖЬ";

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

Преобразование типов и частые ошибки

Платформа не выполняет автоматическое преобразование строки "Истина" в булево значение в большинстве контекстов. Явное преобразование числа к булеву тоже не предусмотрено штатными средствами языка — в отличие от некоторых других языков, где 0 трактуется как Ложь. В 1С сравнение Если 1 Тогда вызовет ошибку исполнения.

Обратная ситуация — получение числового представления — решается через тернарную логику: ?(Флаг, 1, 0). Это нужно, например, при выгрузке данных в форматы, где логическое поле хранится как число.

Типичные ошибки
01
Сравнение булева значения со строкой "Истина" — условие никогда не выполняется или падает с ошибкой несоответствия типов
02
Написание Если Флаг = Истина Тогда — работает, но считается избыточным и затрудняет чтение
03
Использование числа 1 или 0 в условии Если — вызывает ошибку исполнения, так как автоматического преобразования нет
04
Забытые скобки в условии с И и ИЛИ — логика вычисляется не так, как задумано
05
Ожидание, что старые записи получат Истина после добавления реквизита — по умолчанию они получают Ложь

Отдельного внимания заслуживает значение Неопределено: оно не равно ни Истина, ни Ложь. Если реквизит составного типа содержит Неопределено, проверка Если Реквизит = Истина вернёт Ложь, но и Если Реквизит = Ложь тоже вернёт Ложь. Составные реквизиты с булевым типом лучше проверять через ТипЗнч() перед использованием.

Как хранится Булево в базе данных

На уровне СУБД булево значение обычно хранится как однобайтовое число: 0 соответствует Ложь, 1 — Истина. Точное физическое представление зависит от используемой СУБД (MS SQL Server, PostgreSQL, Oracle или файловый вариант), но разработчику конфигурации эти детали обычно не требуются — платформа выполняет преобразование прозрачно.

Знание о числовом хранении полезно в двух случаях: при чтении данных напрямую из базы внешними инструментами (что само по себе не рекомендуется без понимания структуры) и при обмене данными, где логическое поле на стороне приёмника может ожидать 0/1 или строковые "true"/"false".

Когда использовать Булево, а когда — альтернативы

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

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

Булево

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

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

Несколько именованных состояний с возможностью расширения. Требует больше кода в простых проверках

Число или строка

Только при обмене с внешними системами, где логического типа нет. Внутри конфигурации так делать не стоит

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

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

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

Отображение на форме
Норма

Реквизит показан флажком и переключается одним кликом

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

Поле ввода со строкой или флажок недоступен

Работа условия в коде
Норма

Ветка Если выполняется при Истина, иначе срабатывает Иначе

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

Ошибка исполнения или условие не срабатывает ни в одном случае

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

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

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

Пустой результат или лишние записи со старыми данными

Старые записи после добавления реквизита
Норма

Значения заполнены осознанно (обработкой или вручную)

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

Все старые записи получили Ложь и ломают логику отчётов

Для отладки булевых значений удобно использовать точку останова и окно «Вычислить выражение» в конфигураторе: там видно и значение, и его тип. Это быстрее, чем вывод через Сообщить(), и не требует изменения кода.

Итог

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

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

Частые вопросы о типе Булево в 1С

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

Это разные типы данных. Число 1 нельзя подставить в условие Если — будет ошибка исполнения, потому что 1С не преобразует числа в логические значения автоматически. Для перевода используйте выражение вида ?(Флаг, 1, 0) или явное сравнение.

Можно ли присвоить булеву реквизиту значение Неопределено?

Если реквизит имеет только тип Булево — нет, платформа приведёт значение к Ложь. Неопределено возможно, когда тип составной и в него включены другие варианты. Такие реквизиты перед использованием в условиях стоит проверять через ТипЗнч().

Почему после добавления булева реквизита отчёт перестал показывать старые данные?

Существующие записи получили значение по умолчанию — Ложь. Если отбор в отчёте требует Истина, старые записи отфильтровываются. Решение — написать обработку, которая проставит нужное значение в существующих объектах.

Как правильно писать условие: «Если Флаг» или «Если Флаг = Истина»?

Оба варианта работают одинаково, но первый короче и соответствует принятому стилю кодирования на встроенном языке. Сравнение с Истина добавляет шума без пользы и обычно помечается при проверках стандартов разработки.

Как в запросе вывести «Да»/«Нет» вместо Истина/Ложь?

Используйте конструкцию ВЫБОР КОГДА Поле ТОГДА "Да" ИНАЧЕ "Нет" КОНЕЦ. В схеме компоновки данных аналогичный результат даёт настройка оформления поля на вкладке «Наборы данных» или вычисляемое поле.

Когда булева реквизита недостаточно и нужен другой тип?

Когда число состояний может вырасти: сегодня «да/нет», завтра — «да/нет/частично». В этом случае сразу закладывайте перечисление. Миграция с булева на перечисление позже потребует обработки всех сохранённых данных и переписывания условий в коде.