К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: конструкция ВЫБОР КОГДА с булевыми значениями

Как использовать конструкцию ВЫБОР КОГДА с булевыми полями в запросах 1С: синтаксис, примеры, сравнение с ИСТИНА, типичные ошибки и проверка результата.

Конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — это аналог тернарного оператора и оператора CASE в языке запросов 1С. Она позволяет вернуть разные значения в зависимости от условия, и булевы поля (типа Булево, например ПометкаУдаления, Проведен, ЭтоГруппа) — один из самых частых операндов такого условия. При этом разработчики регулярно допускают ошибки: сравнивают булево поле со строкой «Истина», забывают про NULL в составных типах или дублируют условие, которое можно записать напрямую.

Ключевой момент: булево поле в запросе 1С уже является логическим выражением. Его не нужно сравнивать с ИСТИНА — конструкция КОГДА Товары.ЭтоГруппа ТОГДА ... полностью корректна и работает быстрее, чем КОГДА Товары.ЭтоГруппа = ИСТИНА ТОГДА .... Хотя оба варианта синтаксически допустимы.

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

Синтаксис ВЫБОР КОГДА и место булева поля в условии

Полная форма конструкции в языке запросов 1С выглядит так:

ВЫБРАТЬ

ВЫБОР

КОГДА Документ.Проведен

ТОГДА "Проведён"

КОГДА Документ.ПометкаУдаления

ТОГДА "Помечен на удаление"

ИНАЧЕ "Черновик"

КОНЕЦ КАК Статус

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

После КОГДА указывается логическое выражение. Булево поле само по себе — уже логическое выражение, поэтому запись КОГДА Документ.Проведен эквивалентна КОГДА Документ.Проведен = ИСТИНА. Ветки КОГДА проверяются последовательно, срабатывает первая истинная, поэтому порядок условий имеет значение.

Ветка ИНАЧЕ не обязательна, но без неё при несрабатывании всех условий поле получит значение NULL. Для строковых и числовых результатов это часто нежелательно — лучше всегда указывать значение по умолчанию.

Как правильно сравнивать булево поле

Существует три распространённых способа записи условия с булевым полем, и только два из них корректны:

  • КОГДА Документ.Проведен ТОГДА ... — рекомендуемый вариант, прямое использование поля как условия;
  • КОГДА Документ.Проведен = ИСТИНА ТОГДА ... — допустимо, результат идентичен, но запись длиннее;
  • КОГДА Документ.Проведен = "Истина" ТОГДА ... — ошибка: сравнение булева значения со строкой приведёт к неверному результату или ошибке исполнения запроса.

Для проверки на ложное значение используйте отрицание НЕ или явное сравнение с ЛОЖЬ:

ВЫБОР

КОГДА НЕ Номенклатура.ЭтоГруппа

ТОГДА "Элемент"

ИНАЧЕ "Группа"

КОНЕЦ КАК ВидНоменклатуры

Оба варианта — НЕ Поле и Поле = ЛОЖЬ — дают одинаковый результат для полей, которые не могут содержать NULL. Для необязательных реквизитов составного типа поведение отличается, об этом ниже.

NULL и составные типы: где прячется подвох

Если реквизит имеет составной тип, включающий Булево, или поле получено левым соединением и соответствующая запись не найдена, значение поля может быть NULL. В логике запросов 1С NULL не равен ни ИСТИНА, ни ЛОЖЬ: условие КОГДА Поле = ИСТИНА для NULL не сработает, и КОГДА НЕ Поле тоже не сработает.

На практике это приводит к ситуации, когда строка «пропадает» из обеих веток условия и попадает в ИНАЧЕ (или получает NULL при его отсутствии). Чтобы поведение было предсказуемым, обрабатывайте NULL явно:

ВЫБОР

КОГДА Свойства.Значение ЕСТЬ NULL

ТОГДА "Не задано"

КОГДА Свойства.Значение

ТОГДА "Да"

ИНАЧЕ "Нет"

КОНЕЦ КАК Признак

Альтернатива — функция ЕСТЬNULL(Поле, ЛОЖЬ), которая подменяет NULL значением по умолчанию до проверки условия. Это удобно, когда NULL по смыслу эквивалентен «Ложь».

Практические примеры

Вывод текстового статуса документа

Классическая задача — показать в отчёте или динамическом списке человекочитаемый статус вместо служебных признаков:

ВЫБРАТЬ

Док.Номер,

Док.Дата,

ВЫБОР

КОГДА Док.ПометкаУдаления

ТОГДА "Помечен на удаление"

КОГДА Док.Проведен

ТОГДА "Проведён"

ИНАЧЕ "Не проведён"

КОНЕЦ КАК Состояние

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Док

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

Условное суммирование по булеву признаку

ВЫБОР КОГДА часто комбинируют с агрегатными функциями, чтобы одним запросом посчитать суммы по разным категориям:

ВЫБРАТЬ

СУММА(ВЫБОР

КОГДА Обороты.Регистратор.Проведен

ТОГДА Обороты.СуммаОборот

ИНАЧЕ 0

КОНЕЦ) КАК СуммаПроведённых,

СУММА(ВЫБОР

КОГДА НЕ Обороты.Регистратор.Проведен

ТОГДА Обороты.СуммаОборот

ИНАЧЕ 0

КОНЕЦ) КАК СуммаНепроведённых

ИЗ

РегистрНакопления.Продажи.Обороты КАК Обороты

Булево поле в параметре виртуальной таблицы и отборе

В секции ГДЕ булевы поля тоже используются напрямую: ГДЕ НЕ Номенклатура.ЭтоГруппа или ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ. Логика та же, что и в ВЫБОР КОГДА: избегайте сравнения со строками и учитывайте NULL при соединениях.

Типичные ошибки
01
Сравнение булева поля со строкой «Истина» или «Ложь» — условие никогда не выполняется или запрос падает с ошибкой преобразования типов
02
Игнорирование NULL в полях из левых соединений — строки не попадают ни в одну ветку условия и получают значение ИНАЧЕ или NULL
03
Отсутствие ветки ИНАЧЕ — при несрабатывании всех КОГДА поле результата становится NULL, что ломает последующие сравнения и группировки
04
Неправильный порядок веток КОГДА — более общее условие стоит раньше частного и перехватывает строки, предназначенные для него
05
Использование ВЫБОР КОГДА там, где достаточно самого булева поля — КОГДА Поле ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ эквивалентно просто Поле

Как проверить результат запроса

Самый быстрый способ — консоль запросов (типовая в режиме предприятия или внешняя обработка). Выполните запрос и проверьте: колонка с ВЫБОР КОГДА заполнена для всех строк, значения соответствуют ожидаемым категориям, нет пустых (NULL) значений там, где их быть не должно.

Дополнительная проверка — контрольный запрос с группировкой: сгруппируйте результат по вычисляемому полю и посчитайте количество строк в каждой категории. Сумма по категориям должна совпадать с общим числом строк выборки. Если сумма меньше — часть строк получила NULL, значит, не хватает ветки ИНАЧЕ или обработки NULL.

Контрольные точки

Как проверить результат

Значения вычисляемой колонки
Норма

Каждая строка содержит одно из ожидаемых значений

Тревожный признак

Встречаются пустые значения или NULL

Сумма строк по категориям
Норма

Равна общему числу строк выборки

Тревожный признак

Меньше общего числа — часть строк потеряна из-за NULL

Поведение при левом соединении
Норма

Строки без связанной записи попадают в предусмотренную ветку

Тревожный признак

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

Альтернативы ВЫБОР КОГДА для булевых значений

Не каждая задача требует ВЫБОР КОГДА. Если нужно просто получить булево поле — выберите его напрямую, без обёртки. Если нужно преобразовать булево в строку для отчёта, часто удобнее сделать это на этапе вывода (в СКД через вычисляемое поле или форматную строку), а не в запросе — так запрос остаётся проще, а представление можно менять без правки запроса.

Для сложной многоуровневой логики, где условий больше трёх-четырёх, иногда читаемее соединиться со вспомогательной таблицей соответствий, чем строить длинную цепочку КОГДА. Это также упрощает поддержку: соответствие меняется данными, а не текстом запроса.

Сравнение вариантов

ВЫБОР КОГДА в запросе

Подходит для 2–4 условий и простых подстановок; при большом числе веток запрос трудно читать и поддерживать

Вычисляемое поле СКД

Подходит, когда преобразование нужно только для отображения; не работает, если значение нужно в группировке или отборе запроса

Соединение с таблицей соответствий

Подходит для большого числа вариантов, которые часто меняются; требует дополнительной таблицы и соединения

FAQ

Можно ли писать КОГДА Поле = ИСТИНА вместо КОГДА Поле?

Можно, оба варианта синтаксически корректны и дают одинаковый результат для полей без NULL. Прямая запись без сравнения короче и считается более читаемой. Главное — не сравнивать булево поле со строковыми литералами «Истина» и «Ложь».

Почему условие КОГДА НЕ Поле не срабатывает для части строк?

Скорее всего, поле содержит NULL — например, из-за левого соединения без найденной записи. В трёхзначной логике запросов НЕ NULL тоже даёт NULL, то есть условие не выполняется. Добавьте ветку КОГДА Поле ЕСТЬ NULL или оберните поле в ЕСТЬNULL(Поле, ЛОЖЬ).

Что вернёт ВЫБОР КОГДА, если ни одно условие не выполнилось и ИНАЧЕ не указано?

Поле результата получит значение NULL. Это может нарушить последующие сравнения, группировки и вывод в отчёте, поэтому ветку ИНАЧЕ рекомендуется указывать всегда, даже если кажется, что все случаи покрыты условиями.

Можно ли использовать ВЫБОР КОГДА в секции ГДЕ?

Да, конструкция допустима в секциях ГДЕ, ИМЕЮЩИЕ, а также в условиях соединений. Однако для булевых полей в отборе обычно достаточно записать само поле или НЕ Поле — обёртка в ВЫБОР КОГДА там избыточна и затрудняет чтение.

Влияет ли порядок веток КОГДА на результат?

Да. Условия проверяются сверху вниз, и срабатывает первая истинная ветка. Если более общее условие стоит раньше частного, частная ветка никогда не выполнится. Располагайте условия от более специфичных к более общим.

Итог

Что важно запомнить

Булево поле — готовое логическое условие: пишите КОГДА Поле или КОГДА НЕ Поле без сравнений со строками. Всегда добавляйте ИНАЧЕ, явно обрабатывайте NULL через ЕСТЬ NULL или ЕСТЬNULL и следите за порядком веток. Проверяйте результат консолью запросов с контрольной группировкой по вычисляемому полю.