Тип Булево в языке 1С: как устроен и где применяется

· 9 мин

Содержание

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

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

Что такое булево и какие у него значения

Булево (от англ. boolean — логический) хранит ответ на вопрос «да или нет». Возможных состояний ровно два:

  • ✅ Истина — условие выполнено, флаг взведён;
  • ❌ Ложь — условие не выполнено, флаг снят.

В синтакс-помощнике этот тип так и называется — Булево. Проверить тип значения можно функцией ТипЗнч:

Перем = Истина;
Сообщить(ТипЗнч(Перем) = Тип("Булево")); // Истина

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

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

Как получить булево значение

Булево в коде появляется тремя путями.

1. Литералом — прямо пишем ключевое слово.

Проведен = Истина;
НужноПроводить = Ложь;

2. Как результат сравнения. Любая операция сравнения (=, <>, >, <, >=, <=) возвращает булево:

ЕстьОстаток = Остаток > 0;     // Истина или Ложь
СуммаНулевая = Сумма = 0;        // Истина или Ложь

Это удобнее, чем писать условие внутри Если. Переменную ЕстьОстаток можно передавать дальше, логировать, использовать в других условиях.

3. Из реквизита или флажка на форме. Реквизит типа Булево на форме отображается флажком (галочкой). Снятая галочка — это Ложь, установленная — Истина.

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

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

  • ЗначениеЗаполнено(Реквизит) — Истина, если значение не пустое;
  • ПустаяСтрока(Строка) — Истина, если строка пустая или состоит из пробелов;
  • методы поиска в коллекциях и многие проверки объектов тоже отдают булево.
Если ЗначениеЗаполнено(Объект.Контрагент) И НЕ ПустаяСтрока(Объект.Комментарий) Тогда
    // оба условия — булевы результаты функций
КонецЕсли;

Чем булево отличается от числа и строки

Частая путаница у тех, кто пришёл из других языков: там логическое часто приравнивают к числу (0 и 1) или к строке («да»/«нет»). В 1С так нельзя — это строгие разные типы.

ТипЗначенияПример
БулевоИстина, ЛожьПроведен = Истина
Числолюбое числоКоличество = 5
СтрокатекстСтатус = "Оплачен"

Главные отличия на практике:

  • Булево нельзя напрямую сложить с числом или подставить в арифметику. Выражение Истина + 1 вызовет ошибку несоответствия типов.
  • Нельзя сравнить булево со строкой "Да" — это всегда вернёт Ложь, а не ошибку, что ещё коварнее.
  • Если нужно число из булева, преобразуйте явно через ?():
ЧислоФлага = ?(Проведен, 1, 0); // 1 если Истина, иначе 0

Обратно — из числа в булево — тоже через условие: ?(Количество > 0, Истина, Ложь) или короче Количество > 0.

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

Над булевыми значениями работают три операции встроенного языка.

  • НЕ — отрицание. НЕ Истина даёт Ложь.
  • И — конъюнкция. Истинно, только если истинны оба операнда.
  • ИЛИ — дизъюнкция. Истинно, если истинен хотя бы один.

Таблица результатов для И и ИЛИ:

ABA И BA ИЛИ B
ИстинаИстинаИстинаИстина
ИстинаЛожьЛожьИстина
ЛожьИстинаЛожьИстина
ЛожьЛожьЛожьЛожь

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

Если (Проведен И Сумма > 0) ИЛИ Ручная Тогда
    // ...
КонецЕсли;

Ленивое вычисление. 1С вычисляет логическое выражение слева направо и останавливается, как только результат ясен. Если левый операнд И уже Ложь, правый не вычисляется вовсе; для ИЛИ — наоборот, при Истина слева. Это позволяет безопасно писать проверки по цепочке:

Если Значение <> Неопределено И Значение.Проведен Тогда
    // обращение к .Проведен не упадёт, если слева Неопределено
КонецЕсли;

Поменяете операнды местами — Значение.Проведен И Значение <> Неопределено — и при Неопределено получите ошибку обращения к свойству. Порядок в выражении с ленивым вычислением имеет значение.

Булево в языке запросов 1С

В запросах булево встречается постоянно: реквизиты-флаги (ПометкаУдаления, Проведен, Услуга) имеют именно этот тип. В тексте запроса литералы пишутся заглавными — ИСТИНА и ЛОЖЬ.

Фильтр по булеву полю. Писать = ИСТИНА необязательно — поле типа Булево само является условием:

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

Строка НЕ Номенклатура.ПометкаУдаления оставит только непомеченные элементы. Это читается как обычное предложение и короче, чем ПометкаУдаления = ЛОЖЬ.

Получить булево в результате. Конструкция ВЫБОР возвращает ИСТИНА или ЛОЖЬ по условию:

ВЫБРАТЬ
    Товары.Номенклатура,
    ВЫБОР
        КОГДА Товары.КоличествоОстаток > 0
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЕстьВНаличии
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК Товары

Коварный NULL. Вот где булево в запросе подводит. При левом соединении, если в правой таблице строки нет, поле приходит как NULL — а это не Ложь. Фильтр ГДЕ Таблица.Флаг = ЛОЖЬ такие строки отбросит, хотя вы их ждали.

Лечится оборачиванием в ЕСТЬNULL:

ГДЕ
    ЕСТЬNULL(СвязаннаяТаблица.Флаг, ЛОЖЬ) = ЛОЖЬ

Так NULL превращается в Ложь ещё до сравнения, и строка попадает в выборку.

Частые ошибки с булевыми значениями

Соберём то, на чём спотыкаются регулярно — эти ситуации в инструкции выше напрямую не читаются.

Диагностика: выберите симптом

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

В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) булевыми реквизитами размечено практически всё:

  • 🏷️ Служебные флаги документов — Проведен, ПометкаУдаления. Первый взводит платформа при проведении, второй — при пометке на удаление.
  • ⚙️ Настройки учёта — флажки вида «Ведётся раздельный учёт НДС», «Применяется УСН». Включённая галочка меняет состав форм и логику проведения.
  • 🔎 Признаки элементов справочников — Услуга у номенклатуры, ЭтоГруппа у иерархических справочников.
  • 🧩 Условия в коде — результат любой проверки, флаг «нашли / не нашли», переключатель ветки алгоритма.
  • 📋 Отборы в списках и отчётах — пользователь ставит галочку в настройке отбора, и в запрос уходит булево условие.
  • 🧮 Условия в системе компоновки данных — в настройках отчёта поля типа Булево доступны в отборе со значениями «Да» и «Нет»; для пользователя это тот же флажок, а внутри — всё та же пара Истина/Ложь.

Когда реквизит-флаг добавляют в типовую конфигурацию через расширение, его тоже объявляют с типом Булево — иначе платформа не свяжет его с флажком на форме и не покажет корректно в отборах.

Флажок на управляемой форме: реакция на изменение

Самый частый сценарий работы с булевым в прикладном коде — управление формой по галочке. Включил пользователь флажок — появилось дополнительное поле; снял — спряталось.

Флажок на форме связан с реквизитом типа Булево. Чтобы отреагировать на его переключение, в конфигураторе выделите элемент-флажок, откройте палитру свойств, вкладку События и у события ПриИзменении нажмите на лупу — платформа создаст заготовку обработчика:

&НаКлиенте
Процедура ИспользоватьСкидкуПриИзменении(Элемент)
    Элементы.ПроцентСкидки.Доступность = Объект.ИспользоватьСкидку;
    Если НЕ Объект.ИспользоватьСкидку Тогда
        Объект.ПроцентСкидки = 0;
    КонецЕсли;
КонецПроцедуры

Здесь булево значение реквизита ИспользоватьСкидку напрямую подставляется в свойство Доступность соседнего поля — это тоже булево. Когда галочку снимают, поле скидки блокируется и его значение обнуляется.

Тот же приём работает со свойством Видимость:

Элементы.ГруппаДополнительно.Видимость = Объект.РасширенныйРежим;

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

Свойства Доступность и Видимость сами по себе имеют тип Булево, поэтому в них кладут результат любого логического выражения — не только одну галочку, но и целое условие:

Элементы.ПолеСчёт.Видимость = Объект.БезналичныйРасчёт И НЕ Объект.Проведен;

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

Проверьте, усвоился ли тип:

Проверьте себя
Сколько значений может принимать тип Булево в 1С?
Как короче записать условие «если флаг снят»?
Что вернёт поле типа Булево из правой таблицы левого соединения, если строки нет?
Какая операция вычисляется первой при отсутствии скобок?

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

Чем Ложь отличается от Неопределено и NULL?
Ложь — полноценное булево значение «нет». Неопределено — отсутствие значения у переменной или свойства. NULL — пустое значение из базы (появляется в запросах при соединениях). Это три разных типа, и смешивать их нельзя: непроинициализированная переменная равна Неопределено, а поле без данных в запросе — NULL.
Можно ли писать литералы True и False вместо Истина и Ложь?
Во встроенном языке работают английские синонимы True и False. Но в типовых конфигурациях принято русское написание — придерживайтесь его, чтобы код был единообразным. В языке запросов пишется только ИСТИНА и ЛОЖЬ.
Как превратить булево в число или строку?
В число — через условие: ?(Флаг, 1, 0). В строку — ?(Флаг, "Да", "Нет") или Строка(Флаг), которое вернёт «Да»/«Нет». Автоматического приведения булева к числу в 1С нет.
Нужно ли в запросе писать `Поле = ИСТИНА`?
Нет. Поле типа Булево само по себе логическое условие: ГДЕ Документ.Проведен отберёт проведённые. Сравнение с ИСТИНА допустимо, но избыточно; для отрицания используйте НЕ.
Почему условие с обращением к свойству иногда падает, а иногда нет?
Из-за ленивого вычисления. 1С считает выражение слева направо и бросает вычисление, как только ясен результат. Если слева от И стоит проверка на Неопределено и она ложна, правая часть с обращением к свойству не выполнится. Поменяйте операнды местами — и получите ошибку.