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

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

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

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

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

Механизм работает на стороне СУБД: платформа транслирует конструкцию в SQL-выражение CASE, поэтому дополнительных затрат на перебор выборки в коде не возникает. Это делает ВЫБОР КОГДА одним из самых востребованных приёмов при разработке отчётов, динамических списков и произвольных выборок.

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

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

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

ВЫБОР

КОГДА Продажи.Сумма > 100000 ТОГДА "Крупная"

КОГДА Продажи.Сумма > 10000 ТОГДА "Средняя"

ИНАЧЕ "Мелкая"

КОНЕЦ КАК КатегорияСделки

Условия проверяются сверху вниз, и выполняется только первая подошедшая ветка. Поэтому порядок условий имеет значение: если поставить проверку «больше 10000» выше, чем «больше 100000», крупные суммы никогда не попадут в свою категорию. Это одна из самых коварных логических ошибок — запрос выполнится без сообщений, но результат будет неверным.

Ветка ИНАЧЕ необязательна. Если её опустить и ни одно условие не сработало, поле получит значение NULL. Это нужно учитывать при дальнейшей обработке: сравнение с NULL через обычное равенство не сработает, потребуется ЕСТЬ NULL или функция ЕСТЬNULL().

Типовые сценарии применения

Замена NULL и значений по умолчанию

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

ВЫБОР

КОГДА Контрагенты.ОсновнойДоговор ЕСТЬ NULL

ТОГДА "Договор не указан"

ИНАЧЕ Контрагенты.ОсновнойДоговор.Наименование

КОНЕЦ КАК Договор

Для простой подмены NULL компактнее использовать функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию), но ВЫБОР КОГДА удобнее, когда условие сложнее, чем простая проверка на NULL.

Расчёт статусов и признаков

В отчётах по документам часто нужен человекочитаемый статус вместо технических признаков:

ВЫБОР

КОГДА Реализация.Проведен ТОГДА "Проведён"

КОГДА Реализация.ПометкаУдаления ТОГДА "Помечен на удаление"

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

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

Такой приём избавляет от постобработки выборки в коде и упрощает настройку СКД, где поле можно сразу выводить, группировать и отбирать.

Вычисляемые числовые значения

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

Нужно одно из двух значений по простому условиюПодходит ВЫБОР КОГДА или ЕСТЬNULL

Проверьте, не сводится ли задача к замене NULL — тогда ЕСТЬNULL короче

Несколько диапазонов или условийПолная форма с несколькими КОГДА

Проверьте порядок условий: первое совпавшее прерывает проверку

Значения разных типовРиск ошибки запроса

Приведите ветки к одному типу через ВЫРАЗИТЬ или строковые литералы

ВЫБОР КОГДА в условиях, группировках и итогах

Конструкцию можно использовать не только в списке выбираемых полей. Она допустима в секции УСЛОВИЕ (ГДЕ), в группировке и даже внутри агрегатных функций. Например, подсчёт суммы только проведённых документов:

СУММА(ВЫБОР

КОГДА Обороты.Документ.Проведен ТОГДА Обороты.Сумма

ИНАЧЕ 0

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

Группировка по вычисляемому полю ВЫБОР позволяет строить сводки по категориям, которых нет в данных напрямую: «Крупная/Средняя/Мелкая», «Просрочен/В срок». В СКД такое поле достаточно объявить в наборе данных, и дальше оно ведёт себя как обычный ресурс или измерение.

Учтите ограничение: в секции ИТОГИ произвольные выражения с ВЫБОР не используются — там указываются только агрегатные функции по полям. Если нужна итоговая строка с условной логикой, рассчитывайте её на уровне группировки или в СКД через вычисляемые поля.

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

Сравнение с альтернативами

ВЫБОР КОГДА — не единственный способ реализовать условную логику. В зависимости от задачи может быть удобнее другой инструмент.

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

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

Вычисляется на стороне СУБД, быстро, доступно в СКД и динамических списках. Ограничение — только одно возвращаемое значение и совместимость типов.

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

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

Обработка выборки в коде (Если…Тогда)

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

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

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

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

Типичные ошибки и ограничения

Первая группа ошибок — синтаксические: пропущенное слово КОНЕЦ, лишняя запятая перед КОНЕЦ, отсутствие ТОГДА. Конструктор запросов помогает их избежать, но при ручном редактировании текста они встречаются регулярно.

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

Третья группа — типизация. Возврат ссылки в одной ветке и строки в другой приводит к ошибке выполнения запроса. Также осторожность нужна с полями составного типа: сравнивать их и возвращать без приведения через ВЫРАЗИТЬ рискованно.

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

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

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

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

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

Записи с NULL в исходном поле
Норма

Попадают в ожидаемую ветку (обычно ИНАЧЕ) с понятным значением

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

В результате пустое значение, которое ломает отбор или группировку

Граничные значения диапазонов
Норма

Сумма ровно на границе попадает в задуманную категорию

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

Граничные значения уходят не в ту ветку из-за строгого неравенства

Тип вычисляемого поля
Норма

Во всех строках один тип, сортировка и итоги работают

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

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

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

FAQ: частые вопросы о ВЫБОР КОГДА

Можно ли вкладывать один ВЫБОР внутрь другого?

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

Что вернёт ВЫБОР, если ни одно условие не сработало и ИНАЧЕ нет?

Поле получит значение NULL. Это поведение нужно учитывать: последующие сравнения с этим полем через равенство не сработают, потребуется проверка ЕСТЬ NULL или обёртка функцией ЕСТЬNULL.

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

Да, конструкция допустима в условиях отбора, например: ГДЕ ВЫБОР КОГДА … КОНЕЦ = &Параметр. Однако для простых отборов читабельнее обычные логические выражения с И и ИЛИ — ВЫБОР в ГДЕ оправдан, когда критерий отбора сам вычисляется по условию.

Работает ли ВЫБОР КОГДА в динамических списках?

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

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

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

Почему запрос с ВЫБОР падает с ошибкой о несовместимости типов?

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

Итог

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

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