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