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

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

Конструкция ВЫБОР КОГДА в запросах 1С: синтаксис и практика

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

Конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — это аналог оператора CASE в языке запросов 1С. Она позволяет прямо в тексте запроса вернуть разные значения в зависимости от условия, не прибегая к постобработке результата в коде. Это один из самых востребованных приёмов при построении отчётов, динамических списков и СКД.

По сути, «Выбор Когда» заменяет ветвление «Если...Тогда...Иначе» внутри запроса. Там, где в модуле пришлось бы перебирать выборку и проверять условия, запрос делает это за один проход на стороне СУБД — быстрее и без лишнего кода. При этом важно понимать ограничения: все возвращаемые ветки должны приводиться к совместимому типу, а сложные условия лучше тестировать на реальных данных.

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

Синтаксис конструкции ВЫБОР КОГДА

Базовая форма выглядит так:

ВЫБРАТЬ

ВЫБОР

КОГДА Заказы.Сумма > 100000

ТОГДА "Крупный"

КОГДА Заказы.Сумма > 10000

ТОГДА "Средний"

ИНАЧЕ "Мелкий"

КОНЕЦ КАК КатегорияЗаказа

ИЗ

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

Правила синтаксиса простые. После слова ВЫБОР идёт одна или несколько веток КОГДА условие ТОГДА результат. Условия проверяются сверху вниз: как только одно из них истинно, возвращается соответствующее значение, остальные ветки не вычисляются. Ветка ИНАЧЕ срабатывает, если ни одно условие не выполнилось. Завершается конструкция словом КОНЕЦ, после которого обычно ставят псевдоним поля через КАК.

Порядок веток имеет значение. В примере выше проверка «больше 100 000» стоит первой: если поменять ветки местами, все заказы больше 10 000 попадут в «Средний», а ветка «Крупный» никогда не сработает. Всегда располагайте более строгие условия выше.

Типовые сценарии использования

Подмена значений для отчёта

Частая задача — показать пользователю понятный текст вместо служебного значения. Например, вместо значения перечисления вывести произвольную строку или вместо булева поля — «Да»/«Нет»:

ВЫБОР

КОГДА Товары.Архивный

ТОГДА "В архиве"

ИНАЧЕ "Активен"

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

Выбор поля-источника

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

ВЫБОР

КОГДА Контрагенты.ФактическийАдрес <> ""

ТОГДА Контрагенты.ФактическийАдрес

ИНАЧЕ Контрагенты.ЮридическийАдрес

КОНЕЦ КАК АдресДоставки

Условия в секции ГДЕ и ИТОГИ

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

Как добавить конструкцию в запрос
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Напишите ВЫБОР, затем ветки КОГДА ... ТОГДА ... и при необходимости ИНАЧЕ
  3. 3
    Закройте конструкцию словом КОНЕЦ и задайте псевдоним через КАК
  4. 4
    Выполните запрос на тестовых данных и проверьте все ветки условий
  5. 5
    Проверьте поведение при NULL в исходных полях

Работа с NULL и типами данных

Две тонкости вызывают большинство проблем. Первая — сравнение с NULL. Условие КОГДА Поле = NULL никогда не будет истинным: в языке запросов NULL сравнивается только через ЕСТЬ NULL. Если поле может быть NULL (например, при левом соединении), это нужно учитывать явно:

ВЫБОР

КОГДА Остатки.Количество ЕСТЬ NULL

ТОГДА 0

КОГДА Остатки.Количество < 0

ТОГДА Остатки.Количество

ИНАЧЕ Остатки.Количество

КОНЕЦ КАК Остаток

Вторая тонкость — совместимость типов. Все ветки ТОГДА и ИНАЧЕ должны возвращать значения приводимых типов. Если одна ветка возвращает строку, а другая — число, СУБД может выдать ошибку или непредсказуемо привести типы. Надёжнее приводить значения явно через ВЫРАЗИТЬ(... КАК ...) либо следить, чтобы все ветки возвращали один тип.

Для простой подмены NULL конструкцию «Выбор Когда» часто заменяют более короткой функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) — она читается легче и работает быстрее для записи.

Что выбрать в разных ситуациях

ЕСТЬNULL(Поле, Значение)

Подходит только для подмены NULL одним значением. Короче и нагляднее, но не умеет проверять произвольные условия.

ВЫБОР КОГДА с одной веткой

Нужен, когда условие сложнее, чем проверка на NULL: сравнения, И/ИЛИ, ЕСТЬ NULL в комбинации с другими проверками.

ВЫБОР КОГДА с несколькими КОГДА

Единственный вариант при трёх и более вариантах результата, например категории или статусы.

ВЫБОР КОГДА в СКД и динамических списках

В системе компоновки данных конструкция работает так же, но есть нюансы. Если поле с «Выбор Когда» используется в ресурсах или группировках, проверьте, что выражение корректно переносится в итоговые записи — иногда для ресурса проще вычислять значение через выражение СКД, а не в тексте запроса.

В динамических списках помните: поля, вычисленные через «Выбор Когда», нельзя редактировать, а отбор и сортировка по ним могут работать медленнее, потому что индексы по вычисляемому выражению не используются. Если список большой и отбор по такому полю нужен постоянно, рассмотрите хранение вычисленного значения в отдельном реквизите.

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

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

Перед переносом запроса в рабочий код выполните его в консоли запросов на данных, покрывающих все ветки условия. Подготовьте или подберите документы так, чтобы сработала каждая ветка КОГДА и ветка ИНАЧЕ. Если в тестовой выборке ветка не представлена, вы не узнаете об ошибке в ней до эксплуатации.

Отдельно проверьте граничные значения: ровно пороговая сумма, пустая строка, NULL после левого соединения, минимальная и максимальная даты. Именно на границах чаще всего всплывают ошибки в знаках сравнения (> вместо >=).

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

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

Каждая ветка КОГДА
Норма

В тестовой выборке есть строки, попадающие в каждую ветку, и значения соответствуют ожиданиям

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

Какая-то ветка не встречается в результате — невозможно подтвердить её корректность

Поле результата
Норма

Нет значений NULL, если ветка ИНАЧЕ задана

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

Появляются NULL — значит, условие не покрывает часть данных

Тип поля
Норма

Одинаковый тип во всех строках результата

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

Смешанные типы или ошибка приведения при выполнении

Производительность и ограничения

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

Также учитывайте, что «Выбор Когда» в секции ГДЕ почти всегда отключает использование индексов по полям условия. Для отборов предпочтительнее прямые сравнения и логические И/ИЛИ, а условную логику оставлять в списке выбираемых полей.

Часто задаваемые вопросы

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

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

Чем ВЫБОР КОГДА отличается от ЕСТЬNULL?

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

Сколько веток КОГДА можно написать?

Явного ограничения в синтаксисе нет, но при большом количестве веток текст запроса становится трудно читать и поддерживать. Если вариантов больше пяти-семи, стоит подумать о справочнике соответствий и соединении с ним вместо длинной конструкции.

Работает ли ВЫБОР КОГДА в параметрах виртуальных таблиц?

Нет, в параметрах виртуальных таблиц допустимы только простые выражения и параметры. Условную логику там применять нельзя — её нужно переносить в секцию ГДЕ основного запроса или в список полей.

Можно ли сортировать и отбирать по полю, вычисленному через ВЫБОР КОГДА?

Сортировка в запросе через УПОРЯДОЧИТЬ ПО работает. Отбор в динамическом списке и СКД тоже возможен, но может выполняться медленно на больших таблицах, так как индексы по вычисляемому выражению не применяются.

Почему условие КОГДА Поле = NULL не срабатывает?

В языке запросов 1С любое сравнение с NULL через знак равенства даёт ложь. Для проверки на NULL используется специальный оператор: КОГДА Поле ЕСТЬ NULL ТОГДА ... — только так условие сработает корректно.

Итог

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

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