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

В этой статье мы подробно разберём, что такое булево значение в 1С, где оно применяется, и какие нюансы нужно учитывать при работе с логическими типами. Вы узнаете, как булевы значения взаимодействуют с другими типами данных, как их правильно сравнивать, и почему ошибки в логических выражениях могут приводить к трудноуловимым багам. Материал будет полезен как новичкам, так и опытным разработчикам, которые хотят систематизировать свои знания.

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

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

  • 🔹 Проверки условий в операторах Если..Тогда или Пока
  • 🔹 Фильтрации данных в запросах и отчётах
  • 🔹 Управления видимостью элементов форм (например, кнопок или полей)
  • 🔹 Хранения флагов состояния (например, "Документ проведён", "Товар в наличии")

В отличие от многих языков программирования, где булевы значения могут неявно преобразовываться в числа (например, True = 1, False = 0), в такое преобразование недопустимо. Попытка сложить Истина + 5 приведёт к ошибке выполнения. Это строгая типизация, которая помогает избежать случайных ошибок.

Интересный факт: в 1С 7.7 булевых значений не было как отдельного типа — вместо них использовались числа 1 (истина) и 0 (ложь). В 1С:Предприятие 8 тип был введён для большей ясности кода и соответствия современным стандартам программирования.

📊 Как часто вы используете булевы значения в 1С?
Постоянно, в каждом скрипте
Только для простых проверок
Реде, предпочитаю другие подходы
Не знаю, что это

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

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

  1. Прямое задание:
    Перем МояПеременная;
    

    МояПеременная = Истина; // или Ложь

  2. Результат сравнения:
    Результат = (5 > 3); // Результат будет Истина
  3. Логические операции:
    Флаг = (Документ.Проведен) И (Документ.Оплачен);
  4. Функции, возвращающие булево значение:
    ЕстьЛиТовар = Справочники.Номенклатура.НайтиПоНаименованию("Монитор") <> Неопределено;

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

💡

Используйте булевы переменные с осмысленными именами, например ДокументПроведен вместо Флаг1. Это сделает код более читаемым.

Отличие булевых значений от других типов данных в 1С

Булевы значения часто путают с числами или строками, особенно те, кто пришёл в из других языков программирования. Давайте разберём ключевые различия:

Тип данных Пример значения Можно ли сравнивать с булевым? Нюансы
Число 0, 1, -5 ❌ Нет В некоторых языках 0 = Ложь, но в 1С это ошибка
Строка "Да", "Нет" ❌ Нет Даже строка "Истина" не равна булевому Истина
Неопределённое значение Неопределено ✅ Да Сравнение с Неопределено всегда даёт Ложь
NULL (в запросах) NULL ✅ Да В языке запросов NULL трактуется как Ложь в логических выражениях

Критическая особенность 1С: попытка использовать число или строку там, где ожидается булево значение, приведёт к ошибке выполнения, а не к неявному преобразованию. Например, этот код вызовет исключение:

Если 1 Тогда // Ошибка! Ожидается булево значение

Сообщить("Это не сработает");

КонецЕсли;

Это строгая типизация помогает избежать скрытых ошибок, но требует от разработчика внимательности.

Почему в 1С нет неявного преобразования чисел в булевы значения?

В отличие от языков вроде JavaScript или Python, где 0 трактуется как false, а любое ненулевое число — как true, в 1С разработчики сознательно отказались от такого поведения. Это сделано для повышения надёжности кода: неявные преобразования часто становятся источником трудноуловимых ошибок, особенно в крупных системах.

Логические операции с булевыми значениями в 1С

В поддерживаются стандартные логические операции, которые работают с булевыми значениями:

  • 🔹 И (логическое И, AND) — возвращает Истина, если оба операнда истинны
  • 🔹 ИЛИ (логическое ИЛИ, OR) — возвращает Истина, если хотя бы один операнд истинный
  • 🔹 НЕ (логическое НЕ, NOT) — инвертирует значение (ИстинаЛожь и наоборот)
  • 🔹 ? (тернарный оператор) — краткая запись для Если..Тогда..Иначе

Примеры использования:

// Проверка нескольких условий

Если (Клиент.БонуснаяКарта = Истина) И (Клиент.СуммаПокупок > 10000) Тогда

Скидка = 10;

КонецЕсли;

// Использование тернарного оператора

Состояние = ?(Документ.Проведен, "Проведён", "Не проведён");

// Комбинирование операций

ВидимостьКнопки = (Права.Редактирование) И НЕ (Документ.Заблокирован);

Важный нюанс: операции И и ИЛИ в вычисляются с укороченной логикой (short-circuit evaluation). Это значит, что если результат операции уже определён после вычисления первого операнда, второй операнд не вычисляется. Например:

// Второй операнд (ДелимНаНоль()) не выполнится, так как первый уже Ложь

Результат = (Ложь) И (ДелимНаНоль());

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

В языке запросов 1С булевы значения используются для фильтрации данных, создания условий в операторах ГДЕ, ВЫБРАТЬ..РАЗРЕШЕННЫЕ и других конструкциях. Особенности работы:

  • 🔹 В запросах Истина и Ложь пишутся без кавычек (в отличие от строк)
  • 🔹 Можно использовать в выражениях с ВЫРАЗИТЬ для создания вычисляемых полей
  • 🔹 В условиях часто комбинируются с NULL (например, ГДЕ НЕ Документ.ПометкаУдаления)

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

ВЫБРАТЬ

Товары.Наименование,

Товары.НаСкладе КАК ВНаличии

ИЗ

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

ГДЕ

Товары.НаСкладе = Истина

И Товары.Цена > 0

ВЫБРАТЬ

Клиенты.Наименование,

ВЫРАЗИТЬ(Клиенты.СуммаДолга > 0 КАК Логический) КАК ЕстьДолг

ИЗ

Справочник.Контрагенты КАК Клиенты

Внимание! В запросах нельзя использовать переменные типа Булево напрямую — их нужно передавать как параметры:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ Товары.Наименование

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

ГДЕ Товары.АкционныйТовар = &Акционный";

Запрос.УстановитьПараметр("Акционный", Истина); // Передаём булево значение как параметр

Результат = Запрос.Выполнить();

Использовать параметры для передачи булевых значений|Проверять на NULL в условиях (ГДЕ НЕ Поле = NULL)|Избегать сложных логических выражений в одном условии|Тестировать запрос на пустых данных-->

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

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

  1. Сравнение с небулевыми значениями:
    Если Документ.Сумма = 0 Тогда // Ошибка! Сравнивается число, а не булево значение
    

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

    Если Документ.Сумма = 0 Тогда Флаг = Ложь; Иначе Флаг = Истина; КонецЕсли;

  2. Избыточные проверки:
    Если Флаг = Истина Тогда // Избыточно
    

    // Достаточно:

    Если Флаг Тогда

  3. Неправильное использование NULL:
    Если ЗначениеЗаполнено(Документ.Датум) = Истина Тогда // Лишнее сравнение
    

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

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

  4. Путаница с тернарным оператором:
    Результат = ?(Условие, Истина) // Пропущен второй вариант
    

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

    Результат = ?(Условие, Истина, Ложь);

⚠️ Внимание! В некоторых версиях платформы 1С:Предприятие (особенно до 8.3.10) тернарный оператор ? мог вести себя нестабильно при работе с Неопределено. Всегда проверяйте поведение кода на целевой версии платформы.

Ещё одна распространённая ошибка — попытка сохранить булево значение в поле справочника или документа, которое имеет тип Число или Строка. Это приведёт к ошибке при записи. Всегда проверяйте соответствие типов данных!

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

Давайте рассмотрим реальные сценарии, где булевы значения незаменимы:

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

С помощью булевых значений можно динамически показывать или скрывать элементы интерфейса:

Процедура ПриИзмененииПоля(Элемент)

ЭлементыФормы.КнопкаСохранить.Видимость = (ЭлементыФормы.ЧекБоксСогласие.Значение = Истина);

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

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

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

Процедура ПриФормированииОтчета(Отчет, ДанныеРасшифровки)

Если Параметры.ТолькоАктивные Тогда

Запрос.Текст = "ГДЕ Клиенты.Активный = Истина";

КонецЕсли;

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

3. Контроль прав доступа

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

Функция РазрешеноРедактировать(Документ)

Возврат (Пользователь.ИмеетРоль("Администратор"))

ИЛИ (Документ.Автор = Пользователь.ТекущийПользователь());

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

4. Логика проведения документов

При проведении документов булевы флаги помогают контролировать процесс:

Процедура ОбработкаПроведения(Отказ)

Если НЕ ДвиженияДокумента.Записаны Тогда

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

Сообщить("Не удалось записать движения!");

КонецЕсли;

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

⚠️ Внимание! При работе с булевыми значениями в регламентных заданиях учитывайте, что некоторые операции (например, проверка доступности сервера) могут возвращать Неопределено вместо ожидаемого Истина/Ложь. Всегда обрабатывайте такие случаи явно.

FAQ: Частые вопросы о булевых значениях в 1С

Можно ли булево значение преобразовать в строку?

Да, но не напрямую. Нужно использовать конструкцию с проверкой:

СтрокаФлага = ?(МояПеременная, "Да", "Нет");

Или функцию Строка() с форматированием:

СтрокаФлага = Строка(МояПеременная); // Вернёт "Истина" или "Ложь"
Почему условие Если Неопределено Тогда не работает?

Неопределено не является булевым значением. Для проверки нужно явно сравнивать:

Если МояПеременная = Неопределено Тогда

Или использовать функцию ЗначениеЗаполнено():

Если НЕ ЗначениеЗаполнено(МояПеременная) Тогда
Как передать булево значение в HTTP-запрос из 1С?

При работе с HTTPСервис или HTTPЗапрос булевы значения нужно преобразовывать в строку или число:

Параметры = Новый Структура;

Параметры.Включить = ?(Флаг, "true", "false"); // Для JSON API

Запрос = Новый HTTPЗапрос("/api/method");

Запрос.УстановитьТекст(ЗаписатьJSON(Параметры));

Можно ли использовать булевы значения в вычисляемых полях справочников?

Да, но для этого поле должно иметь тип Булево. Пример:

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

ЭтотОбъект.ЯвляетсяПоставщиком = (ЭтотОбъект.ТипКонтрагента = Перечисление.ТипыКонтрагентов.Поставщик);

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

Если поле имеет другой тип, попытка присвоить ему Истина/Ложь приведёт к ошибке.

Как в 1С проверить, что переменная точно булева?

Используйте функцию ТипЗнч():

Если ТипЗнч(МояПеременная) = Тип("Булево") Тогда

Сообщить("Это булево значение!");

КонецЕсли;

Это полезно, если вы получаете данные из внешних источников и нужно гарантировать тип.

Подводя итог: булевы значения в — это мощный инструмент для создания гибкой и надёжной логики. Они требуют внимательного отношения к типам данных, но при правильном использовании делают код более понятным и предсказуемым. Начинающим разработчикам рекомендуется всегда явно указывать булевы значения (Истина/Ложь), избегать неявных преобразований и тестировать логические выражения на граничных случаях (например, с Неопределено или NULL).

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