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

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

Несколько условий КОГДА в конструкции ВЫБОР в запросах 1С

Как использовать несколько условий КОГДА в конструкции ВЫБОР КОГДА в запросах 1С: синтаксис, вложенные варианты, типичные ошибки и проверка результата.

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

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

Ниже разобран синтаксис конструкции с несколькими КОГДА, приёмы объединения условий через И/ИЛИ, вложенные варианты, ограничения по типам возвращаемых значений и способы проверить результат до того, как запрос попадёт в рабочий отчёт.

Базовый синтаксис конструкции ВЫБОР с несколькими КОГДА

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

ВЫБОР

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

ТОГДА "Крупный клиент"

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

ТОГДА "Средний клиент"

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

ТОГДА "Мелкий клиент"

ИНАЧЕ "Без продаж"

КОНЕЦ КАК КатегорияКлиента

Обратите внимание на порядок: проверка идёт от большего порога к меньшему. Если поменять ветки местами и первой поставить Сумма > 0, то все клиенты с любыми продажами попадут в «Мелкий клиент», а до остальных условий выполнение просто не дойдёт. Это логичное поведение, но именно на нём чаще всего ошибаются.

Псевдоним поля (конструкция КАК КатегорияКлиента) ставится один раз после слова КОНЕЦ, а не после каждой ветки. Попытка присвоить псевдоним внутри конструкции приведёт к синтаксической ошибке при проверке запроса.

Как объединить несколько условий в одной ветке КОГДА

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

ВЫБОР

КОГДА Заказы.Сумма >= 10000 И Заказы.Оплачен

ТОГДА "Готов к отгрузке"

КОГДА Заказы.Статус В ("Новый", "В работе")

ТОГДА "Требует обработки"

КОГДА НЕ Заказы.ПометкаУдаления

ТОГДА "Активный"

ИНАЧЕ "Прочее"

КОНЕЦ КАК СостояниеЗаказа

Скобки обязательны, когда смешиваются И и ИЛИ: приоритет у И выше, и без скобок условие может быть истолковано не так, как задумано. Правило простое — если в условии больше двух логических частей, всегда расставляйте скобки явно, даже если без них запрос работает. Это защитит от ошибок при дальнейших правках.

Оператор В (...) удобен вместо цепочки сравнений через ИЛИ: запись Поле В ("А", "Б", "В") короче и читается легче, чем Поле = "А" ИЛИ Поле = "Б" ИЛИ Поле = "В". Для проверки диапазонов используйте МЕЖДУ ... И ... с учётом того, что границы включаются в диапазон.

Порядок веток и почему он критичен

Платформа вычисляет условия последовательно и останавливается на первом истинном. Из этого следуют два практических правила. Первое: более частные условия ставятся выше более общих. Проверка «сумма больше 100 000» должна идти раньше проверки «сумма больше 10 000», иначе узкая ветка никогда не сработает.

Второе правило: ветка с условием, которое истинно почти всегда (например, проверка на непустое значение), не должна стоять в начале. Она «перехватит» все записи, и нижние ветки окажутся мёртвым кодом — запрос отработает без ошибок, но результат будет неверным, и найти причину без внимательного чтения сложно.

Типичные ошибки
01
Общее условие стоит выше частного — узкая ветка никогда не срабатывает, и в отчёте все строки получают одно значение
02
Отсутствует ветка ИНАЧЕ — для записей, не попавших ни в одно условие, возвращается NULL, что ломает сравнения и группировки ниже по запросу
03
Ветки возвращают значения разных типов (строка и число) — результат поля становится неопределённого типа, и СКД или код не может его корректно обработать
04
Смешаны И и ИЛИ без скобок — условие истолковывается не так, как задумано, из-за приоритета операторов

Ветка ИНАЧЕ и работа с NULL

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

Поэтому ИНАЧЕ стоит указывать практически всегда, даже если кажется, что все варианты перечислены. Данные имеют свойство со временем меняться: в справочник добавят новое значение, и записи молча уйдут в NULL. Осмысленное значение ИНАЧЕ («Прочее», «Не определено») сразу покажет такие случаи и упростит диагностику.

Если же NULL уже присутствует во входных данных (например, после левого соединения таблиц), проверяйте его первой веткой через КОГДА Поле ЕСТЬ NULL ТОГДА .... Сравнение Поле = NULL не работает — такое условие никогда не будет истинным.

Ограничения по типам возвращаемых значений

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

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

Ссылки на разные справочники в разных ветках допустимы, но тоже дают составной тип. Если дальше по этому полю планируется соединение с другой таблицей, составной тип замедлит запрос и усложнит соединение. В таких случаях лучше пересмотреть логику и вернуть единый тип либо вынести разные ссылки в разные поля.

Вложенные конструкции ВЫБОР и альтернатива через соединение

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

Сравнение подходов

Несколько КОГДА в одном ВЫБОР

Подходит для 3–10 независимых условий; читается легко, порядок веток контролируется визуально

Вложенный ВЫБОР

Оправдан только для двухуровневой логики; глубже двух уровней — запрос становится трудным в поддержке

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

Лучший вариант, когда вариантов много или они хранятся в данных: соединение с регистром сведений или справочником вместо жёсткого перечисления в запросе

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

Подходит, если логика нужна только для отображения в отчёте и не должна влиять на выборку данных

Альтернатива, о которой часто забывают: если значения зависят от данных, а не от жёсткой логики (например, категория клиента хранится в регистре сведений), то вместо длинного ВЫБОР правильнее сделать левое соединение с этим регистром. Запрос станет короче, а изменение данных не потребует правки кода.

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

Проверка результата перед использованием

После написания запроса с несколькими КОГДА проверьте его до включения в отчёт или процедуру. Самый быстрый способ — консоль запросов: выполните запрос на реальных данных и отсортируйте результат по вычисляемому полю. Вы сразу увидите, все ли ожидаемые значения появились и нет ли среди них NULL или неожиданных «Прочее» в большом количестве.

Полезный приём — вывести рядом с вычисляемым полем исходные поля, участвующие в условиях. Тогда для каждой строки видно, почему сработала именно та ветка. Если строка получила значение «Мелкий клиент», а сумма в ней 150 000, — порядок веток нарушен, и это видно сразу.

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

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

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

Присутствуют все ожидаемые варианты из веток ТОГДА и ИНАЧЕ

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

Встречается только одно-два значения или много NULL

Строки со значением из ИНАЧЕ
Норма

Их мало, и это действительно нестандартные случаи

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

В ИНАЧЕ попала значительная часть записей — условия не покрывают реальные данные

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

Во всех строках значения одного типа, итоги и сортировка работают

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

Смешение типов, сортировка ведёт себя странно, СКД выдаёт ошибку при вычислении итогов

Дополнительно стоит проверить граничные значения: ровно на пороге условия (сумма точно 100 000), нулевое значение, NULL во входных данных. Границы диапазонов — то место, где расходятся ожидания постановщика задачи и написанное условие: «больше 100 000» и «не меньше 100 000» — разные вещи, и уточнить это нужно до сдачи отчёта.

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

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

Сколько веток КОГДА можно использовать в одной конструкции ВЫБОР?

Жёсткого ограничения на количество веток нет — можно написать десятки условий. Практический предел определяется читаемостью: если веток больше десяти и они перечисляют значения из данных, почти всегда лучше заменить конструкцию соединением с таблицей соответствий.

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

Конструкция вернёт NULL. Такое значение не равно ни пустой строке, ни нулю, не участвует корректно в сравнениях и выделяется в отдельную группу при группировке. Чтобы избежать скрытых NULL, добавляйте ветку ИНАЧЕ с понятным значением.

Можно ли в условии КОГДА сравнивать с NULL через знак равенства?

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

Почему в отчёте СКД вычисляемое поле с ВЫБОР показывает не все значения?

Чаще всего причина в порядке веток: широкое условие перехватывает записи раньше узких. Вторая типичная причина — смешение типов в ветках, из-за которого часть значений обрабатывается некорректно. Проверьте запрос отдельно в консоли запросов, выведя рядом исходные поля условий.

Можно ли использовать ВЫБОР в условии ГДЕ или в соединении?

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

Как сократить запись, если проверяется много значений одного поля?

Используйте оператор В (...) внутри одного КОГДА вместо цепочки равенств через ИЛИ: КОГДА Поле В ("А", "Б", "В") ТОГДА .... Если значений очень много и они хранятся в данных, замените перечисление соединением с таблицей, содержащей эти значения.

Итог

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

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