Пересчет из валюты в валюту рассмотрим на примере регистра Продажи из УПП.
Пример:
Нужно вывести информацию о ценах проданного товара с пересчетом в заданную валюту на дату документ, т.е. какую валюту пересчета задали в запросе, в такую и пересчитали.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ИНДЕКСИРОВАТЬ ПО
Период,
Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсыВалют.Период КАК НачалоПериода,
МИНИМУМ(ЕСТЬNULL(КурсыВалютКопия.Период, ДАТАВРЕМЯ(3999, 1, 1))) КАК КонецПериода,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ ТаблицаКурсов
ИЗ
КурсыВалют КАК КурсыВалют
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалютКопия
ПО (КурсыВалютКопия.Период > КурсыВалют.Период)
И (КурсыВалютКопия.Валюта = КурсыВалют.Валюта)
СГРУППИРОВАТЬ ПО
КурсыВалют.Период,
КурсыВалют.Курс,
КурсыВалют.Валюта,
КурсыВалют.Кратность
ИНДЕКСИРОВАТЬ ПО
НачалоПериода,
КонецПериода,
Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Продажи.Период КАК Период,
Продажи.Контрагент КАК Контрагент,
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг) КАК РасходнаяНакладная,
Продажи.Номенклатура КАК Номенклатура,
Продажи.КоличествоОборот,
Продажи.СтоимостьОборот,
КурсПоДокументам.Курс КАК КурсУпр,
КурсПоДокументам.Кратность КАК КратностьУпр
ПОМЕСТИТЬ ПродажиКурсУпр
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
ПО (КурсПоДокументам.НачалоПериода <= Продажи.Период)
И (КурсПоДокументам.КонецПериода > Продажи.Период)
И (КурсПоДокументам.Валюта = &ВалютаУпр)
ГДЕ
Продажи.КоличествоОборот > 0
И Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ИНДЕКСИРОВАТЬ ПО
Период,
Контрагент,
РасходнаяНакладная,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиКурсУпр.Контрагент КАК Контрагент,
ПродажиКурсУпр.РасходнаяНакладная КАК РасходнаяНакладная,
ПродажиКурсУпр.Номенклатура КАК Номенклатура,
ПродажиКурсУпр.КоличествоОборот КАК Количество,
ПродажиКурсУпр.СтоимостьОборот КАК СтоимостьУпр,
ПродажиКурсУпр.СтоимостьОборот * ((ПродажиКурсУпр.КурсУпр * КурсПоДокументам.Кратность) / (КурсПоДокументам.Курс * ПродажиКурсУпр.КратностьУпр)) КАК СтоимостьВалютаПересчета
ПОМЕСТИТЬ ПродажиПересчитано
ИЗ
ПродажиКурсУпр КАК ПродажиКурсУпр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
ПО (КурсПоДокументам.НачалоПериода <= ПродажиКурсУпр.Период)
И (КурсПоДокументам.КонецПериода > ПродажиКурсУпр.Период)
И (КурсПоДокументам.Валюта = &ВалютаПересчета)
ИНДЕКСИРОВАТЬ ПО
Контрагент,
РасходнаяНакладная,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиПересчитано.Контрагент,
ПродажиПересчитано.РасходнаяНакладная,
ПродажиПересчитано.Номенклатура,
ПродажиПересчитано.Количество,
ПродажиПересчитано.СтоимостьУпр,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета КАК ЧИСЛО(15, 2)) КАК СтоимостьВалютаПересчета,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьУпр / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаУпр,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаВалютаПересчета
ИЗ
ПродажиПересчитано КАК ПродажиПересчитано
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ИНДЕКСИРОВАТЬ ПО
Период,
Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсыВалют.Период КАК НачалоПериода,
МИНИМУМ(ЕСТЬNULL(КурсыВалютКопия.Период, ДАТАВРЕМЯ(3999, 1, 1))) КАК КонецПериода,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс,
КурсыВалют.Кратность
ПОМЕСТИТЬ ТаблицаКурсов
ИЗ
КурсыВалют КАК КурсыВалют
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалютКопия
ПО (КурсыВалютКопия.Период > КурсыВалют.Период)
И (КурсыВалютКопия.Валюта = КурсыВалют.Валюта)
СГРУППИРОВАТЬ ПО
КурсыВалют.Период,
КурсыВалют.Курс,
КурсыВалют.Валюта,
КурсыВалют.Кратность
ИНДЕКСИРОВАТЬ ПО
НачалоПериода,
КонецПериода,
Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Продажи.Период КАК Период,
Продажи.Контрагент КАК Контрагент,
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг) КАК РасходнаяНакладная,
Продажи.Номенклатура КАК Номенклатура,
Продажи.КоличествоОборот,
Продажи.СтоимостьОборот,
КурсПоДокументам.Курс КАК КурсУпр,
КурсПоДокументам.Кратность КАК КратностьУпр
ПОМЕСТИТЬ ПродажиКурсУпр
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
ПО (КурсПоДокументам.НачалоПериода <= Продажи.Период)
И (КурсПоДокументам.КонецПериода > Продажи.Период)
И (КурсПоДокументам.Валюта = &ВалютаУпр)
ГДЕ
Продажи.КоличествоОборот > 0
И Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ИНДЕКСИРОВАТЬ ПО
Период,
Контрагент,
РасходнаяНакладная,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиКурсУпр.Контрагент КАК Контрагент,
ПродажиКурсУпр.РасходнаяНакладная КАК РасходнаяНакладная,
ПродажиКурсУпр.Номенклатура КАК Номенклатура,
ПродажиКурсУпр.КоличествоОборот КАК Количество,
ПродажиКурсУпр.СтоимостьОборот КАК СтоимостьУпр,
ПродажиКурсУпр.СтоимостьОборот * ((ПродажиКурсУпр.КурсУпр * КурсПоДокументам.Кратность) / (КурсПоДокументам.Курс * ПродажиКурсУпр.КратностьУпр)) КАК СтоимостьВалютаПересчета
ПОМЕСТИТЬ ПродажиПересчитано
ИЗ
ПродажиКурсУпр КАК ПродажиКурсУпр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКурсов КАК КурсПоДокументам
ПО (КурсПоДокументам.НачалоПериода <= ПродажиКурсУпр.Период)
И (КурсПоДокументам.КонецПериода > ПродажиКурсУпр.Период)
И (КурсПоДокументам.Валюта = &ВалютаПересчета)
ИНДЕКСИРОВАТЬ ПО
Контрагент,
РасходнаяНакладная,
Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиПересчитано.Контрагент,
ПродажиПересчитано.РасходнаяНакладная,
ПродажиПересчитано.Номенклатура,
ПродажиПересчитано.Количество,
ПродажиПересчитано.СтоимостьУпр,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета КАК ЧИСЛО(15, 2)) КАК СтоимостьВалютаПересчета,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьУпр / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаУпр,
ВЫРАЗИТЬ(ПродажиПересчитано.СтоимостьВалютаПересчета / ПродажиПересчитано.Количество КАК ЧИСЛО(15, 2)) КАК ЦенаВалютаПересчета
ИЗ
ПродажиПересчитано КАК ПродажиПересчитано
Далее получаем курс и кратность валюты пересчета - той, в которую нужно пересчитать. Это тоже делаем на дату документа. После того, как курсы и кратности валют мы получили принимаемся за расчет.Для пересчета из валюты в валюту сначала нужно рассчитать коэффициент пересчета.
Рассчитываем его так:
КоэффициентПересчета = (ПродажиКурсУпр.КурсУпр * КурсПоДокументам.Кратность)/ (КурсПоДокументам.Курс * ПродажиКурсУпр.КратностьУпр)
Далее полученный коэффициент умножаем на стоимость и получаем стоимость товара в валюте пересчета.
Ну и в завершении делим стоимость на количество и получаем цены в валюте управленческого учета и валюте пересчета.
Хочу заметить, что если в нашем регистре с курсами очень много записей, сначала нужно построить нарастающие итоги, например, по месяцам (или неделям, смотря сколько записей в периоде), затем отсечь ненужные периоды, а потом уже строить нарастающий итог для соединения с документам.
А вот результат работы из консоли запросов:
Комментариев нет :
Отправить комментарий