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

ВЫБРАТЬ
Контрагенты.Наименование,
ВЫБОР Контрагенты.ЮрФизЛицо
КОГДА ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ЮрЛицо) ТОГДА "Юр. лицо"
КОГДА ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ФизЛицо) ТОГДА "Физ. лицо"
ИНАЧЕ "Не определен"
КОНЕЦ КАК ТипКонтрагента
ИЗ
Справочник.Контрагенты КАК Контрагенты
есть еще такой вариант использования
Кстати да, это по сути калька SQL-ной нотации Case. В коде не припомню, чтоб встречал, но записывать так бывает короче и удобнее. Спасибо!