Конструкция ИНАЧЕ КОГДА в языке запросов 1С:Предприятие — это мощный инструмент для создания гибких условий, который часто остаётся недооценённым. В отличие от простого ЕСЛИ...ТО, она позволяет обрабатывать несколько альтернативных сценариев в одном выражении, делая код компактнее и читаемее. Однако не все разработчики используют её эффективно: кто-то ограничивается базовым синтаксисом, а кто-то вообще заменяет на вложенные ЕСЛИ, усложняя поддержку кода.

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

Синтаксис конструкции ИНАЧЕ КОГДА: базовые правила

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

ВЫБОР

КОГДА <Условие1> ТОГДА <Выражение1>

КОГДА <Условие2> ТОГДА <Выражение2>

...

ИНАЧЕ <ВыражениеПоУмолчанию>

КОНЕЦ

Ключевые моменты:

  • 🔹 Порядок условий важен: проверка идёт сверху вниз, и выполняется первое подходящее условие. Если в первом КОГДА стоит ИСТИНА, остальные ветки игнорируются.
  • 🔹 Блок ИНАЧЕ не обязателен, но его отсутствие может привести к NULL в результатах, если ни одно условие не сработало.
  • 🔹 В одном ВЫБОР можно использовать несколько ИНАЧЕ КОГДА — это позволяет обрабатывать альтернативные сценарии без вложенных конструкций.

Пример простого использования:

ВЫБРАТЬ

ВЫБОР

КОГДА СуммаДокумента > 100000 ТОГДА "Крупный клиент"

КОГДА СуммаДокумента > 50000 ТОГДА "Средний клиент"

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

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

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

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

Отличия ИНАЧЕ КОГДА от ВЫБОР КОГДА и ЕСЛИ

Многие путают ИНАЧЕ КОГДА с другими условными операторами. Разберём ключевые различия:

Критерий ВЫБОР КОГДА ЕСЛИ...ТО...ИНАЧЕ ИНАЧЕ КОГДА
Количество условий Множественные (как switch-case) Только одно условие Альтернативная ветка в ВЫБОР КОГДА
Читаемость Высокая для множественных проверок Низкая при вложенности Улучшает структуру ВЫБОР
Производительность Оптимизировано платформой Может тормозить при глубокой вложенности Не влияет отдельно

Пример, где ИНАЧЕ КОГДА предпочтительнее ЕСЛИ:

// Плохо: вложенные ЕСЛИ

ЕСЛИ ТипДокумента = "ЗаказПокупателя" ТОГДА

Статус = "Ожидает оплаты"

ИНАЧЕ

ЕСЛИ ТипДокумента = "Реализация" ТОГДА

Статус = "Оплачен"

ИНАЧЕ

Статус = "Неопределён"

КОНЕЦЕСЛИ;

КОНЕЦЕСЛИ;

// Хорошо: ВЫБОР с ИНАЧЕ КОГДА

Статус = ВЫБОР

КОГДА ТипДокумента = "ЗаказПокупателя" ТОГДА "Ожидает оплаты"

КОГДА ТипДокумента = "Реализация" ТОГДА "Оплачен"

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

КОНЕЦ;

📊 Какой оператор вы чаще используете для множественных условий?
ВЫБОР КОГДА
ЕСЛИ с вложенностью
ИНАЧЕ КОГДА
Другой вариант

Практические примеры использования ИНАЧЕ КОГДА

Рассмотрим реальные сценарии, где ИНАЧЕ КОГДА упрощает логику:

1. Категоризация данных в отчётах

Допустим, нужно разделить товары по ценовым диапазонам:

ВЫБРАТЬ

Товары.Наименование,

ВЫБОР

КОГДА Товары.Цена > 10000 ТОГДА "Премиум"

КОГДА Товары.Цена > 5000 ТОГДА "Средний сегмент"

КОГДА Товары.Цена > 1000 ТОГДА "Бюджетный"

ИНАЧЕ "Эконом"

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

ИЗ Справочник.Товары КАК Товары

2. Обработка NULL и пустых значений

ИНАЧЕ КОГДА отлично подходит для замены NULL на осмысленные значения без использования ВЫРАЗИТЬ:

ВЫБРАТЬ

Клиенты.Наименование,

ВЫБОР

КОГДА Клиенты.Телефон ЕСТЬ NULL ТОГДА "Номер не указан"

КОГДА Клиенты.Телефон = "" ТОГДА "Номер не указан"

ИНАЧЕ Клиенты.Телефон

КОНЕЦ КАК КонтактныйТелефон

ИЗ Справочник.Клиенты КАК Клиенты

3. Динамическое формирование полей

Можно использовать для генерации разных выражений в зависимости от параметров:

ВЫБРАТЬ

ВЫБОР

КОГДА &Период = "Месяц" ТОГДА МЕСЯЦ(&Дата)

КОГДА &Период = "Квартал" ТОГДА КВАРТАЛ(&Дата)

ИНАЧЕ ГОД(&Дата)

КОНЕЦ КАК ПериодОтчёта

ИЗ Документ.Продажи

☑️ Проверка корректности ИНАЧЕ КОГДА

Выполнено: 0 / 4

Типичные ошибки и как их избежать

Даже опытные разработчики допускают ошибки при работе с ИНАЧЕ КОГДА. Вот самые распространённые:

  1. Пропущенный блок ИНАЧЕ: Если ни одно условие не выполнится, результат будет NULL, что может сломать логику отчёта.
    // Ошибка: нет блока ИНАЧЕ
    

    ВЫБОР

    КОГДА Статус = "Оплачен" ТОГДА 1

    КОГДА Статус = "Отменён" ТОГДА 0

    КОНЕЦ // Вернёт NULL для статуса "В обработке"

  2. Пересекающиеся условия: Если первое условие КОГДА ИСТИНА, остальные ветки никогда не выполнятся.
    // Ошибка: первое условие всегда ИСТИНА
    

    ВЫБОР

    КОГДА ИСТИНА ТОГДА "Всегда это значение"

    КОГДА Дата > '20230101' ТОГДА "Эта ветка никогда не сработает"

    КОНЕЦ

  3. Сложные выражения в условиях: Использование функций или подзапросов в КОГДА может тормозить выполнение. Лучше вынести их в С или ГДЕ.
⚠️ Внимание: В запросах к управляемым формам или динамическим спискам конструкция ВЫБОР КОГДА может некорректно обрабатываться, если условия содержат ссылки на реквизиты формы. В таких случаях лучше использовать ЕСЛИ на стороне , а не в SQL-части запроса.

Оптимизация запросов с ИНАЧЕ КОГДА

Неправильное использование условных операторов может значительно замедлить выполнение запроса. Вот как оптимизировать:

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

    ВЫБОР

    КОГДА Наименование LIKE "А%" ТОГДА "Категория A"

    ...

    КОНЕЦ

  • 🚀 Для простых замен используйте ВЫРАЗИТЬ:
    ВЫРАЗИТЬ(Статус КАК СТРОКА(50)) КАК СтатусСтрокой

    Это быстрее, чем ВЫБОР КОГДА с единственным условием.

Пример оптимизированного запроса для отчёта по продажам:

ВЫБРАТЬ

Клиент,

СУММА(СуммаДокумента) КАК ОбщаяСумма,

ВЫБОР

КОГДА СУММА(СуммаДокумента) > 1000000 ТОГДА "VIP" -- Частый случай

КОГДА СУММА(СуммаДокумента) > 100000 ТОГДА "Премиум"

ИНАЧЕ "Стандарт"

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

ИЗ Документ.Продажи

ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО Клиент

💡

Если в запросе более 5 условий КОГДА, рассмотрите возможность вынесения логики в виртуальную таблицу или временную таблицу. Это ускорит выполнение на больших объёмах данных.

ИНАЧЕ КОГДА в соединениях и подзапросах

Конструкцию можно использовать не только в ВЫБРАТЬ, но и в других частях запроса:

1. В разделе ГДЕ

Для динамического формирования фильтров:

ВЫБРАТЬ

*

ИЗ Документ.ЗаказыПокупателей

ГДЕ

ВЫБОР

КОГДА &ТолькоАктивные = ИСТИНА ТОГДА Статус = "Активен"

ИНАЧЕ ИСТИНА

КОНЕЦ

2. В соединениях (JOIN)

Для условного соединения таблиц:

ВЫБРАТЬ

Заказы.Номер,

ВЫБОР

КОГДА Заказы.Тип = "Опт" ТОГДА ОптовыеЦены.Цена

ИНАЧЕ РозничныеЦены.Цена

КОНЕЦ КАК ФинальнаяЦена

ИЗ Документ.Заказы КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОптовыеЦены КАК ОптовыеЦены

ПО Заказы.Товар = ОптовыеЦены.Товар

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.РозничныеЦены КАК РозничныеЦены

ПО Заказы.Товар = РозничныеЦены.Товар

3. В подзапросах

Для возврата разных наборов данных:

ВЫБРАТЬ

Клиент,

(ВЫБРАТЬ

ВЫБОР

КОГДА Клиенты.Тип = "ЮрЛицо" ТОГДА МАКСИМУМ(Сумма)

ИНАЧЕ СРЕДНЕЕ(Сумма)

КОНЕЦ

ИЗ Документ.Продажи КАК Продажи

ГДЕ Продажи.Клиент = Клиенты.Ссылка) КАК Показатель

ИЗ Справочник.Клиенты КАК Клиенты

⚠️ Внимание: В подзапросах с ИНАЧЕ КОГДА следите за типами возвращаемых данных. Например, МАКСИМУМ и СРЕДНЕЕ могут вернуть разные типы (число vs NULL), что приведёт к ошибке "Типы не совпадают".

Альтернативные подходы: когда ИНАЧЕ КОГДА не подходит

Иногда лучше отказаться от ИНАЧЕ КОГДА в пользу других решений:

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

Пример, где ВЫРАЗИТЬ эффективнее:

// Вместо:

ВЫБОР

КОГДА ДатаОплаты ЕСТЬ NULL ТОГДА "Не оплачен"

ИНАЧЕ ФОРМАТ(ДатаОплаты, "ДЛФ=DT")

КОНЕЦ

// Лучше:

ВЫРАЗИТЬ(ФОРМАТ(ЗНАЧЕНИЕ(ДатаОплаты), "ДЛФ=DT") КАК СТРОКА(20))

Почему иногда лучше избегать ИНАЧЕ КОГДА в больших запросах?

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

FAQ: Частые вопросы по ИНАЧЕ КОГДА

Можно ли использовать ИНАЧЕ КОГДА без ВЫБОР?

Нет, ИНАЧЕ КОГДА — это часть конструкции ВЫБОР КОГДА и не может существовать отдельно. Если вам нужна альтернатива, используйте ЕСЛИ...ТО...ИНАЧЕ.

Как обработать ситуацию, когда все условия КОГДА возвращают FALSE?

В этом случае сработает блок ИНАЧЕ. Если его нет, результат будет NULL. Всегда добавляйте ИНАЧЕ для предсказуемого поведения:

ВЫБОР

КОГДА Условие1 ТОГДА Значение1

КОГДА Условие2 ТОГДА Значение2

ИНАЧЕ "Значение по умолчанию" // Обязательно!

КОНЕЦ

Можно ли в одном ВЫБОР использовать несколько ИНАЧЕ КОГДА?

Технически — нет. ИНАЧЕ может быть только один, и он должен идти последним. Однако вы можете использовать несколько КОГДА для покрытия всех сценариев:

ВЫБОР

КОГДА Условие1 ТОГДА Результат1

КОГДА Условие2 ТОГДА Результат2

КОГДА Условие3 ТОГДА Результат3 // Альтернатива "ИНАЧЕ КОГДА"

ИНАЧЕ РезультатПоУмолчанию

КОНЕЦ

Как отладить запрос с ИНАЧЕ КОГДА, если он возвращает неожиданные результаты?

Разбейте запрос на части:

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

Частая ошибка — неучтённые NULL-значения. Добавьте явную проверку:

КОГДА Значение ЕСТЬ NULL ТОГДА "Пусто"
Есть ли ограничения на количество условий КОГДА в одном ВЫБОР?

Формальных ограничений нет, но:

  • Более 10-15 условий ухудшают читаемость.
  • Каждое условие увеличивает время выполнения (особенно если они сложные).
  • В 1С:Предприятие 8.3.10 и старше оптимизатор запросов может неэффективно обрабатывать длинные ВЫБОР.

Рекомендация: если условий много, выносите логику в отдельную функцию на стороне или используйте временные таблицы.

💡

Конструкция ИНАЧЕ КОГДА — это не самостоятельный оператор, а часть ВЫБОР КОГДА. Её основное преимущество — компактность и читаемость кода при множественных условиях, но для простых проверок лучше использовать ЕСЛИ или ВЫРАЗИТЬ.