Вы здесь

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

tags: 

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

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

Пример:

ВЫБРАТЬ
        СчетФактураПолученный.Ссылка,
        ВЫБОР КОГДА СчетФактураПолученный.ДокументОснование ССЫЛКА Документ.ПоступлениеТоваров Тогда
         "Поступление товаров"
        ИНАЧЕ
         "Прочие документы"
        КОНЕЦ Как ДокументОснование
ИЗ
        Документ.СчетФактураПолученный КАК СчетФактураПолученный

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

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

        ВЫБОР
                КОГДА ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ЛОЖЬ)
                        ТОГДА "Отправлен"
                ИНАЧЕ "Не отправлен"
        КОНЕЦ КАК Отправлен

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

        ВЫБОР
                КОГДА ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, ЛОЖЬ) = ИСТИНА
                        ТОГДА "Отправлен"
                ИНАЧЕ "Не отправлен"
        КОНЕЦ КАК Отправлен

Комментарии

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

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
        |ПОМЕСТИТЬ ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВремяВсе.ДниВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ДниВсе - 1
        |       ИНАЧЕ ВремяВсе.ДниВсе
        |   КОНЕЦ КАК ДниВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ЧАС, ВремяВсе.ЧасыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ЧасыВсе - 1
        |       ИНАЧЕ ВремяВсе.ЧасыВсе
        |   КОНЕЦ КАК ЧасыВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.МинутыВсе - 1
        |       ИНАЧЕ ВремяВсе.МинутыВсе
        |   КОНЕЦ КАК МинутыВсе,
        |   ВремяВсе.СекундыВсе
        |ПОМЕСТИТЬ ВремяКор
        |ИЗ
        |   ВремяВсе КАК ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВремяКор.ДниВсе КАК Дни,
        |   ВремяКор.ЧасыВсе - ВремяКор.ДниВсе * 24 КАК Часы,
        |   ВремяКор.МинутыВсе - ВремяКор.ЧасыВсе * 60 КАК Минуты,
        |   ВремяКор.СекундыВсе - ВремяКор.МинутыВсе * 60 КАК Секунды
        |ИЗ
        |   ВремяКор КАК ВремяКор"
;

    Запрос.УстановитьПараметр("ДатаН",Объект.ДатаН);
    Запрос.УстановитьПараметр("ДатаК",Объект.ДатаК);

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

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