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