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

1с выбор когда в запросе

  • автор:

Условный оператор в запросе

Оператор ВЫБОР используется в случаях когда нам необходимо различное поведение в зависимости от возникших условий.

Примеры

К примеру, если значение поля Дата выпадает на день программиста (256-ой день в году), или на 31-ое декабря то выведем соответствующее поздравление. А если на любое другое число, выведем что ни будь нейтральное.

КОГДА ДЕНЬГОДА ( &ТекущаяДата ) = 256

ТОГДА "Поздравляю с днем программиста!"

КОГДА МЕСЯЦ ( &ТекущаяДата ) = 12

И ДЕНЬ ( &ТекущаяДата ) = 31

ТОГДА "Поздравляю с наступающим новым годом!"

ИНАЧЕ "Сегодня нет праздника"

КОНЕЦ КАК Сообщение

Синтаксис оператора ВЫБОР:

ВЫБОР
КОГДА <ЛогическоеВыражение> ТОГДА <ВыражениеДляИстина>
ИНАЧЕ <ВыражениеДляЛожь>
КОНЕЦ

В рамках операции ВЫБОР может быть описано какое угодно количество логических условий "КОГДА . ТОГДА. " в том числе и вложенных.

Так же существует и второй вариант синтаксиса, когда мы хотим проверить элементы только на равенство, не используя других функций и операторов сравнения.

Мы можем указать сравниваемое значение прямо после слова "ВЫБОР", а в когда помещать сами значения. К примеру у нас есть значение количества в таблице, и мы хотим с помощью запроса определить, что количество товара равно 1 и пометить эти строки в результате запроса:

1с выбор когда в запросе

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: условный оператор

Автор уроков и преподаватель школы: Владимир Милькин

Условный оператор в запросе

Давайте напишем запрос, который получает названия и калорийность еды:

02

А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:

  • если калорийность меньше 100, то жирность низкая;
  • если калорийность от 100 до 200, то жирность нормальная;
  • если калорийность больше 200, то жирность высокая.

Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?

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

Давайте внимательнее присмотримся к тексту запроса:

03

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

Условия оператора обрабатываются последовательно . Если одно из них оказалось верным, то в качестве результата возвращается соответствующее значение. Если же ни одно из условий не выполнилось, то возвращается значение из секции ИНАЧЕ. Если же ни одно из условий не выполнилось, и в операторе отсутствует секция ИНАЧЕ, то возвращается значение NULL (о нём мы поговорим в одном из следующих уроков).

Поэтому новый запрос вернёт такую таблицу:

04

Отступление

Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.

Но в наших силах дать ей это имя. Для этого сразу после описания поля нужно написать ключевое слово КАК, а после этого через пробел указать само имя. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое имя будет называться псевдонимом поля .

05

Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:

06

Но вернёмся к условному оператору в запросах.

Более сложные логические выражения в условиях оператора

В логических условиях оператора выбора можно использовать и более сложные выражения.

Пример использования логического оператора ПОДОБНО:

07

Пример использования функции ПОДСТРОКА:

08

Более сложные результаты условного оператора

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

Запрос. ВЫБОР КОГДА

ВЫБРАТЬ
.
ВЫБОР
КОГДА условие1
ТОГДА значение1
КОГДА условие2
ТОГДА значение2
КОГДА (ВЫБРАТЬ
..
ИЗ ..) = ИСТИНА
ТОГДА значение3
ИНАЧЕ значение4
..
ИЗ
..

то есть в одном из полей использовать запрос?

(1) Че за ерунда, можно канечно.

Обычная конструкция SELECT CASE

Пробую написать в конструкторе в поле

ВЫБОР
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА ЕСТЬNULL(выбрать 1 из истина, ЛОЖЬ) = ИСТИНА
ТОГДА МАКСИМУМ(ВложенныйЗапросНДФЛ.Сумма)
ИНАЧЕ 0
КОНЕЦ

ругается на то, что синтаксическая ошибка и "ожидается выражение выбрать"..

(2) почитай топик внимательно.

(3) в КОГДА так нельзя

(3) Может я неправильно понял тебя))

Вот как ты написал в примере правильно сказано в (1).

(3) > выбрать 1 из истина

(6) Давай обратимся к матчасти:

В качестве описания поля выборки может быть выражение, использующее следующие элементы:

Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null, Неопределено. [Замечание: Чтобы указать литерал типа "дата", можно воспользоваться ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр запроса].
Параметры запроса (со знаком &)
Имя поля
Имя табличной части
Разыменование ссылочного поля (через одну или несколько точек)
Арифметические операции (+, -, /, *) [Замечание: операция получения остатка % в языке запросов не поддерживается]
Операция конкатенации строк (+) [Замечание: операцию конкатенации нельзя использовать для виртуальных полей]
Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т.д.)
Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО)
Операция выбора ВЫБОР / CASE — позволяет получить одно из возможных значений в соответствии с указанными условиями.
Операция приведения типов ВЫРАЗИТЬ / CAST

(10) "Можно только IN (SELECT)" — то есть, что то вроде этого

ВЫБОР
КОГДА
ТОГДА 1
КОГДА
ТОГДА 2
КОГДА
ТОГДА 3
КОГДА
ТОГДА 4
КОГДА ИСТИНА В (ВЫБРАТЬ .. ИЗ ..)
ТОГДА 5
ИНАЧЕ 0
КОНЕЦ

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

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

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

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

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

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

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

uslovie-gde-v-zaprose

uslovie-gde-v-zaprose-obychnoe

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

ВЫБОР КОГДА

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

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

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

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

Пример № 1

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

Пример № 2:

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

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

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

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

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

parametry-virtualnoj-tablitsy

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

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

ИМЕЮЩИЕ

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

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

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

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

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

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

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

Реклама – самая интересная и самая трудная форма литературы.

— Олдос Хаксли.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *