1с запрос выбор когда несколько условий
Перейти к содержимому

1с запрос выбор когда несколько условий

  • автор:

Многоуровневая конструкция КОГДА ТОГДА в запросе

Доброй ночи! То ли не понимаю, то ли пишу не так синтаксис. Есть 3 адреса у физ лица, (проживания,прописка, информирование) Мне нужно выбрать первый который заполнен из трех в этом же порядке. Отдельными ВТ получаю все 3 значения далее пытаюсь так

ВЫБОР
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
ТОГДА ФИОиАдрес2.Адрес
КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
ТОГДА ФИОиАдрес3.Адрес
ИНАЧЕ ФИОиАдрес1.Адрес
КОНЕЦ

если заполены 1ый и 2ой то все ок, а если они пусты но заполнен 3ий — все равно null получаю. Что не так делаю?

Условия в запросе

Эти операторы возможно использовать во всех 4 ситуациях, но контекст (окружаемые переменные у них отличаются).

В первых двух случаях условия накладываются на поля выборки, например:

ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК СпрКонтрагенты ГДЕ СпрКонтрагенты.ИНН<>»»

Обращение идет через имя таблицы (в простых запросах может опускаться, но в сложных может вызывать неоднозначность поля).

Данное условие вызывает ограничение выборки (обычно уменьшает ее)

В конструкторе запроса находятся на вкладке условия:

uslovie-gde-v-zaprose

uslovie-gde-v-zaprose-obychnoe

В произвольном варианте пишется текстом, в обычном выбирается поле, оператор сравнения и значение:

ВЫБОР КОГДА

Этот условный оператор используется для преобразования значения, ограничивает же выборку только когда расположен после служебного слова ГДЕ.
Допустимо несколько подчиненных условий. Может находится в полях выборки, полях условий ГДЕ, группировок, итогов (универсальный оператор для сложных условий)

Например, так выглядит вариант преобразования:

ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 2
ТОГДА «Никогда не будет истиной»
КОГДА 1 = 1
ТОГДА «Всегда будет истиной»
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ПолеПредставленияЗначения

Вариант использования в условии ГДЕ, результат выборки должен возвращать булево значение либо сравниваться с чем-то еще

Пример № 1

ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ

Пример № 2:

ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА «» ИНАЧЕ «Заполнено» КОНЕЦ = «Заполнено»

Параметры виртуальных таблиц

В данном случае оперирование идет с полями таблиц, например ресурсами, измерениями, реквизитами. В этих условиях обращение идет без точки (контекст этого не требует).

ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = «RUR»)

В конструкторе запроса они находятся вот здесь:

parametry-virtualnoj-tablitsy

Стоит отметить, что обычно используется ограничение над измерениями, так как иначе условие отнесется к выборке для получения, а не на сам результат (на ресурсы ограничения следует наложить в операторе ГДЕ, чтобы получить ожидаемый результат).

Накладывание условия в запросе на измерения, если нет обращения через точку (как в примере выше), ускоряет выборку: на больших таблицах, это будет визуально заметно; на небольших можно использовать как удобно.

ИМЕЮЩИЕ

Для наложения отбора для результата «группировочных» функции

ВЫБРАТЬ
Контрагенты.ИНН,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты

СГРУППИРОВАТЬ ПО
Контрагенты.ИНН

ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1 И
Контрагенты.ИНН <> «»

В данную выборку попадут дубли ИНН, когда оно вообще заполнено.

В конструкторе запроса также находится на вкладке условия

В этой конструкции также возможно использование «группировочных» операторов И,ИЛИ, но сравнивать можно с константами запроса, с функцией или значением, входящим в группировку (другие реквизиты справочника в данном примере не будут доступны для сравнения -> тогда следует использовать ГДЕ).

Самые глубокие проблемы, связанные с рекламой, проистекают не столько из стремления рекламодателей соблазнять, сколько из нашего желания быть соблазняемыми.

— Дэниэл Бурстин

Использование в запросах конструкции ВЫБОР КОГДА в 1С

Иногда в запросах необходимо получить не сами данные, а в зависимости от результата вывести другие данные. Для этих целей в языке запросов 1С (впрочем как и в SQL) есть конструкция ВЫБОР КОГДА.
Конструкция выглядит так

ВЫБОР КОГДА <Условие с результатом типа Булево>
ТОГДА <Результат в случае если Истина>
ИНАЧЕ <Результат в случае если Ложь>
КОНЕЦ

Пример:

Результат запроса с выборкой ВЫБОР КОГДА

Результат будет приблизительно таким

Обратите внимание, что условие обязательно должно быть логическим, например такая конструкция не будет работать:

Вместо этого надо точно указать сравнение

Комментарии

Вот еще интересное

Вот еще интересное решение

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();

Если ВыборкаДетальныеЗаписи.Следующий() тогда
Сообщить(«»+ВыборкаДетальныеЗаписи.Дни+» «+ВыборкаДетальныеЗаписи.Часы+» «+ВыборкаДетальныеЗаписи.Минуты+» «+ВыборкаДетальныеЗаписи.Секунды+» «);
КонецЕсли;

Добавить комментарий

Ваш адрес email не будет опубликован.