вторник, 18 марта 2014 г.

Пересчет из валюты в валюту в запросе

Пересчет из валюты в валюту рассмотрим на примере регистра Продажи из УПП.

Пример:
Нужно вывести информацию о ценах проданного товара с пересчетом в заданную валюту на дату документ, т.е. какую валюту пересчета задали в запросе, в такую и пересчитали.

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

ИНДЕКСИРОВАТЬ ПО
   
Период,
   
Валюта
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    КурсыВалют.Период КАК НачалоПериода,
   
МИНИМУМ(ЕСТЬNULL(КурсыВалютКопия.Период, ДАТАВРЕМЯ(3999, 1, 1))) КАК КонецПериода,
   
КурсыВалют.Валюта КАК Валюта,
   
КурсыВалют.Курс,
   
КурсыВалют.Кратность
ПОМЕСТИТЬ ТаблицаКурсов
ИЗ
   
КурсыВалют КАК КурсыВалют
        ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалютКопия
        ПО (КурсыВалютКопия.Период > КурсыВалют.Период)
           
И (КурсыВалютКопия.Валюта = КурсыВалют.Валюта)

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

ИНДЕКСИРОВАТЬ ПО
   
НачалоПериода,
   
КонецПериода,
   
Валюта
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Продажи.Период КАК Период,
   
Продажи.Контрагент КАК Контрагент,
   
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг) КАК РасходнаяНакладная,
   
Продажи.Номенклатура КАК Номенклатура,
   
Продажи.КоличествоОборот,
   
Продажи.СтоимостьОборот,
   
КурсПоДокументам.Курс КАК КурсУпр,
   
КурсПоДокументам.Кратность КАК КратностьУпр
ПОМЕСТИТЬ ПродажиКурсУпр
ИЗ
   
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК Продажи
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
        ПО (КурсПоДокументам.НачалоПериода <= Продажи.Период)
           
И (КурсПоДокументам.КонецПериода > Продажи.Период)
           
И (КурсПоДокументам.Валюта = &ВалютаУпр)
ГДЕ
   
Продажи.КоличествоОборот > 0
   
И Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

ИНДЕКСИРОВАТЬ ПО
   
Период,
   
Контрагент,
   
РасходнаяНакладная,
   
Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   
ПродажиКурсУпр.Контрагент КАК Контрагент,
   
ПродажиКурсУпр.РасходнаяНакладная КАК РасходнаяНакладная,
   
ПродажиКурсУпр.Номенклатура КАК Номенклатура,
   
ПродажиКурсУпр.КоличествоОборот КАК Количество,
   
ПродажиКурсУпр.СтоимостьОборот КАК СтоимостьУпр,
   
ПродажиКурсУпр.СтоимостьОборот * ((ПродажиКурсУпр.КурсУпр * КурсПоДокументам.Кратность) / (КурсПоДокументам.Курс * ПродажиКурсУпр.КратностьУпр)) КАК СтоимостьВалютаПересчета
ПОМЕСТИТЬ ПродажиПересчитано
ИЗ
   
ПродажиКурсУпр КАК ПродажиКурсУпр
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
        ПО (КурсПоДокументам.НачалоПериода <= ПродажиКурсУпр.Период)
           
И (КурсПоДокументам.КонецПериода > ПродажиКурсУпр.Период)
           
И (КурсПоДокументам.Валюта = &ВалютаПересчета)

ИНДЕКСИРОВАТЬ ПО
   
Контрагент,
   
РасходнаяНакладная,
   
Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   
ПродажиПересчитано.Контрагент,
   
ПродажиПересчитано.РасходнаяНакладная,
   
ПродажиПересчитано.Номенклатура,
   
ПродажиПересчитано.Количество,
   
ПродажиПересчитано.СтоимостьУпр,
   
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета КАК ЧИСЛО(15, 2)) КАК СтоимостьВалютаПересчета,
   
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьУпр / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаУпр,
   
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаВалютаПересчета
ИЗ
   
ПродажиПересчитано КАК ПродажиПересчитано

В первом запросе мы получаем таблицу всех курсов и кратности. Таблица "Курсы валют" необходима для правильного построения нарастающих итогов. В следующем запросе как раз и строится нарастающий итог. Мы получаем поля "НачалоПериода" и " КонецПериода" для получения интервала, в который будет входить наш документ. В третьем запросе мы проверяем: входит ли документ в наш интервал. Если входит, то получаем курс и кратность валюты управленческого учета на дату документа. - Почему управленческого? - спросите вы. - Да потому, что стоимость проданного товара хранится в регистре "Продажи" именно в валюте управленческого учета.
Далее получаем курс и кратность валюты пересчета - той, в которую нужно пересчитать. Это тоже делаем на дату документа. После того, как курсы и кратности валют мы получили принимаемся за расчет.Для пересчета из валюты в валюту сначала нужно рассчитать коэффициент пересчета.
Рассчитываем его так:

КоэффициентПересчета = (ПродажиКурсУпр.КурсУпр * КурсПоДокументам.Кратность)/ (КурсПоДокументам.Курс * ПродажиКурсУпр.КратностьУпр)

Далее полученный коэффициент умножаем на стоимость и получаем стоимость товара в валюте пересчета.
Ну и в завершении делим стоимость на количество и получаем цены в валюте управленческого учета и валюте пересчета.
Хочу заметить, что если в нашем регистре с курсами очень много записей, сначала нужно построить нарастающие итоги, например, по месяцам (или неделям, смотря сколько записей в периоде), затем отсечь ненужные периоды, а потом уже строить нарастающий итог для соединения с документам.
А вот результат работы из консоли запросов:



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

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

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