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