Как получить курс валюты на дату документа в запросе 1с

от admin

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

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

ТекстЗапроса = ТекстЗапроса + "
|" + мТекст;

ИначеЕсли ИмяРегистра = "Хозрасчетный" Тогда

Результат = Результат + "
|" +
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеквизитыДокумента.ДатаПринятияКУчету КАК Период,
| РеквизитыДокумента.Ссылка КАК Регистратор,
| РеквизитыДокумента.Сделка,
| РеквизитыДокумента.Сделка.ЦФО КАК ЦФО,
| РеквизитыДокумента.Организация КАК Организация,
| РеквизитыДокумента.ВыгружатьВБухгалтерию КАК ВыгружатьВБухгалтерию,
| РеквизитыДокумента.Контрагент КАК Контрагент,
| РеквизитыДокумента.Контрагент.СчетУчетаВыручки КАК СчетУчетаВыручки,
| РеквизитыДокумента.Контрагент.СчетУчетаСебестоимостиПродаж КАК СчетУчетаСебестоимостиПродаж,
| РеквизитыДокумента.ВалютаДокументаРег КАК ВалютаДокументаРег,
| РеквизитыДокумента.Сделка.ВалютаДокумента КАК ВалютаВзаиморасчетов,
| ИСТИНА КАК Активность,
| КурсыВалютПоДатеПринятияКУчету.Курс КАК КурсСделкиПоДатеПринятияКУчету,
| КурсыВалютПоДатеПринятияКУчету.Кратность КАК КратностьСделкиПоДатеПринятияКУчету
|ИЗ
| РеквизитыДокумента КАК РеквизитыДокумента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалютПоДатеПринятияКУчету КАК КурсыВалютПоДатеПринятияКУчету
| ПО РеквизитыДокумента.Сделка.ВалютаДокумента = КурсыВалютПоДатеПринятияКУчету.Валюта";

Как получить Срез Последних значений на Каждую Дату

Данный способ подходит для отчетов. Из очевидных плюсов — если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.

Для примера сделаем отчет — список заказов покупателей.
Для этого создадим набор данных "Документы" — запрос:
Код 1C v 8.х

Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.

Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х

В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях — это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
title

Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "Дата", выражение приемник — "Дата", Параметр — "Дата"
2. Источник связи — набор "Документы", приемник — набор "Курсы валют". Выражение источник — "ВалютаДокумента", выражение приемник — "Валюта", Параметр — "Валюта"
title

Главное здесь — параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае — запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.

Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля — "СуммаДокумента * Курс / Кратность".
title

Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
title

Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
title

Можно формировать отчет
title

Заметки по 1С:Предприятие 8.2, 8.3

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

Страницы

  • Главная
  • Полезности
  • Мои сертификаты

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

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

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

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

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

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

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

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

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

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

Читать:
Как проверить дробное ли число в python

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

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

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

Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних.

Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних.

Часто возникает потребность в этом, например, отложенное формирование проводок (или построение отчета) в валюте регламентировано учета (обычно «руб») для документов (или других данных) введенным в у.е. (например USD или EUR).

Во вложении готовый пример, обработка.

Пример запроса с комментариями:

// Исходные данные передаем в запрос

| &ИсходныеДанные КАК ИсходныеДанные

// Выбираем для каких валют на какие даты надо получить курсы валют

| ИсходныеДанные КАК ИсходныеДанные

// Выбираем ближайшую дату для курса валют

| МАКСИМУМ (КурсыВалют.Период) КАК Период

| ДатаВалюта КАК ДатаВалюта

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют

| ПО ДатаВалюта.Валюта = КурсыВалют.Валюта

| И ДатаВалюта.Дата >= КурсыВалют.Период

// Получаем курсы валют на все даты, которые нужны

| ДатаКурса КАК ДатаКурса

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют

| ПО ДатаКурса.Валюта = КурсыВалют.Валюта

| И ДатаКурса.Период = КурсыВалют.Период

// Объединяем исходные данные с курсами валют

| ИсходныеДанные.Сумма * КурсыВалютСрез.Курс / КурсыВалютСрез.Кратность КАК Итог

| ИсходныеДанные КАК ИсходныеДанные

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалютСрез КАК КурсыВалютСрез

| ПО ИсходныеДанные.Валюта = КурсыВалютСрез.Валюта

| И ИсходныеДанные.Дата = КурсыВалютСрез.Дата»;

Есть вопросы по запросам пишите, постараюсь ответить.

Related Posts

13 Comments

Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних.

Часто возникает потребность в этом, например, отложенное формирование проводок (или построение отчета) в валюте регламентировано учета (обычно «руб») для документов (или других данных) введенным в у.е. (например USD или EUR).

Впечатление дикого дежа-вю. Где я это мог видеть? Впрочем, сейчас набежит местная илита местный бомонд грабить корованы, раскритикует или похвалит.

(1) Поручик, не исключенно, что подобное мог реализовать кто угодно.

Поиск не дал результатов, решил разместить своё.

Примерно так же я решал задачу по РЕПО при сдаче Спеца 1С по Платформе.

(0) То что вы описали — это не есть «Срез последних на каждую дату в запросе»? Если поиском посмотреть — на этом же сайте есть предложенные решения на СКД и в запросе. Вещь полезная.

Оформите публикацию(запрос) нормально

(3) echo77, запрос оформил.

Решение на СКД не нашел, интересно было посмотреть как решили эту проблему там, вдруг что-то интернесное.

(5) echo77, да там аналогичная задача.

Только там, остатки на каждый день * цены номенклатуры на дату остатка.

А у меня документы суммы в УЕ * Курс да дату документа.

Будет новичкам для примера.

Статья оказалась очень полезной, спасибо.

Скажите, для 8,3 есть?

А если курса валюты нет на дату документа? тогда в колонке курс пусто?

Да там получается пусто

(10) Будет курс на какую то ближайшую предыдущую дату до даты документа, на которую есть курс.

Хорошая статья. Достаточно просто и понятно. Конечно можно и самому сделать , но это время. А времени обычно мало, потому что работы много. Использовал идею данной статьи для расчета котировок для оценки стоимости ввода вывода ценных бумаг по документам за период (во завернул фразу!). Там и котировки нужно брать на предыдущий рабочий день нужной биржи, ну и курс валюты сами понимаете… В общем автору спасибо. Сэкономил мне время!

Похожие статьи