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

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

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

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

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

Без ВЫБОР КОГДА разработчику пришлось бы обходить результат запроса в цикле и вычислять условные значения кодом — это дольше по времени разработки и медленнее при выполнении, потому что логика переносится с сервера СУБД на клиентский или серверный код 1С. Правильно написанная конструкция ВЫБОР выполняется на стороне базы данных и не требует постобработки.

Конструкция работает во всех современных версиях платформы 1С:Предприятие 8 и поддерживается конструктором запросов, что упрощает написание для тех, кто не помнит синтаксис наизусть. Ниже разобраны синтаксис, типовые сценарии, ошибки и способы проверить корректность результата.

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

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

ВЫБОР

КОГДА Продажи.Сумма >= 100000

ТОГДА "Крупная"

КОГДА Продажи.Сумма >= 10000

ТОГДА "Средняя"

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

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

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

Если ни одно условие не выполнилось и ветка ИНАЧЕ отсутствует, функция вернёт NULL. Это частая причина «пустых» значений в отчётах: разработчик забыл ИНАЧЕ, а часть строк не подпала ни под одно условие.

Простые условия: подстановка значений

Самый частый сценарий — преобразование ссылочного или булевого значения в понятный текст. Например, вместо вывода значения перечисления «ВидОперации» в отчёт выводят читаемый статус документа.

ВЫБРАТЬ

Реализация.Номер,

ВЫБОР

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

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

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

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

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

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

ИЗ

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

Обратите внимание: сравнение булевых полей записывается без «= ИСТИНА» — достаточно самого поля в условии КОГДА. Форма «КОГДА Поле = ИСТИНА» тоже допустима, но считается избыточной.

В ветках ТОГДА можно возвращать не только литералы, но и поля запроса, параметры и выражения. Например, «ТОГДА Реализация.СуммаДокумента * 0.9» — корректная ветка, вычисляющая сумму со скидкой.

Составные условия и работа с NULL

Условия в КОГДА могут объединяться логическими операторами И, ИЛИ, НЕ и содержать скобки. Это позволяет описывать сложную бизнес-логику без вложенных ВЫБОР.

ВЫБОР

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

И Заказ.Контрагент.Категория = &VIP

ТОГДА "Приоритетный"

ИНАЧЕ "Стандартный"

КОНЕЦ

Особая тема — сравнение с NULL. Обычное равенство «Поле = NULL» никогда не истинно: в трёхзначной логике SQL сравнение с NULL даёт неопределённость. Для проверки используйте конструкцию «Поле ЕСТЬ NULL» или функцию ЕСТЬNULL внутри условия.

ВЫБОР

КОГДА Остатки.Склад ЕСТЬ NULL

ТОГДА "Склад не указан"

ИНАЧЕ Остатки.Склад.Наименование

КОНЕЦ

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

Классический приём аналитических отчётов — условное суммирование: одна колонка считает, например, только дебетовые обороты, другая — только кредитовые. Для этого ВЫБОР вкладывается внутрь агрегатной функции СУММА.

ВЫБРАТЬ

Обороты.Счет,

СУММА(ВЫБОР

КОГДА Обороты.СуммаОборотДт > 0

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

ИНАЧЕ 0

КОНЕЦ) КАК Дебет,

СУММА(ВЫБОР

КОГДА Обороты.СуммаОборотКт > 0

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

ИНАЧЕ 0

КОНЕЦ) КАК Кредит

ИЗ

РегистрБухгалтерии.Хозрасчетный.Обороты КАК Обороты

СГРУППИРОВАТЬ ПО

Обороты.Счет

Важное правило: внутри СУММА ветка ИНАЧЕ должна возвращать 0, а не NULL. СУММА игнорирует NULL-значения, поэтому формально запрос сработает и так, но если все значения группы окажутся NULL, итог тоже станет NULL вместо ожидаемого нуля — это ломает последующие вычисления и итоги в СКД.

Само поле с ВЫБОР, не обёрнутое в агрегат, должно либо входить в секцию СГРУППИРОВАТЬ ПО, либо строиться только от группировочных полей — иначе запрос вернёт ошибку ещё на этапе проверки.

Сравнение ВЫБОР с альтернативами

ВЫБОР КОГДА — не единственный способ условной логики в запросах 1С. В ряде задач короче и надёжнее использовать специализированные функции.

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

ВЫБОР КОГДА

Универсальный вариант для любых условий и нескольких веток. Избыточен для простой подмены NULL.

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

Короткая замена NULL на значение по умолчанию. Не умеет проверять произвольные условия — только NULL.

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

Подходит, когда вариантов много (десятки) и они хранятся в справочнике или регистре. Запрос остаётся читаемым, соответствия редактируются без изменения кода.

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

Условие вычисляется при формировании отчёта, а не в запросе. Удобно для оформления, но медленнее и недоступно вне СКД.

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

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

Типичные ошибки и как их проверить

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

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

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

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

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

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

Встречаются NULL или значения не из списка веток

Границы условий
Норма

Значение ровно на пороге попадает в нужную ветку согласно знаку сравнения

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

Пограничные строки относятся к соседней категории

Итоги по группам
Норма

Суммы сходятся с контрольным расчётом без условий

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

Итог меньше ожидаемого — часть строк попала в NULL и выпала

Практические рекомендации

Выносите повторяющиеся вычисления ВЫБОР во временную таблицу, если одно и то же условное поле используется в нескольких местах пакетного запроса. Это упрощает сопровождение: логика меняется в одном месте, а не в трёх копиях конструкции.

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

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

Итог

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

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

Частые вопросы

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

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

Что вернёт ВЫБОР, если ни одно условие не выполнилось?

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

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

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

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

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

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

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

Влияет ли ВЫБОР КОГДА на скорость запроса?

В секции ВЫБРАТЬ влияние минимально — условия вычисляются построчно на сервере СУБД. Замедление возможно, если ВЫБОР с функциями над полями поместить в условие соединения или отбора: это может отключить использование индексов. Вычисляемые поля держите в списке выборки, а не в отборах.