Истина или Ложь: как устроен логический тип данных в 1С:Предприятии

· 10 мин

Содержание

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

Любой флажок в форме, любое условие Если … Тогда и любой фильтр «Да/Нет» в отчёте работают с этим типом. Пользователь видит его как галочку, программист — как условие, а запрос — как поле, которое может внезапно оказаться NULL.

Суть логического типа: два значения и ничего лишнего

Тип называется в честь математика Джорджа Буля, который описал алгебру логики. В 1С он пишется как Булево, а в английском варианте синтаксиса — Boolean. Значения: Истина / True и Ложь / False.

Чем Булево отличается от других примитивных типов:

ТипСколько значенийПримерПустое значение
Числобесконечно много1500.250
Строкабесконечно много"ООО Ромашка"""
Датаогромный диапазон'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С

Проверьте себя
Чему равно выражение Истина ИЛИ Ложь И Ложь?
Переменная Флаг равна Неопределено. Что произойдёт на строке Если Флаг = Истина Тогда?
Что вернёт Строка(Ложь) при русском интерфейсе?

Ошибки, которые чаще всего встречаются в коде и настройках:

  1. Двойное отрицание и путаница с НЕ. Выражение НЕ А = Б читается как НЕ (А = Б), потому что сравнение выполняется раньше НЕ. Если имелось в виду (НЕ А) = Б, без скобок получится другое. Правило простое: при смешивании НЕ со сравнениями — скобки.

  2. Смешение И и ИЛИ без скобок. Условие «покупатель или поставщик, и при этом не помечен на удаление» без скобок превращается в «покупатель, или поставщик без пометки». Помеченные покупатели пролезут в выборку.

  3. Сравнение со строкой. Если Флаг = "Истина" Тогда никогда не сработает: строка и Булево — разные типы, сравнение вернёт Ложь. Такая ошибка часто появляется после загрузки данных из Excel или CSV, где флажок пришёл текстом.

  4. Отрицательные имена переменных. Флаг НеПроводить в выражении Если Не НеПроводить Тогда читается с трудом. Называйте флаги утвердительно: Проводить, ЕстьОшибки, ТребуетсяПроверка.

  5. Порядок проверок в И. Тяжёлую проверку (обращение к базе, вызов сервера) ставьте справа, лёгкую — слева. Благодаря сокращённому вычислению тяжёлая часть выполнится только при необходимости.

  6. Забытый ЕСТЬNULL в запросе. Отчёт «теряет» строки, у которых нет записи в присоединённой таблице. Пользователь видит неполный список и не понимает, почему.

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

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