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)
| И КурсыВалют.Валюта = &Доллар"
Показать
вроде бы на первый взгляд все нормально, курс на эти даты выводится правильный, но записи попадают не все, и отчет формирует не правильную итоговую сумму.
Я думаю это за счет того что если на эту дату нету курса в рег.сведений, то запись не выводится.
А как сделать так, что если нету курса на эту дату, чтобы брался предыдущий, по принципу "СрезПоследних"
(3) Ему нужно на каждую дату записи, а не на последнюю дату.
(1) возьми в пакете сначала все курсы, потом соедини со своей таблицей с условием по дате и сгруппируй по Максимум(ПериодКурса) и последний пакет - объединяешь свою таблицу с регистром курсов валют по Максимум(ПериодКурса) и Период из регистра.
возьми в пакете сначала все курсы, потом соедини со своей таблицей с условием по дате и сгруппируй по Максимум(ПериодКурса) и последний пакет - объединяешь свою таблицу с регистром курсов валют по Максимум(ПериодКур
Универсальный запрос-конвертер валют. На вход надо подать временные таблицы: ВсеВалюты - это все используемые валюты (одно поле Валюта), ВсеДатыКурсов - это все даты, на которые нужны курсы (одно поле ДатаКурса).
На выходе у него временная таблица КроссКурсыВалют, там вроде все понятно.
Запрос.Текст = "ВЫБРАТЬ
| ВсеВалюты.Валюта,
| ВсеДатыКурсов.ДатаКурса
|ПОМЕСТИТЬ ВалютыДатыКурсов
|ИЗ
| ВсеВалюты КАК ВсеВалюты
| ПОЛНОЕ СОЕДИНЕНИЕ ВсеДатыКурсов КАК ВсеДатыКурсов
| ПО (ИСТИНА)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| МАКСИМУМ(КурсыВалют.Период) КАК ДатаВРегистреВалют,
| КурсыВалют.Валюта,
| ВалютыДатыКурсов.ДатаКурса
|ПОМЕСТИТЬ ДатыКурсовИРегистра
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВалютыДатыКурсов КАК ВалютыДатыКурсов
| ПО КурсыВалют.Валюта = ВалютыДатыКурсов.Валюта
| И КурсыВалют.Период <= ВалютыДатыКурсов.ДатаКурса
|
|СГРУППИРОВАТЬ ПО
| ВалютыДатыКурсов.ДатаКурса,
| КурсыВалют.Валюта
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДатыКурсовИРегистра.Валюта,
| ДатыКурсовИРегистра.ДатаКурса,
| КурсыВалют.Курс / КурсыВалют.Кратность КАК КурсСКратностью
|ПОМЕСТИТЬ КурсыВалютДвижений
|ИЗ
| ДатыКурсовИРегистра КАК ДатыКурсовИРегистра
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
| ПО ДатыКурсовИРегистра.ДатаВРегистреВалют = КурсыВалют.Период
| И ДатыКурсовИРегистра.Валюта = КурсыВалют.Валюта
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КурсыВалютДвижений.Валюта КАК ВалютаИсходная,
| КурсыВалютДвижений1.Валюта КАК ВалютаРезультат,
| КурсыВалютДвижений.ДатаКурса,
| КурсыВалютДвижений.КурсСКратностью КАК КурсИсходный,
| КурсыВалютДвижений1.КурсСКратностью КАК КурсРезультат,
| КурсыВалютДвижений.КурсСКратностью / КурсыВалютДвижений1.КурсСКратностью КАК КроссКурс
|ПОМЕСТИТЬ КроссКурсыВалют
|ИЗ
| КурсыВалютДвижений КАК КурсыВалютДвижений
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалютДвижений КАК КурсыВалютДвижений1
| ПО КурсыВалютДвижений.ДатаКурса = КурсыВалютДвижений1.ДатаКурса";
Запрос.Выполнить();