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

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

Конструкция КОГДА в запросе 1С: как работает ВЫБОР и где её применять

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

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

Многие разработчики ищут «1С в запросе когда», потому что в языке запросов нет привычного оператора ЕСЛИ — вместо него используется именно ВЫБОР с ветками КОГДА. Ниже разобран синтаксис, типовые сценарии, ограничения по типам данных, частые ошибки и способы проверить результат.

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

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

ВЫБОР

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

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

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

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

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

КОНЕЦ КАК КатегорияДокумента

Ветки проверяются сверху вниз, срабатывает первая истинная. Поэтому порядок условий важен: если поставить проверку «больше 10000» выше, чем «больше 100000», крупные документы никогда не попадут в свою категорию.

Есть и сокращённая форма для простого сравнения одного выражения с несколькими значениями: ВЫБОР выражение КОГДА значение1 ТОГДА ... КОНЕЦ. Она удобна, когда проверяется равенство одного поля разным константам, например виду номенклатуры.

Типовые сценарии применения

Замена NULL на значение по умолчанию

При левом соединении поля присоединённой таблицы могут быть NULL. Вместо ЕСТЬNULL иногда удобнее ВЫБОР, если заменяющее значение зависит от условия:

ВЫБОР

КОГДА Остатки.Количество ЕСТЬ NULL

ТОГДА 0

КОГДА Остатки.Количество < 0

ТОГДА 0

ИНАЧЕ Остатки.Количество

КОНЕЦ КАК ДоступныйОстаток

Вычисляемые статусы и признаки

Частая задача — вывести текстовый статус документа или строковое представление булева поля, чтобы затем использовать его в отчёте без дополнительного кода:

ВЫБОР

КОГДА Документ.Проведен

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

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

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

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

КОНЕЦ КАК Состояние

Условная агрегация в итогах

ВЫБОР внутри СУММА позволяет посчитать в одном запросе несколько показателей по разным условиям — например, отдельно суммы прихода и расхода:

СУММА(ВЫБОР КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)

ТОГДА Движения.Количество ИНАЧЕ 0 КОНЕЦ) КАК Приход,

СУММА(ВЫБОР КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)

ТОГДА Движения.Количество ИНАЧЕ 0 КОНЕЦ) КАК Расход

Этот приём заменяет два отдельных запроса и существенно упрощает отчёты, где нужны «развёрнутые» колонки по категориям.

Порядок действий при написании условного поля
  1. 1
    Определите, какие значения должно принимать поле и при каких условиях.
  2. 2
    Запишите ветки КОГДА от более частного условия к более общему.
  3. 3
    Добавьте ИНАЧЕ со значением по умолчанию, чтобы избежать NULL.
  4. 4
    Проверьте, что все ветки возвращают один тип данных, при необходимости используйте ВЫРАЗИТЬ.
  5. 5
    Выполните запрос в консоли запросов и проверьте результат на граничных значениях.

Ограничения и требования к типам данных

Главное ограничение: все ветки ТОГДА и ИНАЧЕ должны возвращать значения совместимых типов. Нельзя в одной ветке вернуть строку, а в другой — число: запрос либо не выполнится, либо тип поля будет определён не так, как ожидает разработчик. Если типы различаются, приведите их явно через ВЫРАЗИТЬ(... КАК Строка(50)) или подберите единый формат значений.

Второй нюанс — строки разной длины. Если в одной ветке строка из 10 символов, а в другой из 100, итоговый тип поля может оказаться усечённым в некоторых сценариях использования, особенно в СКД и при выгрузке во временные таблицы. Безопаснее явно приводить строки к нужной длине.

Третий момент — производительность. Сложные условия с подзапросами внутри КОГДА выполняются для каждой строки результата. Если условие тяжёлое, иногда выгоднее вынести его во временную таблицу и соединиться с ней, чем вычислять многократно.

Типичные ошибки
01
Отсутствие ветки ИНАЧЕ — поле получает NULL, что ломает сортировку, группировку и вывод в отчёте.
02
Неверный порядок веток КОГДА — общее условие стоит выше частного, и частная ветка никогда не срабатывает.
03
Разные типы данных в ветках ТОГДА — ошибка выполнения запроса или непредсказуемый тип поля.
04
Сравнение с NULL через знак равенства вместо ЕСТЬ NULL — условие никогда не выполняется.
05
Использование ВЫБОР там, где достаточно ЕСТЬNULL — лишняя громоздкость и риск ошибки.

ВЫБОР против ЕСТЬNULL и других альтернатив

Для простой замены NULL на конкретное значение функция ЕСТЬNULL(Поле, 0) короче и читабельнее, чем ВЫБОР с проверкой ЕСТЬ NULL. Используйте её, когда условие одно и замена одна.

Если значение зависит от справочных данных — например, ставка НДС хранится в регистре сведений, — правильнее соединиться с этим регистром, а не зашивать значения в ветки КОГДА. Жёстко прописанные в запросе константы усложняют сопровождение: при изменении бизнес-правил придётся искать и править все запросы.

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

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

ВЫБОР КОГДА

Несколько условий или разные значения по условиям. Универсален, но громоздок для простых случаев.

ЕСТЬNULL

Только замена NULL на конкретное значение. Короче и быстрее читается.

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

Значение зависит от данных другой таблицы или часто меняется. Масштабируется без правки запроса.

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

Логика нужна только для отображения в отчёте, запрос должен остаться простым.

Проверка результата и отладка

Перед переносом запроса в код или схему компоновки выполните его в консоли запросов на реальных данных. Особое внимание уделите граничным значениям условий: сумме ровно на пороге, пустым датам, NULL после соединений.

Признак корректной работы — отсутствие NULL в вычисляемом поле (если вы добавили ИНАЧЕ) и ожидаемое распределение строк по категориям. Если все строки попали в одну ветку, проверьте порядок условий и тип сравниваемых значений: например, сравнение строки с числом в некоторых СУБД даёт неочевидный результат.

Для отладки сложной конструкции временно выведите само условие отдельным полем как булево значение — так видно, какие строки проходят проверку, а какие нет.

Контрольные точки

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

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

Каждая строка получила ожидаемое значение, NULL нет

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

Встречаются NULL или все строки в одной категории

Граничные значения условий
Норма

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

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

Пороговые строки в неправильной категории

Тип поля в результате
Норма

Единый тип, достаточная длина строки

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

Смешанные типы, усечённые строки

FAQ

Можно ли использовать несколько условий в одной ветке КОГДА?

Да. Условие — это обычное логическое выражение, поэтому допустимы И, ИЛИ, НЕ и скобки: КОГДА Сумма > 1000 И НЕ Отменен ТОГДА ... Следите только за приоритетом операторов и при сомнениях расставляйте скобки явно.

Что произойдёт, если не указать ИНАЧЕ?

Если ни одно условие КОГДА не выполнилось, поле получит значение NULL. Это может нарушить группировку, сортировку и вывод в отчёте, поэтому ветку ИНАЧЕ рекомендуется добавлять всегда, даже со значением по умолчанию.

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

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

Работает ли ВЫБОР в параметрах виртуальных таблиц и в условии ГДЕ?

Да, конструкция допустима везде, где разрешено выражение: в ГДЕ, ИМЕЮЩИЕ, соединениях, параметрах виртуальных таблиц. Учтите, что в условиях отбора сложный ВЫБОР может мешать оптимизатору использовать индексы.

Как сравнить поле с перечислением в условии КОГДА?

Используйте функцию ЗНАЧЕНИЕ с полным именем значения перечисления: КОГДА Документ.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыДокумента.Согласован) ТОГДА ... Также можно передать значение параметром через амперсанд.

Итог

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

ВЫБОР КОГДА — единственный способ реализовать условную логику внутри запроса 1С. Соблюдайте порядок веток от частного к общему, всегда добавляйте ИНАЧЕ и приводите значения веток к одному типу. Для простой замены NULL используйте ЕСТЬNULL, а изменяемые бизнес-правила выносите в таблицы, а не в текст запроса.