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

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

  • автор:

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

Доброго дня всем! Есть следующий запрос:
ВЫБРАТЬ
СУММА(ОплатаПоставщику.СуммаДокумента * КурсыВалютСрезПоследних.Курс) КАК СуммаДокумента,
СУММА(ОплатаПоставщику.СуммаЗатрат * КурсыВалютСрезПоследних.Курс) КАК СуммаЗатрат
ИЗ
Документ.ОплатаПоставщику КАК ОплатаПоставщику
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ПО ОплатаПоставщику.ВалютаДокумента = КурсыВалютСрезПоследних.Валюта
ГДЕ
ОплатаПоставщику.Сделка = &Сделка

Но хотелось бы переводить суммы в рубли не по последнему курсу, а для каждого документа на его дату. Ума не приложу как это сделать и возможно ли? Заранее благодарен за все толковые советы!

Баян. Ща дам ссылку.
Ага! Вдумчиво курим ссылку.

Читал, не понял — что нужно поместить во временную таблицу? Получается весь регистр курсов валют? Я ведь не знаю какие валюты и на какие даты мне понадобятся.

да код не причем 100%
но если просишь.

Функция Импорт_Файла_ДБФ(Параметр)
ФайлБД = СоздатьОбъект(«XBase»);
Попытка
ФайлБД.ОткрытьФайл(Путь,,1);
Исключение
Предупреждение(Путь + РазделительСтрок + «Ошибка открытия файла!»);
Возврат 0;
КонецПопытки;
Если ФайлБД.Открыта() = 0 Тогда
Предупреждение(Путь + РазделительСтрок + «Ошибка открытия файла!» + РазделительСтрок + «Возможно, файл используется другим приложением.»);
Возврат 0;
КонецЕсли;
ФайлБД.КодоваяСтраница(2-Кодировка);
ФайлБД.Первая();
Пока (ФайлБД.вКонце() = 0) Цикл
Если ФайлБД.ЗаписьУдалена() = 1 Тогда
ФайлБД.Следующая();
Продолжить;
КонецЕсли;

Состояние(«Обрабатывается строка №» + ФайлБД.НомерЗаписи());

ДатаОплаты = СокрЛП(ФайлБД.DATA);
ДатаОплаты = Дата(Число(Сред(ДатаОплаты,7,4)),Число(Сред(ДатаОплаты,4,2)),Число(Сред(ДатаОплаты,1,2)));

У меня получилось при помощи СКД — метод, который в той статье внизу.
(4) Во временную таблицу можно поместить валюты и даты документов. Можно, но необязательно.

Как я могу поместить в таблицу даты документов? Я ведь их не знаю до запроса. И почему это необязательно?

(8) Врубись в то, что делает описанный запрос. Очень детально и тщательно. После этого — всё поймешь.

ВЫБРАТЬ
СУММА(таб1.СуммаДокумента * таб2.Курс) КАК СуммаДокумента,
СУММА(таб1.СуммаЗатрат * таб2.Курс) КАК СуммаЗатрат

ИЗ
(ВЫБРАТЬ
ОплатаПоставщику.Ссылка КАК СсылкаДок,
ОплатаПоставщику.СуммаДокумента,
ОплатаПоставщику.СуммаЗатрат,
ОплатаПоставщику.Дата КАК ДатаДок,
ОплатаПоставщику.ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
Документ.ОплатаПоставщику КАК ОплатаПоставщику
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период Валюты.Валюта = ОплатаПоставщику.ВалютаДокумента
СГРУППИРОВАТЬ ПО
ОплатаПоставщику.Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2
ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта

теперь возми и обдумай всё ето

да код не причем 100%
но если просишь.

Функция Импорт_Файла_ДБФ(Параметр)
ФайлБД = СоздатьОбъект(«XBase»);
Попытка
ФайлБД.ОткрытьФайл(Путь,,1);
Исключение
Предупреждение(Путь + РазделительСтрок + «Ошибка открытия файла!»);
Возврат 0;
КонецПопытки;
Если ФайлБД.Открыта() = 0 Тогда
Предупреждение(Путь + РазделительСтрок + «Ошибка открытия файла!» + РазделительСтрок + «Возможно, файл используется другим приложением.»);
Возврат 0;
КонецЕсли;
ФайлБД.КодоваяСтраница(2-Кодировка);
ФайлБД.Первая();
Пока (ФайлБД.вКонце() = 0) Цикл
Если ФайлБД.ЗаписьУдалена() = 1 Тогда
ФайлБД.Следующая();
Продолжить;
КонецЕсли;

Состояние(«Обрабатывается строка №» + ФайлБД.НомерЗаписи());

ДатаОплаты = СокрЛП(ФайлБД.DATA);
ДатаОплаты = Дата(Число(Сред(ДатаОплаты,7,4)),Число(Сред(ДатаОплаты,4,2)),Число(Сред(ДатаОплаты,1,2)));

Если (ДатаОплаты <> Параметр.Получить(«ДатаДок»)) или (СокрЛП(ФайлБД.KL_CHK) <> РСчет) или (Цел(ФайлБД.CUR_ID) <> 980) Тогда
ФайлБД.Следующая();
Продолжить;
КонецЕсли;

Если ФайлБД.DK = 1 Тогда // расход

Сп = СоздатьОбъект(«СписокЗначений»);
Сп.Установить(«Расход», ФайлБД.S);
Сп.Установить(«Приход», 0);
ИначеЕсли ФайлБД.DK = 0 Тогда // приход

(10) Ваш запрос дал цифры в 33 раза больше 🙂
а запрос
ВЫБРАТЬ
СУММА(ОплатаПоставщику.СуммаДокумента * КурсыВалют.Курс) КАК Оплата,
СУММА(ОплатаПоставщику.СуммаЗатрат * КурсыВалют.Курс) КАК Затраты
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОплатаПоставщику КАК ОплатаПоставщику
ПО (ОплатаПоставщику.ВалютаДокумента = КурсыВалют.Валюта)
И (ОплатаПоставщику.Дата = КурсыВалют.Период)
ГДЕ
ОплатаПоставщику.Сделка = &Сделка

Вообще ничего не дал. 🙁

ПолучитьКурсВалюты (БСП)

  • Получить курс валюты. Возвращает курс валюты на дату.

    // Возвращает курс валюты на дату. // // Параметры: // Валюта - СправочникСсылка.Валюты - валюта, для которой получается курс. // ДатаКурса - Дата - дата, на которую получается курс. // // Возвращаемое значение: // Структура - параметры курса: // * Курс - Число - курс валюты на указанную дату. // * Кратность - Число - кратность валюты на указанную дату. // * Валюта - СправочникСсылка.Валюты - ссылка валюты. // * ДатаКурса - Дата - дата получения курса. // Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт Результат = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаКурса, Новый Структура("Валюта", Валюта)); Результат.Вставить("Валюта", Валюта); Результат.Вставить("ДатаКурса", ДатаКурса); Возврат Результат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
    // Возвращает курс валюты на дату. // // Параметры: // Валюта - СправочникСсылка.Валюты - валюта, для которой получается курс. // ДатаКурса - Дата - дата, на которую получается курс. // // Возвращаемое значение: // Структура - параметры курса: // * Курс - Число - курс валюты на указанную дату. // * Кратность - Число - кратность валюты на указанную дату. // * Валюта - СправочникСсылка.Валюты - ссылка валюты. // * ДатаКурса - Дата - дата получения курса. // Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт Результат = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаКурса, Новый Структура("Валюта", Валюта)); Результат.Вставить("Валюта", Валюта); Результат.Вставить("ДатаКурса", ДатаКурса); Возврат Результат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////

    1С. Получение курса валюты на дату каждого документа

    Получить курс валюты на дату каждого документа «Поступление товаров и услуг» из указанного периода.

    Решение

    Необходимые данные будем получать в запросе при помощи ТЕТА-соединения, действия в запросе прокомментированы.

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

    Понравилась статья? Поделиться с друзьями:

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

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

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

     ВЫБРАТЬ 
    ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
    ЗаказПокупателя.Дата КАК Дата,
    ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
    ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
    ЗаказПокупателя.*,
    Дата,
    ВалютаДокумента.*,
    СуммаДокумента>
    ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя
    ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
    ЗаказПокупателя.СуммаДокумента>

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

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

     ВЫБРАТЬ 
    &Дата КАК Дата,
    КурсыВалютСрезПоследних.Валюта КАК Валюта,
    КурсыВалютСрезПоследних.Курс КАК Курс,
    КурсыВалютСрезПоследних.Кратность КАК Кратность
    Дата,
    Валюта.*,
    Курс,
    Кратность>
    ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
    КурсыВалютСрезПоследних.Курс,
    КурсыВалютСрезПоследних.Кратность>

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

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

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

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

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

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

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *