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