Конструкция ИНАЧЕ КОГДА в языке запросов 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. Динамическое формирование полей
Можно использовать для генерации разных выражений в зависимости от параметров:
ВЫБРАТЬ
ВЫБОР
КОГДА &Период = "Месяц" ТОГДА МЕСЯЦ(&Дата)
КОГДА &Период = "Квартал" ТОГДА КВАРТАЛ(&Дата)
ИНАЧЕ ГОД(&Дата)
КОНЕЦ КАК ПериодОтчёта
ИЗ Документ.Продажи
☑️ Проверка корректности ИНАЧЕ КОГДА
Типичные ошибки и как их избежать
Даже опытные разработчики допускают ошибки при работе с ИНАЧЕ КОГДА. Вот самые распространённые:
- Пропущенный блок ИНАЧЕ: Если ни одно условие не выполнится, результат будет NULL, что может сломать логику отчёта.
// Ошибка: нет блока ИНАЧЕВЫБОР
КОГДА Статус = "Оплачен" ТОГДА 1
КОГДА Статус = "Отменён" ТОГДА 0
КОНЕЦ // Вернёт NULL для статуса "В обработке"
- Пересекающиеся условия: Если первое условие
КОГДА ИСТИНА, остальные ветки никогда не выполнятся.// Ошибка: первое условие всегда ИСТИНАВЫБОР
КОГДА ИСТИНА ТОГДА "Всегда это значение"
КОГДА Дата > '20230101' ТОГДА "Эта ветка никогда не сработает"
КОНЕЦ
- Сложные выражения в условиях: Использование функций или подзапросов в
КОГДАможет тормозить выполнение. Лучше вынести их вСилиГДЕ.
⚠️ Внимание: В запросах к управляемым формам или динамическим спискам конструкцияВЫБОР КОГДАможет некорректно обрабатываться, если условия содержат ссылки на реквизиты формы. В таких случаях лучше использоватьЕСЛИна стороне 1С, а не в SQL-части запроса.
Оптимизация запросов с ИНАЧЕ КОГДА
Неправильное использование условных операторов может значительно замедлить выполнение запроса. Вот как оптимизировать:
- 🚀 Располагайте условия по частоте: Самые вероятные варианты ставьте первыми, чтобы платформа реже доходила до последних
КОГДА. - 🚀 Избегайте функций в условиях: Например,
КОГДА НАЧИНАЕТСЯС(Наименование, "А")тормозит, так как не может использовать индексы. Лучше:ВЫБРАТЬВЫБОР
КОГДА Наименование LIKE "А%" ТОГДА "Категория A"
...
КОНЕЦ
- 🚀 Для простых замен используйте ВЫРАЗИТЬ:
ВЫРАЗИТЬ(Статус КАК СТРОКА(50)) КАК СтатусСтрокойЭто быстрее, чем
ВЫБОР КОГДАс единственным условием.
Пример оптимизированного запроса для отчёта по продажам:
ВЫБРАТЬ
Клиент,
СУММА(СуммаДокумента) КАК ОбщаяСумма,
ВЫБОР
КОГДА СУММА(СуммаДокумента) > 1000000 ТОГДА "VIP" -- Частый случай
КОГДА СУММА(СуммаДокумента) > 100000 ТОГДА "Премиум"
ИНАЧЕ "Стандарт"
КОНЕЦ КАК КатегорияКлиента
ИЗ Документ.Продажи
ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО Клиент
Если в запросе более 5 условий КОГДА, рассмотрите возможность вынесения логики в виртуальную таблицу или временную таблицу. Это ускорит выполнение на больших объёмах данных.
ИНАЧЕ КОГДА в соединениях и подзапросах
Конструкцию можно использовать не только в ВЫБРАТЬ, но и в других частях запроса:
1. В разделе ГДЕ
Для динамического формирования фильтров:
ВЫБРАТЬ
*
ИЗ Документ.ЗаказыПокупателей
ГДЕ
ВЫБОР
КОГДА &ТолькоАктивные = ИСТИНА ТОГДА Статус = "Активен"
ИНАЧЕ ИСТИНА
КОНЕЦ
2. В соединениях (JOIN)
Для условного соединения таблиц:
ВЫБРАТЬ
Заказы.Номер,
ВЫБОР
КОГДА Заказы.Тип = "Опт" ТОГДА ОптовыеЦены.Цена
ИНАЧЕ РозничныеЦены.Цена
КОНЕЦ КАК ФинальнаяЦена
ИЗ Документ.Заказы КАК Заказы
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОптовыеЦены КАК ОптовыеЦены
ПО Заказы.Товар = ОптовыеЦены.Товар
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.РозничныеЦены КАК РозничныеЦены
ПО Заказы.Товар = РозничныеЦены.Товар
3. В подзапросах
Для возврата разных наборов данных:
ВЫБРАТЬ
Клиент,
(ВЫБРАТЬ
ВЫБОР
КОГДА Клиенты.Тип = "ЮрЛицо" ТОГДА МАКСИМУМ(Сумма)
ИНАЧЕ СРЕДНЕЕ(Сумма)
КОНЕЦ
ИЗ Документ.Продажи КАК Продажи
ГДЕ Продажи.Клиент = Клиенты.Ссылка) КАК Показатель
ИЗ Справочник.Клиенты КАК Клиенты
⚠️ Внимание: В подзапросах сИНАЧЕ КОГДАследите за типами возвращаемых данных. Например,МАКСИМУМиСРЕДНЕЕмогут вернуть разные типы (число vs NULL), что приведёт к ошибке "Типы не совпадают".
Альтернативные подходы: когда ИНАЧЕ КОГДА не подходит
Иногда лучше отказаться от ИНАЧЕ КОГДА в пользу других решений:
- 🔄 Для простых замен: Используйте
ВЫРАЗИТЬилиЗНАЧЕНИЕ:ВЫРАЗИТЬ(ЕСТЬNULL(Телефон, "Нет данных") КАК СТРОКА(20)) - 🔄 Для сложной логики: Вынесите условия в временную таблицу или обработайте на стороне 1С после выполнения запроса.
- 🔄 Для динамических отчётов: Используйте СКД (Система Компоновки Данных), где условия можно задать визуально.
Пример, где ВЫРАЗИТЬ эффективнее:
// Вместо:
ВЫБОР
КОГДА ДатаОплаты ЕСТЬ NULL ТОГДА "Не оплачен"
ИНАЧЕ ФОРМАТ(ДатаОплаты, "ДЛФ=DT")
КОНЕЦ
// Лучше:
ВЫРАЗИТЬ(ФОРМАТ(ЗНАЧЕНИЕ(ДатаОплаты), "ДЛФ=DT") КАК СТРОКА(20))
Почему иногда лучше избегать ИНАЧЕ КОГДА в больших запросах?
Конструкция ВЫБОР КОГДА может приводить к полному сканированию таблиц (table scan), если условия не оптимизированы для индексов. В некоторых СУБД (например, PostgreSQL, используемой в 1С:Предприятие 8.3.22+) это особенно критично для таблиц с миллионами записей. В таких случаях лучше разбить запрос на несколько простых или использовать временные таблицы.
FAQ: Частые вопросы по ИНАЧЕ КОГДА
Можно ли использовать ИНАЧЕ КОГДА без ВЫБОР?
Нет, ИНАЧЕ КОГДА — это часть конструкции ВЫБОР КОГДА и не может существовать отдельно. Если вам нужна альтернатива, используйте ЕСЛИ...ТО...ИНАЧЕ.
Как обработать ситуацию, когда все условия КОГДА возвращают FALSE?
В этом случае сработает блок ИНАЧЕ. Если его нет, результат будет NULL. Всегда добавляйте ИНАЧЕ для предсказуемого поведения:
ВЫБОР
КОГДА Условие1 ТОГДА Значение1
КОГДА Условие2 ТОГДА Значение2
ИНАЧЕ "Значение по умолчанию" // Обязательно!
КОНЕЦ
Можно ли в одном ВЫБОР использовать несколько ИНАЧЕ КОГДА?
Технически — нет. ИНАЧЕ может быть только один, и он должен идти последним. Однако вы можете использовать несколько КОГДА для покрытия всех сценариев:
ВЫБОР
КОГДА Условие1 ТОГДА Результат1
КОГДА Условие2 ТОГДА Результат2
КОГДА Условие3 ТОГДА Результат3 // Альтернатива "ИНАЧЕ КОГДА"
ИНАЧЕ РезультатПоУмолчанию
КОНЕЦ
Как отладить запрос с ИНАЧЕ КОГДА, если он возвращает неожиданные результаты?
Разбейте запрос на части:
- Проверьте каждое условие
КОГДАотдельно (например, добавьте его вГДЕи посмотрите, какие записи отбираются). - Используйте
ВЫВЕСТИ(в отладочном режиме) для промежуточных значений. - Упростите запрос, оставив только проблемную часть с
ВЫБОР КОГДА.
Частая ошибка — неучтённые NULL-значения. Добавьте явную проверку:
КОГДА Значение ЕСТЬ NULL ТОГДА "Пусто"
Есть ли ограничения на количество условий КОГДА в одном ВЫБОР?
Формальных ограничений нет, но:
- Более 10-15 условий ухудшают читаемость.
- Каждое условие увеличивает время выполнения (особенно если они сложные).
- В 1С:Предприятие 8.3.10 и старше оптимизатор запросов может неэффективно обрабатывать длинные
ВЫБОР.
Рекомендация: если условий много, выносите логику в отдельную функцию на стороне 1С или используйте временные таблицы.
Конструкция ИНАЧЕ КОГДА — это не самостоятельный оператор, а часть ВЫБОР КОГДА. Её основное преимущество — компактность и читаемость кода при множественных условиях, но для простых проверок лучше использовать ЕСЛИ или ВЫРАЗИТЬ.