Тип Булево в языке 1С: как устроен и где применяется
Содержание
Булево — это примитивный тип данных в 1С с двумя значениями: Истина и Ложь. Больше ничего в нём нет: ни «пусто», ни «может быть». Любой флажок в карточке документа, любое условие в Если и любой фильтр в запросе под капотом оперируют именно булевым значением.
Разберём, как получить булево, как с ним работают логические операции И, ИЛИ, НЕ, чем оно отличается от числа и строки, как вести себя с ним в языке запросов и на каких мелочах чаще всего спотыкаются начинающие.
Что такое булево и какие у него значения
Булево (от англ. boolean — логический) хранит ответ на вопрос «да или нет». Возможных состояний ровно два:
- ✅
Истина— условие выполнено, флаг взведён; - ❌
Ложь— условие не выполнено, флаг снят.
В синтакс-помощнике этот тип так и называется — Булево. Проверить тип значения можно функцией ТипЗнч:
Перем = Истина;
Сообщить(ТипЗнч(Перем) = Тип("Булево")); // Истина
У булева нет промежуточного состояния. Если переменной не присвоили значение, она хранит Неопределено, а не Ложь — это разные вещи, и дальше мы увидим, к каким ошибкам это приводит в запросах.
Реквизит объекта метаданных с типом Булево ведёт себя иначе: у него всегда есть значение. Если пользователь ничего не трогал, реквизит равен Ложь, а не пустому значению.
Как получить булево значение
Булево в коде появляется тремя путями.
1. Литералом — прямо пишем ключевое слово.
Проведен = Истина;
НужноПроводить = Ложь;
2. Как результат сравнения. Любая операция сравнения (=, <>, >, <, >=, <=) возвращает булево:
ЕстьОстаток = Остаток > 0; // Истина или Ложь
СуммаНулевая = Сумма = 0; // Истина или Ложь
Это удобнее, чем писать условие внутри Если. Переменную ЕстьОстаток можно передавать дальше, логировать, использовать в других условиях.
3. Из реквизита или флажка на форме. Реквизит типа Булево на форме отображается флажком (галочкой). Снятая галочка — это Ложь, установленная — Истина.
Чтобы завести такой реквизит у документа или справочника, в конфигураторе откройте объект метаданных, добавьте реквизит и в свойстве Тип выберите Булево. На форме он автоматически станет флажком.
Плюс четвёртый путь — встроенные функции. Многие методы платформы возвращают булево, и их результат можно сразу класть в переменную или условие:
ЗначениеЗаполнено(Реквизит)—Истина, если значение не пустое;ПустаяСтрока(Строка)—Истина, если строка пустая или состоит из пробелов;- методы поиска в коллекциях и многие проверки объектов тоже отдают булево.
Если ЗначениеЗаполнено(Объект.Контрагент) И НЕ ПустаяСтрока(Объект.Комментарий) Тогда
// оба условия — булевы результаты функций
КонецЕсли;
Чем булево отличается от числа и строки
Частая путаница у тех, кто пришёл из других языков: там логическое часто приравнивают к числу (0 и 1) или к строке («да»/«нет»). В 1С так нельзя — это строгие разные типы.
| Тип | Значения | Пример |
|---|---|---|
Булево | Истина, Ложь | Проведен = Истина |
Число | любое число | Количество = 5 |
Строка | текст | Статус = "Оплачен" |
Главные отличия на практике:
- Булево нельзя напрямую сложить с числом или подставить в арифметику. Выражение
Истина + 1вызовет ошибку несоответствия типов. - Нельзя сравнить булево со строкой
"Да"— это всегда вернётЛожь, а не ошибку, что ещё коварнее. - Если нужно число из булева, преобразуйте явно через
?():
ЧислоФлага = ?(Проведен, 1, 0); // 1 если Истина, иначе 0
Обратно — из числа в булево — тоже через условие: ?(Количество > 0, Истина, Ложь) или короче Количество > 0.
Логические операции: И, ИЛИ, НЕ
Над булевыми значениями работают три операции встроенного языка.
НЕ— отрицание.НЕ ИстинадаётЛожь.И— конъюнкция. Истинно, только если истинны оба операнда.ИЛИ— дизъюнкция. Истинно, если истинен хотя бы один.
Таблица результатов для И и ИЛИ:
| A | B | A И B | A ИЛИ B |
|---|---|---|---|
| Истина | Истина | Истина | Истина |
| Истина | Ложь | Ложь | Истина |
| Ложь | Истина | Ложь | Истина |
| Ложь | Ложь | Ложь | Ложь |
Порядок вычисления. Приоритет такой: сначала НЕ, затем И, затем ИЛИ. Чтобы не держать это в голове и не ловить ошибки, расставляйте скобки:
Если (Проведен И Сумма > 0) ИЛИ Ручная Тогда
// ...
КонецЕсли;
Ленивое вычисление. 1С вычисляет логическое выражение слева направо и останавливается, как только результат ясен. Если левый операнд И уже Ложь, правый не вычисляется вовсе; для ИЛИ — наоборот, при Истина слева. Это позволяет безопасно писать проверки по цепочке:
Если Значение <> Неопределено И Значение.Проведен Тогда
// обращение к .Проведен не упадёт, если слева Неопределено
КонецЕсли;
Поменяете операнды местами — Значение.Проведен И Значение <> Неопределено — и при Неопределено получите ошибку обращения к свойству. Порядок в выражении с ленивым вычислением имеет значение.
Булево в языке запросов 1С
В запросах булево встречается постоянно: реквизиты-флаги (ПометкаУдаления, Проведен, Услуга) имеют именно этот тип. В тексте запроса литералы пишутся заглавными — ИСТИНА и ЛОЖЬ.
Фильтр по булеву полю. Писать = ИСТИНА необязательно — поле типа Булево само является условием:
ВЫБРАТЬ
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И Номенклатура.Услуга = ЛОЖЬ
Строка НЕ Номенклатура.ПометкаУдаления оставит только непомеченные элементы. Это читается как обычное предложение и короче, чем ПометкаУдаления = ЛОЖЬ.
Получить булево в результате. Конструкция ВЫБОР возвращает ИСТИНА или ЛОЖЬ по условию:
ВЫБРАТЬ
Товары.Номенклатура,
ВЫБОР
КОГДА Товары.КоличествоОстаток > 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЕстьВНаличии
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Товары
Коварный NULL. Вот где булево в запросе подводит. При левом соединении, если в правой таблице строки нет, поле приходит как NULL — а это не Ложь. Фильтр ГДЕ Таблица.Флаг = ЛОЖЬ такие строки отбросит, хотя вы их ждали.
Лечится оборачиванием в ЕСТЬNULL:
ГДЕ
ЕСТЬNULL(СвязаннаяТаблица.Флаг, ЛОЖЬ) = ЛОЖЬ
Так NULL превращается в Ложь ещё до сравнения, и строка попадает в выборку.
Частые ошибки с булевыми значениями
Соберём то, на чём спотыкаются регулярно — эти ситуации в инструкции выше напрямую не читаются.
Если Флаг Тогда, а отрицание — Если НЕ Флаг Тогда. Сравнение с Истина ничего не добавляет и считается признаком неопытного кода.NULL, а не Ложь. Оборачивайте в ЕСТЬNULL(Поле, ЛОЖЬ) перед сравнением.Неопределено, а не Ложь. Задавайте стартовое значение явно: Флаг = Ложь; в начале процедуры.Неопределено слева от И, чтобы сработало ленивое вычисление: Если Объект <> Неопределено И Объект.Проведен Тогда.?(Флаг, 1, 0) для числа. Сравнение булева со строкой "Да" молча вернёт Ложь — ошибки не будет, но и результата тоже.Где булево применяется на практике
В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) булевыми реквизитами размечено практически всё:
- 🏷️ Служебные флаги документов —
Проведен,ПометкаУдаления. Первый взводит платформа при проведении, второй — при пометке на удаление. - ⚙️ Настройки учёта — флажки вида «Ведётся раздельный учёт НДС», «Применяется УСН». Включённая галочка меняет состав форм и логику проведения.
- 🔎 Признаки элементов справочников —
Услугау номенклатуры,ЭтоГруппау иерархических справочников. - 🧩 Условия в коде — результат любой проверки, флаг «нашли / не нашли», переключатель ветки алгоритма.
- 📋 Отборы в списках и отчётах — пользователь ставит галочку в настройке отбора, и в запрос уходит булево условие.
- 🧮 Условия в системе компоновки данных — в настройках отчёта поля типа
Булеводоступны в отборе со значениями «Да» и «Нет»; для пользователя это тот же флажок, а внутри — всё та же параИстина/Ложь.
Когда реквизит-флаг добавляют в типовую конфигурацию
через расширение, его тоже объявляют с типом Булево — иначе платформа не свяжет его с флажком на форме и не покажет корректно в отборах.
Флажок на управляемой форме: реакция на изменение
Самый частый сценарий работы с булевым в прикладном коде — управление формой по галочке. Включил пользователь флажок — появилось дополнительное поле; снял — спряталось.
Флажок на форме связан с реквизитом типа Булево. Чтобы отреагировать на его переключение, в конфигураторе выделите элемент-флажок, откройте палитру свойств, вкладку События и у события ПриИзменении нажмите на лупу — платформа создаст заготовку обработчика:
&НаКлиенте
Процедура ИспользоватьСкидкуПриИзменении(Элемент)
Элементы.ПроцентСкидки.Доступность = Объект.ИспользоватьСкидку;
Если НЕ Объект.ИспользоватьСкидку Тогда
Объект.ПроцентСкидки = 0;
КонецЕсли;
КонецПроцедуры
Здесь булево значение реквизита ИспользоватьСкидку напрямую подставляется в свойство Доступность соседнего поля — это тоже булево. Когда галочку снимают, поле скидки блокируется и его значение обнуляется.
Тот же приём работает со свойством Видимость:
Элементы.ГруппаДополнительно.Видимость = Объект.РасширенныйРежим;
Начальное состояние нужно задать при открытии формы — в обработчике ПриСозданииНаСервере. Иначе до первого клика поле будет в состоянии по умолчанию из конфигуратора, а не в том, что соответствует сохранённой галочке.
Свойства Доступность и Видимость сами по себе имеют тип Булево, поэтому в них кладут результат любого логического выражения — не только одну галочку, но и целое условие:
Элементы.ПолеСчёт.Видимость = Объект.БезналичныйРасчёт И НЕ Объект.Проведен;
Так одно булево выражение управляет внешним видом формы без лишних Если.
Проверьте, усвоился ли тип:
Частые вопросы
Чем Ложь отличается от Неопределено и NULL?
Ложь — полноценное булево значение «нет». Неопределено — отсутствие значения у переменной или свойства. NULL — пустое значение из базы (появляется в запросах при соединениях). Это три разных типа, и смешивать их нельзя: непроинициализированная переменная равна Неопределено, а поле без данных в запросе — NULL.Можно ли писать литералы True и False вместо Истина и Ложь?
True и False. Но в типовых конфигурациях принято русское написание — придерживайтесь его, чтобы код был единообразным. В языке запросов пишется только ИСТИНА и ЛОЖЬ.Как превратить булево в число или строку?
?(Флаг, 1, 0). В строку — ?(Флаг, "Да", "Нет") или Строка(Флаг), которое вернёт «Да»/«Нет». Автоматического приведения булева к числу в 1С нет.Нужно ли в запросе писать `Поле = ИСТИНА`?
Булево само по себе логическое условие: ГДЕ Документ.Проведен отберёт проведённые. Сравнение с ИСТИНА допустимо, но избыточно; для отрицания используйте НЕ.Почему условие с обращением к свойству иногда падает, а иногда нет?
И стоит проверка на Неопределено и она ложна, правая часть с обращением к свойству не выполнится. Поменяйте операнды местами — и получите ошибку.