Поиск по этому блогу

13 февраля 2013 г.

Коррелированные запросы в 1C8.

 1С не поддерживает коррелированных запросов, то есть обращения из вложенного запроса к полям родительского запроса, кроме варианта с условием "В", пример есть в файле V8adddoc807.htm, приведен ниже. 

===ПРИМЕР ИЗ ФАЙЛА V8adddoc807.htm===
Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции.


Пример:

// Выбрать названия товаров, которые присутствовали в расходных накладных
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
      Товары.Ссылка В
      (ВЫБРАТЬ
            РасхНаклСостав.Товар
       ИЗ
            Документ.РасхНакл.Состав КАК РасхНаклСостав
       ГДЕ
           РасхНаклСостав.Товар = Товары.Ссылка
      )
===КОНЕЦ ПРИМЕРА ИЗ ФАЙЛА V8adddoc807.htm===


Еще примеры использования коррелированных запросов:
Задача:
Как получить последние два курса по валютам?

1)Вариант с коррелированным запросом в соединении 
ВЫБРАТЬ
         КурсыВалютСрезПоследних.Валюта,
         КурсыВалютСрезПоследних.Период КАК ПоследняяДата,
         КурсыВалют.Период КАК ПредпоследняяДата,
         КурсыВалютСрезПоследних.Курс КАК ПоследнийКурс,
         КурсыВалют.Курс КАК ПредпоследнийКурс
ИЗ
       РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ((КурсыВалют.Валюта, КурсыВалют.Период) В
            (ВЫБРАТЬ
                      КурсыВалют.Валюта,
                      МАКСИМУМ(КурсыВалют.Период) КАК Период
              ИЗ
                      РегистрСведений.КурсыВалют КАК КурсыВалют
              ГДЕ
              КурсыВалют.Период < КурсыВалютСрезПоследних.Период
              И КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта
              СГРУППИРОВАТЬ ПО
              КурсыВалют.Валюта))



2)Самый элегантный вариант - коррелированным подзапросом с ВЫБРАТЬ ПЕРВЫЕ 2
                          

ВЫБРАТЬ
    ТаблицаРегистра.Период,
    ТаблицаРегистра.Валюта,
    ТаблицаРегистра.Курс
ИЗ
    РегистрСведений.КурсыВалют КАК ТаблицаРегистра
ГДЕ
    (ТаблицаРегистра.Валюта, ТаблицаРегистра.Период) В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                КурсыВалют.Валюта,
                КурсыВалют.Период КАК Период
            ИЗ
                РегистрСведений.КурсыВалют КАК КурсыВалют
            ГДЕ
                КурсыВалют.Валюта = ТаблицаРегистра.Валюта
            УПОРЯДОЧИТЬ ПО
                Период УБЫВ)