Разработка и Конфигурация · 11 мин
ВЫБОР КОГДА ТОГДА ИНАЧЕ в запросе 1С: подробное руководство
Как использовать конструкцию ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ в запросах 1С: синтаксис, типовые примеры, работа с NULL, ошибки и альтернативы условному оператору.
Конструкция ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ — это аналог оператора CASE в классическом SQL, встроенный в язык запросов 1С. Она позволяет вычислять значение поля по условию прямо в запросе, без постобработки результата в коде: подставлять текстовые статусы вместо числовых кодов, заменять NULL, группировать данные по вычисляемым категориям и строить условные агрегаты.
Главная выгода — перенос логики на уровень СУБД. Вместо того чтобы выгружать таблицу и в цикле проверять условия оператором Если...Тогда, разработчик получает готовое вычисленное поле сразу в выборке. Это сокращает объём кода, ускоряет отчёты и делает запросы самодостаточными для СКД и динамических списков, где постобработка в принципе недоступна.
Конструкция работает во всех современных версиях платформы 1С:Предприятие 8.3 и поддерживается везде, где используется язык запросов: в консоли запросов, схеме компоновки данных, динамических списках, виртуальных таблицах и вложенных запросах.
Синтаксис конструкции ВЫБОР в языке запросов 1С
Полная форма оператора выглядит так: после ключевого слова ВЫБОР идёт одна или несколько веток КОГДА условие ТОГДА значение, затем необязательная ветка ИНАЧЕ значение и обязательное слово КОНЕЦ. Проверка условий выполняется сверху вниз, и как только одно из них оказалось истинным, остальные ветки не вычисляются.
ВЫБОР
КОГДА Продажи.Сумма > 100000
ТОГДА "Крупная"
КОГДА Продажи.Сумма > 10000
ТОГДА "Средняя"
ИНАЧЕ "Мелкая"
КОНЕЦ КАК КатегорияСделки
В условиях КОГДА допустимы сравнения, МЕЖДУ, В, ПОДОБНО, проверки ЕСТЬ NULL и логические связки И, ИЛИ, НЕ. Результат каждой ветки ТОГДА — литерал, поле, параметр, выражение или даже вложенный ВЫБОР.
Если ни одно условие не сработало и ветка ИНАЧЕ отсутствует, поле получит значение NULL. Это частый источник неожиданностей, поэтому ИНАЧЕ рекомендуется указывать всегда, даже если по логике данных «других вариантов быть не может».
Типовые сценарии применения
Замена кодов и перечислений читаемыми статусами
Классическая задача — вывести в отчёт понятное пользователю представление вместо служебного значения. Например, преобразовать вид операции или признак проведения в текст:
ВЫБОР
КОГДА Документ.Проведен
ТОГДА "Проведён"
КОГДА Документ.ПометкаУдаления
ТОГДА "Помечен на удаление"
ИНАЧЕ "Черновик"
КОНЕЦ КАК Состояние
Такой подход особенно удобен в СКД, где вычисляемое поле сразу доступно для группировки, отбора и оформления без единой строки кода на встроенном языке.
Подстановка значения вместо NULL
При левых соединениях отсутствующие данные приходят как NULL, и прямое сравнение с ними не работает. ВЫБОР в паре с ЕСТЬ NULL решает задачу:
ВЫБОР
КОГДА Остатки.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Остатки.Количество
КОНЕЦ КАК Остаток
Для простой замены NULL существует более короткая функция ЕСТЬNULL(Поле, Значение), и в простых случаях она предпочтительнее. Но ВЫБОР выигрывает, когда замена зависит от условия: например, отрицательный остаток показать нулём, а NULL — текстом «нет данных».
Условные агрегаты в группировках
Мощный приём — поместить ВЫБОР внутрь агрегатной функции, чтобы посчитать сумму или количество только по нужным строкам. Так строятся сводные отчёты с колонками по категориям:
СУММА(ВЫБОР
КОГДА Обороты.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОпераций.Продажа)
ТОГДА Обороты.Сумма
ИНАЧЕ 0
КОНЕЦ) КАК СуммаПродаж
Один такой запрос заменяет несколько отдельных выборок с разными отборами и их последующее сведение в коде.
- 1Откройте конструктор запроса или консоль запросов и сформулируйте, какое условие должно определять значение поля
- 2Напишите конструкцию ВЫБОР с ветками КОГДА...ТОГДА, расположив условия от более частных к более общим
- 3Добавьте ветку ИНАЧЕ со значением по умолчанию и завершите словом КОНЕЦ, присвойте полю псевдоним через КАК
- 4Выполните запрос и проверьте результат на строках, попадающих в каждую ветку, включая граничные значения и NULL
Порядок условий и типы данных результата
Поскольку проверка идёт сверху вниз, порядок веток имеет значение. Если первым поставить условие Сумма > 0, а вторым Сумма > 100000, вторая ветка никогда не сработает: все крупные суммы уже перехвачены первой. Частные условия всегда размещают выше общих.
Второе правило касается типов. Все ветки ТОГДА и ИНАЧЕ должны возвращать совместимые типы данных: не смешивайте в одном ВЫБОРЕ число и строку, дату и булево. Платформа либо выдаст ошибку исполнения запроса, либо приведёт результат к неожиданному составному типу, что сломает сортировку и итоги в отчёте.
Если типы принципиально разные, приведите их явно через ВЫРАЗИТЬ(... КАК ...) или преобразуйте к строке. Также помните, что сравнение строк в условиях КОГДА зависит от регистра и пробелов — при необходимости используйте ПОДОБНО или обрезку пробелов в источнике данных.
ВЫБОР в условиях, соединениях и СКД
Конструкция допустима не только в списке выбираемых полей. Её можно использовать в секции ГДЕ, чтобы отобрать строки по вычисляемому условию, однако с осторожностью: отбор по выражению не использует индексы, и на больших таблицах такой запрос может выполняться заметно дольше. По возможности переносите условие в параметры виртуальных таблиц.
В условии соединения ВЫБОР применяют, когда ключ связи зависит от данных строки — например, для разных видов документов соединяться с разными таблицами. Это рабочий, но тяжёлый приём: часто проще и быстрее выполнить два отдельных запроса и объединить их через ОБЪЕДИНИТЬ ВСЕ.
В схеме компоновки данных поле-ВЫБОР объявляется один раз в запросе набора данных и дальше ведёт себя как обычное поле: доступно в ресурсах, отборах, группировках и условном оформлении. Для динамических списков это фактически единственный способ вывести вычисляемую колонку, потому что произвольный код в них не выполняется.
Альтернативы и когда их выбрать
Не каждая условная логика обязана жить в запросе. Для простой замены NULL короче и читаемее функция ЕСТЬNULL(). Для двух-трёх взаимоисключающих вариантов, зависящих от параметра отчёта, иногда удобнее оператор Если в коде, который формирует текст запроса до выполнения.
Если количество вариантов велико или они должны настраиваться пользователем без изменения кода, правильнее вынести соответствие в справочник или регистр сведений и соединиться с ним в запросе. ВЫБОР с двадцатью ветками КОГДА — признак того, что логика зашита в код и её пора выносить в данные.
Чем заменить сложную логику
Подходит для простой замены NULL значением по умолчанию; не умеет проверять произвольные условия
Подходит, когда вариантов много или они меняются пользователем; требует ведения данных, но избавляет запрос от громоздких веток
Подходит, когда для разных условий нужны разные источники данных; код длиннее, но каждый подзапрос прост и использует индексы
Подходит для логики, нужной только в отчёте; не работает в динамических списках и обычных запросах в коде
Проверка результата и отладка
Перед тем как встраивать конструкцию в рабочий отчёт, выполните запрос в консоли запросов на копии базы и убедитесь, что каждая ветка реально срабатывает. Подберите или создайте тестовые строки, попадающие в каждое условие, включая граничные значения: ровно пороговая сумма, пустая строка, NULL, отрицательное число.
Проверьте тип итогового поля: выведите его в таблицу значений и посмотрите, не превратился ли он в составной тип. Составной тип — сигнал, что ветки возвращают разнородные данные, и сортировка с итогами по этому полю будут вести себя непредсказуемо.
Для запросов с группировкой сверьте суммы условных агрегатов с контрольным расчётом: например, сумма по всем колонкам-категориям должна сойтись с общей суммой без ВЫБОРа. Расхождение означает, что часть строк не попала ни в одну ветку и потерялась из-за отсутствия ИНАЧЕ.
Как проверить результат
Каждая строка выборки получила осмысленное значение поля
Встречаются NULL там, где их быть не должно — не хватает ИНАЧЕ
Один простой тип (число, строка, дата) во всех строках
Составной тип — ветки возвращают разнородные значения
Строка с пороговым значением попадает в ожидаемую ветку
Граница уходит не в ту категорию — перепутаны знаки сравнения или порядок условий
Сумма условных колонок равна общей сумме
Часть суммы потеряна — строки не попали ни в одно условие
Частые вопросы о ВЫБОР КОГДА ТОГДА ИНАЧЕ в 1С
Обязательна ли ветка ИНАЧЕ?
Синтаксически — нет, конструкция без ИНАЧЕ допустима. Но если ни одно условие КОГДА не выполнится, поле получит NULL, что часто ломает сортировку, итоги и последующие сравнения. Поэтому на практике ИНАЧЕ указывают всегда, хотя бы со значением по умолчанию.
Можно ли вкладывать один ВЫБОР внутрь другого?
Да, вложенные конструкции разрешены и в ветках ТОГДА, и в ИНАЧЕ. Однако больше двух уровней вложенности делают запрос трудночитаемым — в таких случаях стоит пересмотреть логику: разбить запрос на временные таблицы или вынести соответствия в справочник.
Чем ВЫБОР отличается от ЕСТЬNULL?
ЕСТЬNULL решает одну задачу — замену NULL указанным значением, и записывается короче. ВЫБОР универсальнее: проверяет любые условия, а не только NULL, и возвращает разные значения для разных ситуаций. Для простой замены NULL используйте ЕСТЬNULL, для условной логики — ВЫБОР.
Работает ли ВЫБОР в динамических списках и СКД?
Да, конструкция полностью поддерживается в тексте запроса динамического списка и в наборах данных СКД. Более того, для динамических списков это единственный способ получить вычисляемую колонку, поскольку произвольный код при формировании списка не выполняется.
Почему условие КОГДА Поле = 0 не срабатывает, хотя значение пустое?
Скорее всего, поле содержит NULL, а любое сравнение с NULL даёт ложь. Добавьте первой веткой проверку КОГДА Поле ЕСТЬ NULL ТОГДА с нужным результатом — тогда пустые значения будут обработаны корректно.
Влияет ли ВЫБОР на производительность запроса?
Сама конструкция в списке полей почти бесплатна — вычисление идёт построчно при выводе. Замедление возникает, когда ВЫБОР используют в условиях ГДЕ или соединениях: такие выражения не используют индексы. По возможности выносите отборы в параметры виртуальных таблиц.
Что важно запомнить
ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ — условный оператор языка запросов 1С для вычисления полей по условиям. Располагайте частные условия выше общих, всегда добавляйте ИНАЧЕ, следите за единым типом результата и помните, что NULL сравнением не проверяется — только через ЕСТЬ NULL. Для простой замены NULL используйте ЕСТЬNULL, а слишком разросшуюся логику выносите в справочники.