Курс валюты на разные даты в запросе

1. Александр (user608303_1c-grand) 28.12.16 19:20 Сейчас в теме
Доброго времени суток!
Подскажите как мне получить курс валют на разные даты в запросе


Подскажите на примере запроса

Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТиповойДвиженияССубконто.Регистратор,
	|	ТиповойДвиженияССубконто.СчетДт КАК СчетДт,
	|	ТиповойДвиженияССубконто.СубконтоДт1 КАК СубконтоДт1,
	|	ТиповойДвиженияССубконто.СубконтоДт2 КАК СубконтоДт2,
	|	ТиповойДвиженияССубконто.СубконтоДт3 КАК СубконтоДт3,
	|	ТиповойДвиженияССубконто.СчетКт КАК СчетКт,
	|	ВЫБОР
	|		КОГДА ТиповойДвиженияССубконто.СчетДт <> &СчетБанк
	|			ТОГДА 0
	|		ИНАЧЕ ТиповойДвиженияССубконто.Сумма
	|	КОНЕЦ КАК СуммаПриход,
	|	ВЫБОР
	|		КОГДА ТиповойДвиженияССубконто.СчетКт <> &СчетБанк
	|			ТОГДА 0
	|		ИНАЧЕ ТиповойДвиженияССубконто.Сумма
	|	КОНЕЦ КАК СуммаРасход,
	|	ТиповойДвиженияССубконто.СубконтоКт1,
	|	ТиповойДвиженияССубконто.СубконтоКт2,
	|	ТиповойДвиженияССубконто.СубконтоКт3,
	|	НАЧАЛОПЕРИОДА(ТиповойДвиженияССубконто.Период, МЕСЯЦ) КАК Период,
	|	ТиповойДвиженияССубконто.Регистратор.Субконто1 КАК Суб1,
	|	ТиповойДвиженияССубконто.Регистратор.Субконто2 КАК Суб2,
	|	ТиповойДвиженияССубконто.Период КАК ДатаПроводки
	|ИЗ
	|	РегистрБухгалтерии.Типовой.ДвиженияССубконто(&НачалоПериода, &КонецПериода, Субконто1 В (&СчетОрганизации), , ) КАК ТиповойДвиженияССубконто
	|ГДЕ
	|	(ТиповойДвиженияССубконто.СчетДт = &СчетБанк
	|			ИЛИ ТиповойДвиженияССубконто.СчетКт = &СчетБанк)
	|	И ТиповойДвиженияССубконто.Регистратор.Субконто1 В(&Суб1)";

...Показать Скрыть

Допустим у меня получается результат запроса:

Дата проводки | Сумма приход | Сумма расход |
01.12.2016 500
02.12.2016 1000
03.12.2016 1000


Вот теперь мне нужно на 1,2 и 3 декабря в эту же таблицу вытащить курс из типового регистра сведений "Курсы валют", что бы получилось:

Дата проводки | Сумма приход | Сумма расход | Курс |
01.12.2016 500 330
02.12.2016 1000 329
03.12.2016 1000 335



делаю так:

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



вроде бы на первый взгляд все нормально, курс на эти даты выводится правильный, но записи попадают не все, и отчет формирует не правильную итоговую сумму.

Я думаю это за счет того что если на эту дату нету курса в рег.сведений, то запись не выводится.

А как сделать так, что если нету курса на эту дату, чтобы брался предыдущий, по принципу "СрезПоследних"

Заранее спасибо))
Ответы
2. Д. Р. (starjevschik) 28.12.16 22:38 Сейчас в теме
Универсальный запрос-конвертер валют. На вход надо подать временные таблицы: ВсеВалюты - это все используемые валюты (одно поле Валюта), ВсеДатыКурсов - это все даты, на которые нужны курсы (одно поле ДатаКурса).
На выходе у него временная таблица КроссКурсыВалют, там вроде все понятно.
	Запрос.Текст = "ВЫБРАТЬ
	               |	ВсеВалюты.Валюта,
	               |	ВсеДатыКурсов.ДатаКурса
	               |ПОМЕСТИТЬ ВалютыДатыКурсов
	               |ИЗ
	               |	ВсеВалюты КАК ВсеВалюты
	               |		ПОЛНОЕ СОЕДИНЕНИЕ ВсеДатыКурсов КАК ВсеДатыКурсов
	               |		ПО (ИСТИНА)
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	МАКСИМУМ(КурсыВалют.Период) КАК ДатаВРегистреВалют,
	               |	КурсыВалют.Валюта,
	               |	ВалютыДатыКурсов.ДатаКурса
	               |ПОМЕСТИТЬ ДатыКурсовИРегистра
	               |ИЗ
	               |	РегистрСведений.КурсыВалют КАК КурсыВалют
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВалютыДатыКурсов КАК ВалютыДатыКурсов
	               |		ПО КурсыВалют.Валюта = ВалютыДатыКурсов.Валюта
	               |			И КурсыВалют.Период <= ВалютыДатыКурсов.ДатаКурса
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ВалютыДатыКурсов.ДатаКурса,
	               |	КурсыВалют.Валюта
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	ДатыКурсовИРегистра.Валюта,
	               |	ДатыКурсовИРегистра.ДатаКурса,
	               |	КурсыВалют.Курс / КурсыВалют.Кратность КАК КурсСКратностью
	               |ПОМЕСТИТЬ КурсыВалютДвижений
	               |ИЗ
	               |	ДатыКурсовИРегистра КАК ДатыКурсовИРегистра
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
	               |		ПО ДатыКурсовИРегистра.ДатаВРегистреВалют = КурсыВалют.Период
	               |			И ДатыКурсовИРегистра.Валюта = КурсыВалют.Валюта
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	КурсыВалютДвижений.Валюта КАК ВалютаИсходная,
	               |	КурсыВалютДвижений1.Валюта КАК ВалютаРезультат,
	               |	КурсыВалютДвижений.ДатаКурса,
	               |	КурсыВалютДвижений.КурсСКратностью КАК КурсИсходный,
	               |	КурсыВалютДвижений1.КурсСКратностью КАК КурсРезультат,
	               |	КурсыВалютДвижений.КурсСКратностью / КурсыВалютДвижений1.КурсСКратностью КАК КроссКурс
	               |ПОМЕСТИТЬ КроссКурсыВалют
	               |ИЗ
	               |	КурсыВалютДвижений КАК КурсыВалютДвижений
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалютДвижений КАК КурсыВалютДвижений1
	               |		ПО КурсыВалютДвижений.ДатаКурса = КурсыВалютДвижений1.ДатаКурса";
	Запрос.Выполнить();
...Показать Скрыть
3. Циля Аскерман (olenka-ul) 1 29.12.16 15:55 Сейчас в теме
(1) Я думаю Вам нужно взять КурсыВалютСрезПоследних, и регистр КурсыВалютСрезПоследних присоединять левым соединением.
4. Иван Иванов (dll) 8 29.12.16 16:08 Сейчас в теме
(3) Ему нужно на каждую дату записи, а не на последнюю дату.


(1) возьми в пакете сначала все курсы, потом соедини со своей таблицей с условием по дате и сгруппируй по Максимум(ПериодКурса) и последний пакет - объединяешь свою таблицу с регистром курсов валют по Максимум(ПериодКурса) и Период из регистра.
5. Александр (user608303_1c-grand) 03.01.17 21:31 Сейчас в теме
(4)
возьми в пакете сначала все курсы, потом соедини со своей таблицей с условием по дате и сгруппируй по Максимум(ПериодКурса) и последний пакет - объединяешь свою таблицу с регистром курсов валют по Максимум(ПериодКур


Не получается((
Можно на примере моего запроса
6. Д. Р. (starjevschik) 04.01.17 11:10 Сейчас в теме
(5) я же написал готовое правильное решение в (2)...
7. Сан Саныч (herfis) 116 04.01.17 11:46 Сейчас в теме
Вопрос очень-очень частый. Но если гугл забанили, могу дать топовую ссылку:
Срез последних на каждую дату в СКД и запросе
Оставьте свое сообщение