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

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

ВЫБОР КОГДА в запросе 1С: как задать два условия через И

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

Конструкция ВЫБОР КОГДА в языке запросов 1С — аналог оператора CASE в SQL. Она позволяет вернуть разные значения в зависимости от условий прямо в тексте запроса, без постобработки в коде. Когда нужно проверить сразу два условия одновременно (например, «статус = Проведен И сумма больше 10000»), их объединяют логическим оператором И внутри одной ветки КОГДА.

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

Ниже разобран синтаксис, рабочие примеры, отличия полной и сокращенной формы ВЫБОР, типичные ошибки с типами данных и способы проверить, что запрос возвращает ожидаемый результат.

Синтаксис ВЫБОР КОГДА с оператором И

Полная форма конструкции выглядит так:

ВЫБОР

КОГДА Условие1 И Условие2

ТОГДА Значение1

КОГДА Условие3

ТОГДА Значение2

ИНАЧЕ ЗначениеПоУмолчанию

КОНЕЦ

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

Ветка ИНАЧЕ необязательна, но без нее при несрабатывании всех условий поле вернет NULL. Это частая причина «пустых» значений в отчетах и ошибок при сравнениях дальше по коду. Рекомендуется всегда явно указывать ИНАЧЕ, даже если кажется, что условия покрывают все варианты.

Рабочий пример: классификация документов по двум признакам

Задача: вывести список реализаций и пометить крупные проведенные документы как «Крупная», остальные проведенные — «Обычная», непроведенные — «Черновик».

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.СуммаДокумента КАК Сумма,

ВЫБОР

КОГДА Реализация.Проведен

И Реализация.СуммаДокумента > 100000

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

КОГДА Реализация.Проведен

ТОГДА "Обычная"

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

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

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

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

Два условия по разным полям и по одному полю

Условия по разным полям

Чаще всего И объединяет проверки разных реквизитов: статус и сумма, склад и вид номенклатуры, контрагент и валюта. Пример для отбора номенклатуры по складу и остатку:

ВЫБОР

КОГДА Остатки.Склад = &ОсновнойСклад

И Остатки.КоличествоОстаток < Остатки.Номенклатура.МинимальныйОстаток

ТОГДА "Заказать срочно"

КОГДА Остатки.КоличествоОстаток < Остатки.Номенклатура.МинимальныйОстаток

ТОГДА "Заказать"

ИНАЧЕ "Достаточно"

КОНЕЦ

Два условия по одному полю (диапазон)

Через И удобно задавать диапазоны значений одного поля — «больше нижней границы и меньше верхней»:

ВЫБОР

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

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

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

ТОГДА "Крупный чек"

ИНАЧЕ "Мелкий чек"

КОНЕЦ

Здесь И заменяет оператор МЕЖДУ. Учтите: МЕЖДУ включает границы с обеих сторон, а при ручном задании диапазона через И вы сами контролируете строгость неравенств. Следите, чтобы границы соседних диапазонов не пересекались и не оставляли «дыр».

Сокращенная форма и сравнение с NULL

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

Отдельная ловушка — сравнение с NULL. Условие «Поле = NULL» всегда дает ложь, даже если поле действительно NULL. Правильная проверка — «Поле ЕСТЬ NULL». Внутри ВЫБОР КОГДА это выглядит так:

ВЫБОР

КОГДА Документ.Менеджер ЕСТЬ NULL

ТОГДА "Не назначен"

КОГДА Документ.Менеджер = &ТекущийПользователь

И Документ.Проведен

ТОГДА "Мой проведенный"

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

КОНЕЦ

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

Совместимость типов возвращаемых значений

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

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

Типичные ошибки
01
Общая ветка КОГДА стоит выше частной — строгое условие никогда не срабатывает
02
Сравнение с NULL через равенство — ветка молча не работает
03
Отсутствие ИНАЧЕ — в поле появляются неожиданные NULL
04
Смешение типов в ТОГДА/ИНАЧЕ — ошибка исполнения или неверные итоги
05
Пересекающиеся диапазоны через И без скобок и контроля границ — строки попадают не в ту категорию

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

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

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

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

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

Количество строк в выборке
Норма

Совпадает с запросом без поля ВЫБОР

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

Строки пропали или задвоились — ошибка в соединениях, а не в ВЫБОР

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

Каждая строка попала в ожидаемую категорию

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

Все значения одинаковые или NULL — неверный порядок веток или сравнение с NULL

Граничные значения
Норма

Сумма на границе попадает в нужный диапазон

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

Граница попадает не туда или никуда — проверьте строгость неравенств

Альтернативы и когда их применять

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

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

Маршрут решения

Как выбрать подход

2–5 простых условий по полям одной таблицыИспользуйте ВЫБОР КОГДА с операторами И/ИЛИ прямо в запросе
Правила классификации часто меняются пользователямиВынесите соответствие в справочник или регистр сведений и получайте соединением
Нужно простое равенство одного поля разным значениямПодойдет сокращенная форма ВЫБОР Поле КОГДА Значение
Логика требует обхода связанных данных и расчетовРассмотрите временные таблицы и обработку результата в коде
Итог

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

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

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

Можно ли объединить три и более условий через И?

Да, операторов И в одной ветке может быть сколько угодно: КОГДА Условие1 И Условие2 И Условие3. Для читаемости длинные выражения разбивают по строкам и группируют скобками, особенно при смешении И и ИЛИ.

Чем отличается И от ИЛИ внутри КОГДА?

И требует истинности всех условий одновременно, ИЛИ — хотя бы одного. Например, «Проведен И Сумма > 100000» выберет только крупные проведенные, а «Проведен ИЛИ Сумма > 100000» — все проведенные плюс все крупные, включая черновики.

Почему поле ВЫБОР возвращает пустые значения?

Чаще всего ни одна ветка КОГДА не сработала, а ИНАЧЕ не задано — тогда результат NULL. Вторая причина — сравнение с NULL через равенство, которое всегда ложно. Добавьте ИНАЧЕ и проверку ЕСТЬ NULL первой веткой.

Можно ли использовать параметры запроса в условиях?

Да, параметры (&ИмяПараметра) свободно применяются внутри условий КОГДА и в значениях ТОГДА/ИНАЧЕ. Перед выполнением запроса параметры нужно установить через УстановитьПараметр, иначе запрос завершится ошибкой.

Работает ли ВЫБОР КОГДА в СКД и динамических списках?

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

Что быстрее: несколько веток КОГДА или вложенный ВЫБОР?

Плоская цепочка КОГДА с условиями через И читается и оптимизируется лучше, чем вложенные ВЫБОР внутри ВЫБОР. Вложенность оправдана только когда логика действительно иерархическая и не выражается плоскими условиями.