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

Отчеты и Аналитика · 11 мин

Выражение ВЫБОР КОГДА в СКД 1С: синтаксис, примеры и ошибки

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

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

Типичная задача — вывести текстовое представление состояния вместо числового кода, подставить «Нет данных» вместо NULL, рассчитать скидку по шкале или разнести суммы по колонкам в зависимости от вида операции. Всё это решается одной конструкцией ВЫБОР КОГДА, без написания обработчиков и без изменения конфигурации.

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

Где именно в СКД применяется ВЫБОР КОГДА

Первый и основной контекст — текст запроса набора данных. Здесь доступен полный синтаксис языка запросов 1С: можно использовать вложенные условия, сравнения с параметрами, проверку на NULL через ЕСТЬ NULL, логические операторы И, ИЛИ, НЕ. Результат выражения становится обычным полем набора данных, которое дальше участвует в группировках, отборах и ресурсах.

Второй контекст — вычисляемые поля на закладке «Вычисляемые поля» конструктора СКД. Там действует язык выражений компоновки данных, где вместо ВЫБОР КОГДА используется оператор «?» (тернарный оператор): ?(Условие, Значение1, Значение2). Попытка написать ВЫБОР КОГДА в вычисляемом поле приведёт к ошибке — схема компоновки его просто не распознает.

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

Синтаксис конструкции в запросе набора данных

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

Простой пример — вывод текстового статуса по числовому коду:

ВЫБОР

КОГДА Заказы.Статус = 1

ТОГДА "Новый"

КОГДА Заказы.Статус = 2

ТОГДА "В работе"

КОГДА Заказы.Статус = 3

ТОГДА "Завершён"

ИНАЧЕ "Не определён"

КОНЕЦ КАК СтатусТекст

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

bsl
ВЫБОР
	КОГДА Продажи.Сумма >= 100000
		ТОГДА "Крупная"
	КОГДА Продажи.Сумма >= 10000
		ТОГДА "Средняя"
	ИНАЧЕ "Мелкая"
КОНЕЦ КАК КатегорияСделки

Типичные сценарии использования

Распределение сумм по колонкам

Классическая задача отчётов — вывести в разные колонки суммы по признаку операции. Например, отдельно приход и расход из одного оборотного регистра:

ВЫБОР

КОГДА Обороты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)

ТОГДА Обороты.Сумма

ИНАЧЕ 0

КОНЕЦ КАК Приход

Такие поля затем суммируются как ресурсы, и отчёт показывает приход и расход в соседних колонках без дополнительных наборов данных и связей.

Замена NULL на читаемое значение

При левых соединениях таблиц часть полей оказывается NULL. ВЫБОР КОГДА вместе с проверкой ЕСТЬ NULL позволяет вывести понятное значение: ВЫБОР КОГДА Таблица.Поле ЕСТЬ NULL ТОГДА "Нет данных" ИНАЧЕ Таблица.Поле КОНЕЦ. Учтите, что для смешанных типов (строка вместо ссылочного значения) могут быть ограничения по типизации — надёжнее использовать выражение ЕСТЬNULL(Поле, Значение), если типы совместимы.

Условия с параметрами отчёта

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

Порядок добавления условного поля
  1. 1
    Откройте схему компоновки данных и текст запроса набора данных
  2. 2
    Добавьте конструкцию ВЫБОР КОГДА с веткой ИНАЧЕ и псевдонимом КАК
  3. 3
    Проверьте, что поле появилось в списке доступных полей на закладке «Настройки»
  4. 4
    Добавьте поле в выбранные поля или ресурсы отчёта
  5. 5
    Сформируйте отчёт и сверьте значения с исходными данными

ВЫБОР КОГДА и вычисляемые поля: в чём разница

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

В вычисляемом поле условие записывается тернарным оператором: ?(Сумма > 0, Сумма, 0). Язык выражений СКД не поддерживает вложенные КОГДА-цепочки напрямую, но операторы «?» можно вкладывать друг в друга: ?(А = 1, "Один", ?(А = 2, "Два", "Другое")). При большом числе веток такая запись быстро становится нечитаемой — это признак того, что логику лучше перенести в запрос.

Где размещать условную логику

ВЫБОР КОГДА в запросе

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

Тернарный оператор ? в вычисляемом поле

Подходит для простых проверок по уже полученным полям. Ограничение: нет доступа к таблицам, плохо читается при вложенности.

Пользовательское поле «Выбор»

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

Частые ошибки и как их избежать

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

Вторая типичная проблема — забытая ветка ИНАЧЕ. При появлении в данных значений, не предусмотренных условиями (например, нового статуса документа), поле молча станет NULL, и итоги отчёта исказятся. Всегда добавляйте ИНАЧЕ с осмысленным значением по умолчанию — это одновременно и защита, и индикатор неучтённых случаев.

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

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

Проверка результата и отладка

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

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

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

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

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

Каждое значение соответствует исходным данным, пустых ячеек нет

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

Пустые ячейки или значение из ветки ИНАЧЕ там, где должна сработать конкретная ветка

Итоги по ресурсам
Норма

Итоги совпадают с контрольным расчётом по регистру

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

Итоги меньше ожидаемых — часть строк ушла в NULL

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

Значение ровно на пороге попадает в нужную категорию

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

Граничное значение попадает не в ту ветку из-за строгого или нестрогого сравнения

Ограничения и альтернативы

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

Ещё одна альтернатива — пользовательские поля в настройках СКД. Поле типа «Выбор» позволяет задать пары «условие — значение» визуально, и конечный пользователь может менять их самостоятельно. Это снимает с разработчика рутинные правки схемы, но требует, чтобы нужные поля были доступны в настройках.

Итог

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

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

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

Можно ли использовать ВЫБОР КОГДА в вычисляемом поле СКД?

Нет, в вычисляемых полях действует язык выражений компоновки данных, где вместо ВЫБОР КОГДА применяется тернарный оператор: ?(Условие, Значение1, Значение2). Для нескольких условий операторы вкладывают друг в друга, но при большом числе веток логику лучше перенести в запрос набора данных.

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

Если ветка ИНАЧЕ указана — вернётся её значение. Если ИНАЧЕ отсутствует — поле получит NULL. Это приведёт к пустым ячейкам и может исказить итоги по ресурсам, поэтому ветку ИНАЧЕ рекомендуется указывать всегда.

Как проверить поле на NULL внутри условия?

Сравнение через равенство не работает: NULL не равен ничему, включая сам себя. Используйте конструкцию «Поле ЕСТЬ NULL» в условии КОГДА либо функцию ЕСТЬNULL(Поле, ЗначениеЗамены), если типы совместимы.

Можно ли сравнивать поле с параметром отчёта в условии?

Да, в тексте запроса параметры доступны через амперсанд, например: КОГДА Сумма >= &Порог ТОГДА. Параметр нужно объявить на закладке «Параметры» схемы, задать тип и желательно значение по умолчанию, чтобы отчёт формировался без обязательного ввода.

Почему порядок условий КОГДА имеет значение?

Условия проверяются последовательно сверху вниз, и возвращается значение первого истинного. Если широкое условие (например, Сумма >= 10000) стоит выше более частного (Сумма >= 100000), частное никогда не сработает. Располагайте условия от более строгих к более мягким.

Что лучше для категорий: ВЫБОР КОГДА или соединение со справочником?

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