Для начинающих разработчиков в мире 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С-разработчика. Она позволяет писать гибкие и эффективные запросы, перенося условную логику непосредственно на уровень системы управления базами данных. Начиная с простых примеров и постепенно усложняя задачи, вы сможете в полной мере оценить все преимущества этого оператора и применять его в своей повседневной работе для решения широкого круга задач.
Сэкономь часы на дебаге 1C!
Скачай PDF с топ-11 ошибок начинающих разработчиков + файл с примерами кода!