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