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