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