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

Если вы когда-нибудь видели в коде конструкции вроде Если Условие Тогда ... Иначе ... КонецЕсли, то уже работали с булевыми значениями, возможно, не осознавая этого. В этой статье мы разберём, что такое булево в , как оно реализовано в языке запросов и встроенном языке, где применяется на практике, и какие ошибки чаще всего допускают при работе с логическими типами. Особое внимание уделим различиям между 1С:Предприятие 8.3 и более ранними версиями, а также нюансам, которые могут сэкономить часы отладки.

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

Что такое булево значение в 1С: определение и суть

Булево значение (от англ. boolean, по имени математика Джорджа Буля) в 1С:Предприятие — это тип данных, который может принимать только два состояния:

  • 🔹 Истина (Истина или True) — соответствует логической «1», «да», «включено».
  • 🔸 Ложь (Ложь или False) — соответствует логической «0», «нет», «выключено».

В отличие от других языков программирования (например, JavaScript, где false эквивалентно 0, "" или null), в булево значение жёстко типизировано. Это означает, что:

  • 📌 Истина и Ложь — это отдельные константы, а не числа или строки.
  • 📌 Операции сравнения (=, <>, >) всегда возвращают булево значение.
  • 📌 Логические операторы (И, ИЛИ, НЕ) работают только с булевыми операндами.

Пример простейшего булева выражения в :

Перем МоеУсловие;

МоеУсловие = (5 > 3); // Присвоит Истина

Сообщить(МоеУсловие); // Выведет "Истина"

⚠️ Внимание: В 1С 7.7 булевый тип отсутствовал как таковой — вместо него использовались числа 1 (истина) и 0 (ложь). В 1С 8.x это разделение строгое, и попытка привести число к булевому типу без явного преобразования вызовет ошибку.

Где применяются булевы значения в 1С: от кода до интерфейса

Логический тип данных пронизывает все уровни работы с 1С:Предприятие — от внутренней логики платформы до пользовательского интерфейса. Рассмотрим ключевые сценарии:

Область применения Пример использования Особенности
Условные операторы Если Документ.Проведен Тогда ... Проверка состояния объектов (проведён/не проведён, помечен на удаление и т.д.)
Фильтры в запросах ГДЕ Проведен = Истина В языке запросов Истина/Ложь пишутся без кавычек
Реквизиты справочников Реквизит "Активен" с типом Булево В форме отображается как флажок (checkbox)
Параметры функций НайтиПоНаименованию(..., Ложь) Часто используется для управления поведением методов
Обмен данными Флаг "Полная выгрузка" в настройках обмена Может сериализоваться в JSON как true/false

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

Если Справочник.Контрагенты.НайтиПоНаименованию("ООО Ромашка").Покупатель Тогда

Сообщить("Это наш покупатель!");

КонецЕсли;

Интересный нюанс: в управляемых формах 1С 8.3 булевый реквизит может иметь три состояния, если включена опция «Три состояния» (истина/ложь/неопределённость). Это используется, например, для фильтров с опцией «Все значения».

📊 Как часто вы используете булевы значения в 1С?
Ежедневно
Иногда
Рядко
Никогда

Булево vs другие типы данных: сравнение и преобразования

В булево значение не взаимозаменяемо с другими типами, но платформа предоставляет механизмы явного и неявного преобразования. Разберём ключевые различия и правила:

  • 🔹 Числа: 0 не равно Ложь, а 1 — не Истина. Для преобразования используйте Булево(Число).
  • 🔸 Строки: Пустая строка "" не эквивалентна Ложь. Функция Булево("Истина") вернёт Истина.
  • 📌 NULL: В нет классического NULL, но есть Неопределённость, которая не равна ни Истина, ни Ложь.

Примеры преобразований:

// Число → Булево

Результат1 = Булево(0); // Ложь

Результат2 = Булево(-1); // Истина (любое ненулевое число)

// Строка → Булево

Результат3 = Булево("Да"); // Истина

Результат4 = Булево("Нет"); // Ложь

Результат5 = Булево("Любой текст"); // Истина

// Булево → Строка

СтрокаИзИстины = "" + Истина; // "Истина"

⚠️ Внимание: В языке запросов нельзя использовать функцию Булево(). Для преобразования строки в логическое значение используйте конструкцию ВЫБРАТЬ ВЫРАЗИТЬ("Истина" КАК Булево).

Особое внимание заслуживает работа с JSON. При сериализации булево значение автоматически преобразуется в true/false, но при десериализации может потребоваться явное приведение:

ДанныеJSON = Новый Структура();

ДанныеJSON.Включить("Активен", Истина);

СтрокаJSON = ЗаписатьJSON(ДанныеJSON);

// Обратно

ПрочитанныеДанные = ПрочитатьJSON(СтрокаJSON);

Активен = ПрочитанныеДанные.Активен; // Здесь тип уже Булево

💡

Если вам нужно передать булево значение через веб-сервис или REST API, используйте строковые представления "true"/"false" — это гарантирует корректную обработку на стороне клиента, даже если тип данных будет потерян при передаче.

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

Даже опытные разработчики иногда сталкиваются с неожиданным поведением логических типов. Вот наиболее распространённые ошибки и как их избегать:

  1. Сравнение с небулевыми значениями

    Код Если Переменная = Истина Тогда вызовет ошибку, если Переменная не булева. Правильно: Если Булево(Переменная) Тогда.

  2. Путаница с триггерами

    В обработчиках событий (например, ПередЗаписью) возвращаемое значение Ложь отменяет действие, а Истина — разрешает. Частая ошибка: возвращать 0 вместо Ложь.

  3. Неявные преобразования в запросах

    В языке запросов выражение ГДЕ 1 = 1 всегда истинно, но ГДЕ 1 — синтаксическая ошибка. Для булевых полей используйте только Истина/Ложь.

Ещё один подводный камень — работа с параметрами функций. Если функция ожидает булево значение, передача 0 или "" не сработает:

// Неверно (вызовет ошибку):

МойМетод(0);

// Правильно:

МойМетод(Ложь);

// В определении метода:

Процедура МойМетод(ПараметрКакБулево) Экспорт

Если Не Булево(ПараметрКакБулево) Тогда

ВызватьИсключение "Ожидалось булево значение!";

КонецЕсли;

КонецПроцедуры

Особенно коварны ошибки при обмене данными, когда булево значение сериализуется в формат, не поддерживающий логический тип (например, XML или CSV). В таких случаях используйте строковые представления:

// При записи в XML

ЗначениеДляXML = ?(МояПеременная, "true", "false");

// При чтении из XML

МояПеременная = (ЗначениеИзXML = "true");

Что произойдёт, если сравнить Истина с 1?

В 1С 8.x выражение Истина = 1 вернёт Ложь, потому что сравниваются разные типы. Для корректного сравнения нужно привести оба операнда к одному типу: Булево(1) = Истина (результат — Истина).

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

В языке запросов булевы значения используются для фильтрации, сортировки и условной логики. Главное правило: Истина и Ложь пишутся без кавычек и регистрозависимы (только с заглавной буквы).

Базовые примеры:

// Фильтрация по булевому полю

ВЫБРАТЬ

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Активна = Истина

// Условная логика с ВЫБОР

ВЫБРАТЬ

ВЫБОР

КОГДА Документ.Оплачен ТОГДА "Оплачено"

ИНАЧЕ "Не оплачено"

КАК СтатусОплаты

ИЗ

Документ.ЗаказПокупателя КАК Документ

Особенности работы с булевыми значениями в запросах:

  • 🔹 В секции ГДЕ нельзя использовать функции вроде Булево() — только прямые сравнения.
  • 🔸 Для проверки на NULL (в внешних источниках данных) используйте ЗНАЧЕНИЕ ЗАПОЛНЕНО.
  • 📌 В временных таблицах булевы поля создаются с типом Булево:
ВЫБРАТЬ

Истина КАК ФлагАктивности

ПОМЕСТИТЬ ВТ_Тест

Важный нюанс: в запросах к внешним источникам данных (например, SQL-базам) булевы значения могут интерпретироваться иначе. Например, в Microsoft SQL Server тип bit соответствует булевому, но в PostgreSQL используется boolean. При настройке соединения убедитесь, что mapping типов корректен.

Используйте Истина/Ложь без кавычек

Не применяйте Булево() в секции ГДЕ

Для NULL используйте ЗНАЧЕНИЕ ЗАПОЛНЕНО

Проверьте mapping типов при работе с внешними БД-->

Практические примеры: булево в реальных задачах 1С

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

1. Фильтрация данных в отчёте

Допустим, нужно показать в отчёте только активных контрагентов. В схеме компоновки данных используем:

// В настройках отбора:

Элементы.Активен = Истина

2. Управление видимостью элементов формы

Скрываем кнопку «Удалить», если документ проведён:

ЭлементыФормы.КнопкаУдалить.Видимость = НЕ ДокументОбъект.Проведен;

3. Логика в бизнес-процессах

Проверяем, можно ли перевести сделку на следующий этап:

Если НЕ Сделка.Этап.ЭтоГруппа И Сделка.Сумма > 0 Тогда

РазрешитьПереход = Истина;

Иначе

РазрешитьПереход = Ложь;

КонецЕсли;

4. Обработка событий в модулях объектов

Отменяем проведение документа, если не заполнено обязательное поле:

Процедура ПередЗаписью(Отказ)

Если НЕ ЗначениеЗаполнено(Контрагент) Тогда

Отказ = Истина;

Сообщить("Не указан контрагент!");

КонецЕсли;

КонецПроцедуры

Особый случай — работа с булевыми параметрами в HTTP-сервисах. При получении данных из веб-запроса логические значения часто приходят в виде строк ("true"/"false"). Преобразуйте их явно:

Функция СтрокуВБулево(Значение)

Возврат ?(Значение = "true", Истина, Ложь);

КонецФункции;

💡

Всегда явное лучше неявного: при работе с булевыми значениями в 1С лучше использовать явные преобразования (Булево()), чем полагаться на автоматическую типизацию. Это предотвращает ошибки при изменении контекста выполнения (например, в фоновых заданиях или на сервере).

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

Если ваш код с булевыми значениями работает не так, как ожидалось, воспользуйтесь этими методами диагностики:

  1. Проверка типа значения

    Используйте ТипЗнч(Переменная), чтобы убедиться, что переменная действительно булева:

    Сообщить(ТипЗнч(МояПеременная)); // Должно вывести "Булево"
  2. Логирование промежуточных значений

    Выводите в отладку результаты сравнений:

    Сообщить("Условие = " + ?(МоеУсловие, "Истина", "Ложь"));
  3. Проверка контекста выполнения

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

Типичная ошибка при отладке — игнорирование неопределённых значений. Например, если реквизит не заполнен, его значение может быть Неопределённость, а не Ложь:

Если НЕ ЗначениеЗаполнено(Документ.Флаг) Тогда

// Флаг может быть Неопределённость, а не Ложь

Сообщить("Флаг не установлен!");

КонецЕсли;

Для сложных условий используйте пошаговую отладку в конфигураторе (F5), чтобы увидеть, как вычисляется каждое булево выражение. Особое внимание уделяйте:

  • 🔹 Цепочкам операторов И/ИЛИ (приоритет выполнения может отличаться от ожидаемого).
  • 🔸 Вызовам функций, возвращающих булево значение (например, НайтиПоНаименованию() возвращает Ложь, если ничего не найдено).
⚠️ Внимание: В тонком клиенте 1С некоторые операции с булевыми значениями могут выполняться медленнее, чем на сервере, из-за особенностей передачи данных. Если логика критична к производительности, переносите её в серверные процедуры.

FAQ: ответы на частые вопросы о булевом типе в 1С

Можно ли в 1С использовать 1 и 0 вместо Истина/Ложь?

Нет, в 1С 8.x это вызовет ошибку типов. Такое замены работали только в 1С 7.7. Всегда используйте Истина и Ложь.

Как передать булево значение через параметр отчёта?

В схеме компоновки данных создайте параметр с типом Булево. В коде можно обращаться к нему как к обычной логической переменной. Пример:

Параметры.Добавить("ТолькоАктивные", Тип("Булево"), Истина);
Почему условие Если Документ.Проведен Тогда не работает?

Вероятные причины:

  1. Реквизит Проведен имеет значение Неопределённость (документ ещё не записан).
  2. Вы работаете с непроведённым документом, но проверяете его в модуле объекта, где Проведен ещё не установлен.
  3. Ошибка в контексте: возможно, вы проверяете не тот объект (например, копию документа).

Диагностика: выведите Сообщить(ТипЗнч(Документ.Проведен)).

Как сохранить булево значение в регистр сведений?

Создайте ресурс регистра с типом Булево. При записи используйте:

Движение.Активен = Истина;

В запросе к регистру фильтруйте так:

ГДЕ Активен = Истина
Чем отличается Булево от Число(0,1) в обмене данными?

При обмене через XML или JSON:

  • Булево сериализуется в true/false (JSON) или атрибут с типом xs:boolean (XML).
  • Число станет 0/1, что может вызвать ошибки при десериализации, если ожидается булево.

Рекомендация: всегда используйте явное приведение типов при обмене.