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