Как создать запрос с выборкой курсов валют на каждый день.

 


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

По этому мы рассмотрим как создать запрос с подобной выборкой (выборка курса валюты на каждый день указанного периода).

  • Для начала выбрившим перечень дат за заданный период:

ВЫБРАТЬ
    ДанныеПроизводственногоКалендаря.Дата КАК ДатаПериода
ПОМЕСТИТЬ ВТ_ДатыПериода
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
    ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &НачалоПериода И &КонецПериода

  • Теперь объединим полученную виртуальную таблицу с записями регистра сведений "Курсы валют", чтобы получить список валют со всеми датами за указанный период:

ВЫБРАТЬ
    МАКСИМУМ(КурсыВалют.Период) КАК Период,
    КурсыВалют.Валюта,
    ВТ_ДатыПериода.ДатаПериода
ПОМЕСТИТЬ ВТ_ПериодыВалюты
ИЗ
    ВТ_ДатыПериода КАК ВТ_ДатыПериода
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ_ДатыПериода.ДатаПериода>= КурсыВалют.Период
ГДЕ
    КурсыВалют.Валюта = &Валюта

СГРУППИРОВАТЬ ПО
    КурсыВалют.Валюта,
    ВТ_ДатыПериода.ДатаПериода

  •  И напоследок необходимо соединить таблицу "ВТ_ПериодыВалюты" с курсами валют из регистра сведений "Курсы валют":

ВЫБРАТЬ
    ВТ_ПериодыВалюты.Период,
    ВТ_ПериодыВалюты.ДатаПериода,
    ВТ_ПериодыВалюты.Валюта,
    КурсыВалют.Курс,
    КурсыВалют.Кратность
ИЗ
    ВТ_ПериодыВалюты КАК ВТ_ПериодыВалюты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ_ПериодыВалюты.Валюта = КурсыВалют.Валюта
            И ВТ_ПериодыВалюты.Период = КурсыВалют.Период

УПОРЯДОЧИТЬ ПО
    ДатаПериода

В конечном итоге у нас получается запрос:

ВЫБРАТЬ
    ДанныеПроизводственногоКалендаря.Дата КАК ДатаПериода
ПОМЕСТИТЬ ВТ_ДатыПериода
ИЗ
    РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ГДЕ
    ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    МАКСИМУМ(КурсыВалют.Период) КАК Период,
    КурсыВалют.Валюта КАК Валюта,
    ВТ_ДатыПериода.ДатаПериода КАК ДатаПериода
ПОМЕСТИТЬ ВТ_ПериодыВалюты
ИЗ
    ВТ_ДатыПериода КАК ВТ_ДатыПериода
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ_ДатыПериода.ДатаПериода >= КурсыВалют.Период
ГДЕ
    КурсыВалют.Валюта = &Валюта

СГРУППИРОВАТЬ ПО
    КурсыВалют.Валюта,
    ВТ_ДатыПериода.ДатаПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ПериодыВалюты.Период КАК Период,
    ВТ_ПериодыВалюты.ДатаПериода КАК ДатаПериода,
    ВТ_ПериодыВалюты.Валюта КАК Валюта,
    КурсыВалют.Курс КАК Курс,
    КурсыВалют.Кратность КАК Кратность
ИЗ
    ВТ_ПериодыВалюты КАК ВТ_ПериодыВалюты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ_ПериодыВалюты.Валюта = КурсыВалют.Валюта
            И ВТ_ПериодыВалюты.Период = КурсыВалют.Период

УПОРЯДОЧИТЬ ПО
    ВТ_ПериодыВалюты.ДатаПериода

Данный текст тестировался на конфигурации "BAS Бухгалтерия ред. 2.1" .

Вдохновлялся статьёй на infostart.ru

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.