Разработка и Конфигурация · 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 при соединениях.
Как проверить результат запроса
Самый быстрый способ — консоль запросов (типовая в режиме предприятия или внешняя обработка). Выполните запрос и проверьте: колонка с ВЫБОР КОГДА заполнена для всех строк, значения соответствуют ожидаемым категориям, нет пустых (NULL) значений там, где их быть не должно.
Дополнительная проверка — контрольный запрос с группировкой: сгруппируйте результат по вычисляемому полю и посчитайте количество строк в каждой категории. Сумма по категориям должна совпадать с общим числом строк выборки. Если сумма меньше — часть строк получила NULL, значит, не хватает ветки ИНАЧЕ или обработки NULL.
Как проверить результат
Каждая строка содержит одно из ожидаемых значений
Встречаются пустые значения или NULL
Равна общему числу строк выборки
Меньше общего числа — часть строк потеряна из-за NULL
Строки без связанной записи попадают в предусмотренную ветку
Строки без связи выпадают из условий молча
Альтернативы ВЫБОР КОГДА для булевых значений
Не каждая задача требует ВЫБОР КОГДА. Если нужно просто получить булево поле — выберите его напрямую, без обёртки. Если нужно преобразовать булево в строку для отчёта, часто удобнее сделать это на этапе вывода (в СКД через вычисляемое поле или форматную строку), а не в запросе — так запрос остаётся проще, а представление можно менять без правки запроса.
Для сложной многоуровневой логики, где условий больше трёх-четырёх, иногда читаемее соединиться со вспомогательной таблицей соответствий, чем строить длинную цепочку КОГДА. Это также упрощает поддержку: соответствие меняется данными, а не текстом запроса.
Сравнение вариантов
Подходит для 2–4 условий и простых подстановок; при большом числе веток запрос трудно читать и поддерживать
Подходит, когда преобразование нужно только для отображения; не работает, если значение нужно в группировке или отборе запроса
Подходит для большого числа вариантов, которые часто меняются; требует дополнительной таблицы и соединения
FAQ
Можно ли писать КОГДА Поле = ИСТИНА вместо КОГДА Поле?
Можно, оба варианта синтаксически корректны и дают одинаковый результат для полей без NULL. Прямая запись без сравнения короче и считается более читаемой. Главное — не сравнивать булево поле со строковыми литералами «Истина» и «Ложь».
Почему условие КОГДА НЕ Поле не срабатывает для части строк?
Скорее всего, поле содержит NULL — например, из-за левого соединения без найденной записи. В трёхзначной логике запросов НЕ NULL тоже даёт NULL, то есть условие не выполняется. Добавьте ветку КОГДА Поле ЕСТЬ NULL или оберните поле в ЕСТЬNULL(Поле, ЛОЖЬ).
Что вернёт ВЫБОР КОГДА, если ни одно условие не выполнилось и ИНАЧЕ не указано?
Поле результата получит значение NULL. Это может нарушить последующие сравнения, группировки и вывод в отчёте, поэтому ветку ИНАЧЕ рекомендуется указывать всегда, даже если кажется, что все случаи покрыты условиями.
Можно ли использовать ВЫБОР КОГДА в секции ГДЕ?
Да, конструкция допустима в секциях ГДЕ, ИМЕЮЩИЕ, а также в условиях соединений. Однако для булевых полей в отборе обычно достаточно записать само поле или НЕ Поле — обёртка в ВЫБОР КОГДА там избыточна и затрудняет чтение.
Влияет ли порядок веток КОГДА на результат?
Да. Условия проверяются сверху вниз, и срабатывает первая истинная ветка. Если более общее условие стоит раньше частного, частная ветка никогда не выполнится. Располагайте условия от более специфичных к более общим.
Что важно запомнить
Булево поле — готовое логическое условие: пишите КОГДА Поле или КОГДА НЕ Поле без сравнений со строками. Всегда добавляйте ИНАЧЕ, явно обрабатывайте NULL через ЕСТЬ NULL или ЕСТЬNULL и следите за порядком веток. Проверяйте результат консолью запросов с контрольной группировкой по вычисляемому полю.