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