Разработка и Конфигурация · 10 мин
Что такое значение типа Булево в 1С
Что такое значение типа Булево в 1С: Истина и Ложь, применение в условиях, реквизитах и запросах. Примеры кода, типичные ошибки и проверка результата.
Булево — это один из примитивных (встроенных) типов данных в платформе 1С:Предприятие. Значение этого типа может принимать только два состояния: Истина или Ложь. Никаких промежуточных вариантов у булева значения не существует — это принципиальное отличие от чисел, строк и дат.
Тип используется повсюду: в условиях Если ... Тогда, в реквизитах справочников и документов-флажках, в отборах динамических списков, в запросах и при настройке прав доступа. Практически ни один алгоритм на встроенном языке 1С не обходится без проверки булева условия.
Название типа происходит от алгебры логики Джорджа Буля, поэтому значения Истина/Ложь часто называют логическими. В английской локализации встроенного языка те же литералы записываются как True и False — семантика при этом полностью идентична.
Как устроен тип Булево и какие значения он принимает
Встроенный язык 1С определяет два литерала булева типа: Истина и Ложь. Они пишутся без кавычек — это не строки. Запись "Истина" в кавычках создаст строку, и сравнение строки с булевым значением даст неожиданный результат или ошибку преобразования.
Проверить тип значения можно функцией ТипЗнч() в сочетании с Тип("Булево"). Это полезно, когда реквизит составного типа и нужно убедиться, что в него попало именно логическое значение, а не число или строка.
Булево в условиях и логических операциях
Основное применение типа — оператор Если. Внутри условия допустимо писать само булево значение без лишнего сравнения: конструкция Если Флаг Тогда корректна и предпочтительнее, чем Если Флаг = Истина Тогда. Второй вариант работает, но считается избыточным стилем.
Булевы значения комбинируются логическими операторами: И, ИЛИ, НЕ. Оператор НЕ инвертирует значение: НЕ Истина даёт Ложь. Оператор И возвращает Истина только когда оба операнда истинны, ИЛИ — когда истинен хотя бы один.
Если ДокументПроведен И НЕ ПометкаУдаления Тогда
Сообщить("Документ доступен для обработки");
ИначеЕсли ПометкаУдаления Тогда
Сообщить("Документ помечен на удаление");
КонецЕсли;Важно помнить о приоритете операторов: НЕ выполняется первым, затем И, затем ИЛИ. В сложных условиях безопаснее расставлять скобки явно — это исключает ошибки интерпретации и упрощает чтение кода коллегами.
Как создать реквизит типа Булево в конфигураторе
Чтобы добавить логический флажок в объект конфигурации, откройте нужный справочник, документ или обработку, перейдите на вкладку «Данные» и добавьте реквизит. В свойстве «Тип» выберите «Булево». Длина и точность для этого типа не задаются — платформа хранит значение сама.
После добавления реквизита поместите его на форму: на форме он отобразится как флажок (поле вида «Поле флажка»). Пользователь сможет переключать его одним кликом, а код сможет читать и изменять значение программно.
- 1Откройте объект метаданных в конфигураторе и перейдите на вкладку «Данные»
- 2Добавьте реквизит, задайте имя без пробелов, например «Активен»
- 3В свойстве «Тип» выберите «Булево»
- 4Перетащите реквизит на форму и проверьте, что элемент отображается как флажок
- 5Обновите конфигурацию базы данных и проверьте работу в режиме предприятия
При добавлении булева реквизита в существующий объект с данными платформа заполнит старые записи значением по умолчанию — Ложь. Если бизнес-логика требует Истина для уже существующих элементов, потребуется отдельная обработка заполнения, иначе отборы и условия начнут работать не так, как ожидалось.
Булево в запросах и отборах
В языке запросов 1С булевы значения участвуют в условиях ГДЕ и в конструкции ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ. Сравнение с литералом выполняется через параметр или через ключевые слова ИСТИНА и ЛОЖЬ, которые доступны прямо в тексте запроса.
Типичная конструкция отбора выглядит так: ГДЕ НЕ Номенклатура.ПометкаУдаления. Пометка удаления — системный булев реквизит, поэтому сравнение с Истина можно опустить. Такой отбор работает быстрее и читается проще, чем ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.ЭтоГруппа = ЛОЖЬ";В динамических списках и СКД булевы поля используются в отборах так же, как любые другие: пользователь выбирает «Да» или «Нет», а компоновка преобразует это в условие запроса. Если флажок в отборе не заполнен, условие просто не применяется.
Преобразование типов и частые ошибки
Платформа не выполняет автоматическое преобразование строки "Истина" в булево значение в большинстве контекстов. Явное преобразование числа к булеву тоже не предусмотрено штатными средствами языка — в отличие от некоторых других языков, где 0 трактуется как Ложь. В 1С сравнение Если 1 Тогда вызовет ошибку исполнения.
Обратная ситуация — получение числового представления — решается через тернарную логику: ?(Флаг, 1, 0). Это нужно, например, при выгрузке данных в форматы, где логическое поле хранится как число.
Отдельного внимания заслуживает значение Неопределено: оно не равно ни Истина, ни Ложь. Если реквизит составного типа содержит Неопределено, проверка Если Реквизит = Истина вернёт Ложь, но и Если Реквизит = Ложь тоже вернёт Ложь. Составные реквизиты с булевым типом лучше проверять через ТипЗнч() перед использованием.
Как хранится Булево в базе данных
На уровне СУБД булево значение обычно хранится как однобайтовое число: 0 соответствует Ложь, 1 — Истина. Точное физическое представление зависит от используемой СУБД (MS SQL Server, PostgreSQL, Oracle или файловый вариант), но разработчику конфигурации эти детали обычно не требуются — платформа выполняет преобразование прозрачно.
Знание о числовом хранении полезно в двух случаях: при чтении данных напрямую из базы внешними инструментами (что само по себе не рекомендуется без понимания структуры) и при обмене данными, где логическое поле на стороне приёмника может ожидать 0/1 или строковые "true"/"false".
Когда использовать Булево, а когда — альтернативы
Булево подходит, когда у сущности ровно два взаимоисключающих состояния и третьего не появится: «Активен/Неактивен», «Включено/Выключено». Если состояний может стать больше двух — например, статус «Новый / В работе / Завершён» — правильнее использовать перечисление: расширение перечисления новым значением не ломает существующие данные, а добавление третьего смысла в булево невозможно в принципе.
Сравнение вариантов
Два устойчивых состояния, простые отборы и флажки. Ограничение: третье состояние добавить нельзя
Несколько именованных состояний с возможностью расширения. Требует больше кода в простых проверках
Только при обмене с внешними системами, где логического типа нет. Внутри конфигурации так делать не стоит
Признак хорошего решения — имя реквизита звучит как утверждение: «ЕстьДоставка», «ОплатаПолучена», «Архивный». Тогда чтение кода Если ОплатаПолучена Тогда самодокументируется, а вероятность перепутать смысл Истина/Ложь минимальна.
Как проверить результат
Реквизит показан флажком и переключается одним кликом
Поле ввода со строкой или флажок недоступен
Ветка Если выполняется при Истина, иначе срабатывает Иначе
Ошибка исполнения или условие не срабатывает ни в одном случае
В результат попадают только записи с нужным значением флага
Пустой результат или лишние записи со старыми данными
Значения заполнены осознанно (обработкой или вручную)
Все старые записи получили Ложь и ломают логику отчётов
Для отладки булевых значений удобно использовать точку останова и окно «Вычислить выражение» в конфигураторе: там видно и значение, и его тип. Это быстрее, чем вывод через Сообщить(), и не требует изменения кода.
Что важно запомнить
Булево — тип с двумя значениями: Истина и Ложь. Используйте его для условий, флажков и отборов, не сравнивайте со строками и числами, помните про значение по умолчанию Ложь у старых записей и выбирайте перечисление, если состояний может стать больше двух.
Частые вопросы о типе Булево в 1С
Чем Булево отличается от числа 0 и 1?
Это разные типы данных. Число 1 нельзя подставить в условие Если — будет ошибка исполнения, потому что 1С не преобразует числа в логические значения автоматически. Для перевода используйте выражение вида ?(Флаг, 1, 0) или явное сравнение.
Можно ли присвоить булеву реквизиту значение Неопределено?
Если реквизит имеет только тип Булево — нет, платформа приведёт значение к Ложь. Неопределено возможно, когда тип составной и в него включены другие варианты. Такие реквизиты перед использованием в условиях стоит проверять через ТипЗнч().
Почему после добавления булева реквизита отчёт перестал показывать старые данные?
Существующие записи получили значение по умолчанию — Ложь. Если отбор в отчёте требует Истина, старые записи отфильтровываются. Решение — написать обработку, которая проставит нужное значение в существующих объектах.
Как правильно писать условие: «Если Флаг» или «Если Флаг = Истина»?
Оба варианта работают одинаково, но первый короче и соответствует принятому стилю кодирования на встроенном языке. Сравнение с Истина добавляет шума без пользы и обычно помечается при проверках стандартов разработки.
Как в запросе вывести «Да»/«Нет» вместо Истина/Ложь?
Используйте конструкцию ВЫБОР КОГДА Поле ТОГДА "Да" ИНАЧЕ "Нет" КОНЕЦ. В схеме компоновки данных аналогичный результат даёт настройка оформления поля на вкладке «Наборы данных» или вычисляемое поле.
Когда булева реквизита недостаточно и нужен другой тип?
Когда число состояний может вырасти: сегодня «да/нет», завтра — «да/нет/частично». В этом случае сразу закладывайте перечисление. Миграция с булева на перечисление позже потребует обработки всех сохранённых данных и переписывания условий в коде.