Истина или Ложь: как устроен логический тип данных в 1С:Предприятии
Содержание
Булево в 1С — это тип данных, у которого всего два значения: Истина и Ложь. Простыми словами, это ответ «да» или «нет» на один вопрос: документ проведён? элемент помечен на удаление? сумма больше нуля?
Любой флажок в форме, любое условие Если … Тогда и любой фильтр «Да/Нет» в отчёте работают с этим типом. Пользователь видит его как галочку, программист — как условие, а запрос — как поле, которое может внезапно оказаться NULL.
Суть логического типа: два значения и ничего лишнего
Тип называется в честь математика Джорджа Буля, который описал алгебру логики. В 1С он пишется как Булево, а в английском варианте синтаксиса — Boolean. Значения: Истина / True и Ложь / False.
Чем Булево отличается от других примитивных типов:
| Тип | Сколько значений | Пример | Пустое значение |
|---|---|---|---|
| Число | бесконечно много | 1500.25 | 0 |
| Строка | бесконечно много | "ООО Ромашка" | "" |
| Дата | огромный диапазон | '20261007' | '00010101' |
| Булево | ровно два | Истина | Ложь |
Из таблицы видно главное: у Булево нет «середины». Значение либо Истина, либо Ложь. Если в переменной лежит что-то третье, это уже не Булево, а другой тип — чаще всего Неопределено или NULL. Об этой ловушке — отдельный раздел ниже.
Несколько свойств, которые полезно помнить:
- ✅ у реквизита типа Булево значение по умолчанию —
Ложь. Новый элемент справочника создаётся с выключенным флажком; - ✅ результат любого сравнения — тоже Булево: выражение
Сумма > 0вернётИстинаилиЛожь; - ✅ проверить тип значения можно так:
ТипЗнч(Значение) = Тип("Булево"); - ⚠️ переменная, объявленная через
Перем, но ещё не получившая значения, содержитНеопределено, а неЛожь.
Где Булево встречается в интерфейсе 1С
Пользователь почти никогда не видит слов «Истина» и «Ложь». Платформа показывает логический тип по-человечески.
Флажок в форме. Любая галочка в карточке — это реквизит типа Булево. Поставили галочку — в базе записалась Истина, сняли — Ложь. В управляемой форме такой элемент называется «Поле флажка». У него можно выбрать вид отображения: классический флажок или тумблер-переключатель. Данные при этом одинаковые.
Колонки «Да/Нет» в списках и отчётах. В табличных частях и отчётах на системе компоновки данных логическое значение обычно выводится словами «Да» и «Нет» или значком-галочкой.
Стандартные реквизиты объектов. Каждый справочник и документ несёт служебные поля логического типа:
- 🗑️
ПометкаУдаления— объект помечен на удаление; - 📄
Проведен— документ проведён (значок в первой колонке списка документов); - 📁
ЭтоГруппа— элемент иерархического справочника является группой; - 🔒
Предопределенный— элемент создан конфигурацией, а не пользователем.
Настройки программы. Галочки в разделе Администрирование → Функциональность (в типовых конфигурациях) включают и выключают целые блоки учёта. Внутри это константы и функциональные опции типа Булево: включили — у пользователей появились новые документы и поля.
Отборы. Когда вы ставите в списке отбор по полю-флажку, 1С предлагает выбрать «Да» или «Нет». Это то же сравнение с Истина или Ложь, только в удобной форме.
Если в отчёте вместо «Да/Нет» хочется видеть «Включено/Выключено», это настраивается форматом поля. Строка формата БЛ=Выключено; БИ=Включено задаёт подписи для Ложь (БЛ) и Истина (БИ).
Логические операции и сравнения в 1С
С двумя значениями можно делать три базовые операции. Они пишутся словами:
| Операция | Английский синтаксис | Результат Истина, когда… |
|---|---|---|
И | AND | оба операнда истинны |
ИЛИ | OR | хотя бы один операнд истинен |
НЕ | NOT | операнд ложен (инверсия) |
Таблица истинности для двух флажков А и Б:
| А | Б | А И Б | А ИЛИ Б | НЕ А |
|---|---|---|---|---|
| Истина | Истина | Истина | Истина | Ложь |
| Истина | Ложь | Ложь | Истина | Ложь |
| Ложь | Истина | Ложь | Истина | Истина |
| Ложь | Ложь | Ложь | Ложь | Истина |
Операторы сравнения тоже возвращают Булево: =, <>, <, >, <=, >=. Равенство и неравенство можно применять к значениям любых типов. Сравнение значений разных типов через = не вызывает ошибку, а просто даёт Ложь. А вот < и > для несравнимых типов приведут к ошибке выполнения.
Порядок вычисления. Сначала считается арифметика, затем сравнения, потом НЕ, потом И, и в последнюю очередь ИЛИ. Из-за этого выражение
Результат = А ИЛИ Б И В;
вычисляется как А ИЛИ (Б И В), а не (А ИЛИ Б) И В. Чтобы не гадать, ставьте скобки — код станет понятнее и коллегам.
Сокращённое вычисление. 1С вычисляет логическое выражение слева направо и останавливается, как только результат ясен. Если левая часть И ложна, правая уже не проверяется. На этом построен частый приём защиты от ошибок:
Если ЗначениеЗаполнено(Контрагент) И Контрагент.ПометкаУдаления Тогда
Сообщить("Контрагент помечен на удаление");
КонецЕсли;
Если ссылка пустая, обращения к реквизиту не будет. Поменяйте части местами — и на пустой ссылке код сначала полезет в базу за реквизитом, что лишнее, а на Неопределено упадёт с ошибкой.
Исключающее ИЛИ. Отдельного оператора XOR в 1С нет. Для двух булевых значений его заменяет неравенство: А <> Б даёт Истина, когда ровно одно из них истинно.
Булево в условных операторах и циклах
Главная работа логического типа — управлять ходом программы.
Если … Тогда … ИначеЕсли … Иначе
Если Документ.Проведен Тогда
Сообщить("Документ уже проведён");
ИначеЕсли Документ.ПометкаУдаления Тогда
Сообщить("Документ помечен на удаление");
Иначе
Сообщить("Черновик");
КонецЕсли;
После Если может стоять любое выражение, которое даёт Булево: переменная, реквизит, сравнение, вызов функции. Писать Если Документ.Проведен = Истина Тогда не нужно — реквизит уже содержит ответ. Исключение — когда значение может оказаться Неопределено (см. следующий раздел).
Тернарный оператор ?()
Короткая запись «если — то — иначе» в одно выражение:
Статус = ?(Сумма > 0, "К оплате", "Оплачено");
Первый параметр — условие типа Булево, второй возвращается при Истина, третий — при Ложь.
Пока … Цикл
Цикл Пока крутится, пока условие истинно. Логическая переменная-флаг здесь удобна:
Найдено = Ложь;
Индекс = 0;
Пока Не Найдено И Индекс < Массив.Количество() Цикл
Если Массив[Индекс] = Искомое Тогда
Найдено = Истина;
Иначе
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
Если элемент найден, Индекс указывает на него. Если нет — цикл закончится, когда Индекс станет равен количеству элементов.
Функция, которая возвращает Булево
Хорошая практика — выносить проверки в функции с говорящим именем:
Функция ДокументМожноРедактировать(Документ)
Возврат Не Документ.Проведен И Не Документ.ПометкаУдаления;
КонецФункции
Удобна запись Возврат <условие>. Конструкция «Если условие Тогда Возврат Истина Иначе Возврат Ложь» делает то же самое, только занимает пять строк вместо одной.
Логические значения в языке запросов
В запросах литералы пишутся так же: ИСТИНА и ЛОЖЬ. Поле типа Булево можно использовать в условии напрямую:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И НЕ Номенклатура.ЭтоГруппа
Логическое поле можно и вычислить. Например, признак «есть долг» через ВЫБОР:
ВЫБОР
КОГДА Остатки.СуммаОстаток > 0 ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЕстьДолг
Главное отличие от встроенного языка — значение NULL. Оно появляется при левом соединении, когда для строки нет пары. Сравнение NULL = ИСТИНА не даёт ни истины, ни лжи, и строка просто выпадает из результата. Причём выпадает и при условии = ИСТИНА, и при НЕ …. Поэтому для полей из присоединённой таблицы используйте ЕСТЬNULL:
ГДЕ
ЕСТЬNULL(Настройки.Используется, ЛОЖЬ) = ЛОЖЬ
Здесь строки без пары считаются «не используется» и попадают в выборку.
Неопределено и NULL: когда вместо Истины приходит «ничего»
Это самая частая причина ошибок с логикой. Значение, которое по смыслу должно быть Булево, на деле оказывается Неопределено. Откуда оно берётся:
- 📦
Соответствие.Получить("Ключ")возвращаетНеопределено, если ключа нет; - 💾
ХранилищеОбщихНастроек.Загрузить(...)возвращаетНеопределено, если пользователь ещё ни разу не сохранял настройку; - 📋 колонка таблицы значений, созданная без указания типа, хранит
Неопределенов новых строках; - 🔣 реквизит составного типа, в котором есть Булево, может быть просто не заполнен;
- 🔗
NULLприходит из результата запроса при левом соединении.
Если подставить такое значение в условие, выполнение прервётся с ошибкой:
Преобразование значения к типу Булево не может быть выполнено
То же произойдёт с НЕ, И, ИЛИ, если до проверки операнда дело дошло. Как защититься — три способа на выбор:
| Способ | Код | Когда подходит |
|---|---|---|
| Сравнить с Истина явно | Если Флаг = Истина Тогда | Неопределено должно считаться «нет» |
| Подставить значение по умолчанию | Флаг = ?(Флаг = Неопределено, Ложь, Флаг); | значение используется много раз ниже |
| Проверить тип | Если ТипЗнч(Флаг) = Тип("Булево") И Флаг Тогда | в переменную может прийти что угодно |
Первый способ работает, потому что сравнение через = с другим типом не падает, а возвращает Ложь. Это тот самый случай, когда «лишнее» = Истина оправдано.
Для настроек удобнее сразу задать значение по умолчанию при чтении:
ПоказыватьПодсказки = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "ПоказыватьПодсказки");
Если ПоказыватьПодсказки = Неопределено Тогда
ПоказыватьПодсказки = Истина; // значение по умолчанию
КонецЕсли;
Не путайте Неопределено и NULL. Первое живёт во встроенном языке, второе приходит из базы данных через запрос. Проверка Значение = Неопределено не поймает NULL, для него нужно отдельное сравнение Значение = NULL.
Преобразование Булево в строку, число и обратно
Логическое значение часто приходится выводить в текст, выгружать в файл или получать из внешней системы.
| Задача | Код | Результат |
|---|---|---|
| В строку для пользователя | Строка(Истина) | "Да" |
| В строку со своими подписями | Формат(Флаг, "БЛ=Нет; БИ=Есть") | "Есть" или "Нет" |
| В строку для обмена | XMLСтрока(Истина) | "true" |
| Из строки обмена | XMLЗначение(Тип("Булево"), "true") | Истина |
| В число | Число(Истина) | 1 |
| Из числа | Булево(0) | Ложь |
Функция Булево() для числа возвращает Ложь только на нуле, любое другое число даёт Истина.
Для обменов с внешними системами всегда используйте пару XMLСтрока / XMLЗначение. Строка(Истина) зависит от языка интерфейса: в русском это «Да», в английском — «Yes». Файл, выгруженный у одного пользователя, может не прочитаться у другого.
Прямая арифметика с Булево не работает
: Истина + 1 вызовет ошибку. Если нужно посчитать, сколько флажков включено, сначала переведите каждый в число через Число() или считайте счётчиком в цикле.
Частые ошибки при работе с логикой в 1С
Ошибки, которые чаще всего встречаются в коде и настройках:
Двойное отрицание и путаница с
НЕ. ВыражениеНЕ А = Бчитается какНЕ (А = Б), потому что сравнение выполняется раньшеНЕ. Если имелось в виду(НЕ А) = Б, без скобок получится другое. Правило простое: при смешиванииНЕсо сравнениями — скобки.Смешение
ИиИЛИбез скобок. Условие «покупатель или поставщик, и при этом не помечен на удаление» без скобок превращается в «покупатель, или поставщик без пометки». Помеченные покупатели пролезут в выборку.Сравнение со строкой.
Если Флаг = "Истина" Тогданикогда не сработает: строка и Булево — разные типы, сравнение вернётЛожь. Такая ошибка часто появляется после загрузки данных из Excel или CSV, где флажок пришёл текстом.Отрицательные имена переменных. Флаг
НеПроводитьв выраженииЕсли Не НеПроводить Тогдачитается с трудом. Называйте флаги утвердительно:Проводить,ЕстьОшибки,ТребуетсяПроверка.Порядок проверок в
И. Тяжёлую проверку (обращение к базе, вызов сервера) ставьте справа, лёгкую — слева. Благодаря сокращённому вычислению тяжёлая часть выполнится только при необходимости.Забытый
ЕСТЬNULLв запросе. Отчёт «теряет» строки, у которых нет записи в присоединённой таблице. Пользователь видит неполный список и не понимает, почему.
Частые вопросы
Можно ли сделать в 1С флажок с тремя состояниями?
Как найти в базе все элементы, у которых флажок не установлен?
НЕ Таблица.Поле или Таблица.Поле = ЛОЖЬ.Почему в отчёте вместо «Да/Нет» пустые ячейки?
Чем Булево отличается от числа 0 и 1?
Истина = 1 вернёт Ложь. Для перевода используйте функции Число() и Булево().