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

Обновлено: 07.07.2024

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

среда, 12 марта 2014 г.

Типовая функция для получения курса валют на дату

// Возвращает курс валюты на дату
//
// Параметры:
// Валюта - Валюта (элемент справочника "Валюты")
// ДатаКурса - Дата, на которую следует получить курс
// ПроверятьКурс - Если Истина и курс или кратность для валюты не установлены (=0),
// то им будет присвоено значение 1 (для избежания дальнейших ошибок деления на 0)
//
// Возвращаемое значение:
// Структура, содержащая:
// Курс - курс валюты
// Кратность - кратность валюты
//
Функция ПолучитьКурсВалюты ( Валюта , ДатаКурса , ПроверятьКурс = Истина) Экспорт


Если НЕ ЗначениеЗаполнено ( Валюта ) Тогда
ОбщегоНазначения . СообщитьСлужебнуюИнформацию ( "ПолучитьКурсВалюты() - не заполнена валюта" );

Возврат Новый Структура ( "Курс, Кратность" , 1 , 1 );

СтруктураКурсов = РегистрыСведений . КурсыВалют . ПолучитьПоследнее ( ДатаКурса , Новый Структура ( "Валюта" , Валюта ));

Если СтруктураКурсов . Курс = 0 и ПроверятьКурс Тогда

СтруктураКурсов . Вставить ( "Курс" , 1 );
ОбщегоНазначения . СообщитьОбОшибке ( "По валюте """ + Валюта + """ на дату """ + ДатаКурса + """ обнаружен нулевой курс."
+ Символы . ПС + Символы . Таб + "Временно, для расчетов, присвоено значение 1." );

Если СтруктураКурсов . Кратность = 0 и ПроверятьКурс Тогда

СтруктураКурсов . Вставить ( "Кратность" , 1 );
ОбщегоНазначения . СообщитьОбОшибке ( "По валюте """ + Валюта + """ на дату """ + ДатаКурса + """ обнаружена нулевая кратность."
+ Символы . ПС + Символы . Таб + "Временно, для расчетов, присвоено значение 1." );

А это текст этой же функции только из УТ:

// Возвращает курс валюты на дату
//
// Параметры:
// Валюта - Валюта (элемент справочника "Валюты")
// ДатаКурса - Дата, на которую следует получить курс
//
// Возвращаемое значение:
// Структура, содержащая:
// Курс - курс валюты
// Кратность - кратность валюты
//
Функция ПолучитьКурсВалюты ( Валюта , ДатаКурса ) Экспорт

Структура = РегистрыСведений . КурсыВалют . ПолучитьПоследнее ( ДатаКурса , Новый Структура ( "Валюта" , Валюта ));
Возврат Структура ;

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

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

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

но если просишь.

У меня получилось при помощи СКД - метод, который в той статье внизу.
(4) Во временную таблицу можно поместить валюты и даты документов. Можно, но необязательно.
Как я могу поместить в таблицу даты документов? Я ведь их не знаю до запроса. И почему это необязательно?
(8) Врубись в то, что делает описанный запрос. Очень детально и тщательно. После этого - всё поймешь.

но если просишь.

(0) автор, вот тебе поясняющий мануал "на пальцах" /код писать не буду/:

1) выбрать все различные даты документов и валюты из самих документов,
получится табличка
-------------
Дата | Валюта
-------------
2) присоединить к этому по валюте регистр сведений курсов, так:
Дата | Валюта | ДатаКурса
--------------------------
01.01 USD 01.01
10.01 USD 01.01
10.01 USD 05.01
10.01 USD 07.01
15.01 EUR 01.01
15.01 EUR 08.01

3) группируем по "валюта, дата" и добавляем ДатаКурса = MAX(Валюты.Период),
получим дату реальной записи в рег. сведений
--------------------------
Дата | Валюта | ДатаКурса
--------------------------
01.01 USD 01.01
10.01 USD 07.01
15.01 EUR 08.01

4) присоединяем сам курс из рег. сведений (не срез!) на дату "ДатаКурса".
Готово.

Как собирать разные части - твое дело, хочешь - через временные таблицы, хочешь - оборачивай в подзапросы. Не принципиально.

Существует несколько способов получить нужные данные.

Непосредственно в запросе

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

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

В 8.1. вместо обращения к курсам валют удобнее и надежнее использовать временную таблицу с нужными
датами, потому что не во всех организациях ведут курсы валют ежедневно. ;-)

Для общего развития:
Что есть срез последних в платформе?

В зависимости от периодичности регистра (по времени, по позиции регистратора) ВТ разворачивается в
следующий запрос:
1. По времени (год, месяц, . секунда)

2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку

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

Система компоновки данных

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

Для примера сделаем отчет - список заказов покупателей.

Для этого создадим набор данных "Документы" - запрос:

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

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

Существует несколько способов получить нужные данные.

Непосредственно в запросе

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

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

В 8.1. вместо обращения к курсам валют удобнее и надежнее использовать временную таблицу с нужными датами, потому что не во всех организациях ведут курсы валют ежедневно.

Для общего развития: Что есть срез последних в платформе?

В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:

1. По времени (год, месяц, … секунда)

2. По позиции регистратора В данном случае нужно еще раз обернуть выборку

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

Система компоновки данных

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

Для примера сделаем отчет - список заказов покупателей.

Для этого создадим набор данных «Документы» - запрос:

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871726.jpg

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871728.jpg

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

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871729.jpg

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

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871876.jpg

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

defender_aka_linn.users.photofile.ru_photo_defender_aka_linn_150041386_154871877.jpg

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

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

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

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

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

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

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

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

(5) echo77, да там аналогичная задача.
Только там, остатки на каждый день * цены номенклатуры на дату остатка.
А у меня документы суммы в УЕ * Курс да дату документа.

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

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

Просмотры 51185

Загрузки 55

Рейтинг 47

Создание 25.06.12 12:28

Обновление 28.06.12 09:19

№ Публикации 140933

Операционная система Не имеет значения

Страна Россия

Вид учета Не имеет значения

Доступ к файлу Абонемент ($m)

Код открыт Не указано

Учебно-методический комплекс является уникальной разработкой с использованием «лучших практик», наработанных автором в проектах на предприятиях разных масштабов, отраслей и сфер деятельности Учебно-методический комплекс «Управление закупками: инструменты работы с требованиями»

См. также

Эмулятор скриптов в 1С:Документооборот Промо

В 1С:Документообороте можно использовать программный код 1С в пользовательском режиме (не в конфигураторе). Однако если в конфигураторе есть отладчик, то в пользовательском режиме протестировать скрипт достаточно сложно. Внешняя обработка Эмулятор скриптов позволяет вывести результаты скрипта и проверить работу алгоритма на разных документах.

13.12.2017 24814 106 0

Отключение создания задачи ознакомления для бизнес-процесса "Согласование" в 1С: Документооборот

В данной публикации я хочу поделиться расширением, с помощью которого можно отключить создание задачи ознакомления для бизнес-процесса "Согласование" в 1С: Документооборот.

1 стартмани

30.11.2019 19124 54 pavelpribytkin96 5

1С: Документооборот. Роли, использующие объекты адресации. Конфигурация остается типовой (используется расширение)

Расширение функционала документооборота. Реализована возможность использования ролей с объектами адресации. Конфигурация остается типовой (используется расширение)

5 стартмани

10.01.2019 18659 28 sulig 27

Год жизни с Яндекс.Почтой

Опишу свой опыт работы с Яндекс.Почтой из 1С:Документооборота. Ошибки, которые, видимо, редки и поэтому нигде не описаны, в основном побеждены и, может, мой опыт поможет кому-нибудь в его борьбе.

1 стартмани

05.01.2019 17182 5 soulner 0

Видеокурс-самоучитель "1С:Документооборот " для самостоятельного внедрения Промо

Самый детальный и самый полный самоучитель по программе 1С:Документооборот, в котором Вы научитесь правильно работать, настраивать, администрировать и внедрять конфигурацию 1С:Документооборот. Все уроки курса построены на последовательном заполнении пустой базы 1С:Документооборот КОРП в клиент-серверном варианте.

30.10.2018 32948 10 0

Печать pdf документа со штампом ЭЦП

Печать pdf файла, прикрепленного к внутреннему документу, подписанному ЭЦП, с установкой отметки о подписании.

1 стартмани

24.05.2018 25893 127 App0st0l 14

Ограничения запуска процессов в 1С:Документооборот

Расширение "Ограничение запуска процессов" позволяет для разных групп пользователей убрать не нужные типы процессов для запуска для разных видов документов.

03.04.2017 19838 34 0

Управление договорами в 1С:Документооборот

В 1С:Документооборот в релизах 2.1.7 и 2.1.8 концепция учета договоров продолжила свое развитие (появились стороны договора). Это повлияло и на бизнес-процессы (теперь вместо процесса Утверждение надо пользоваться процессом Подписание для договоров). Рассмотрим основные моменты, на которые надо обратить внимание при внедрении управления договорами в 1С:Документооборот.

24.01.2017 39220 vlush78 0

Перенос документов и процессов между двумя базами 1С:Документооборота Промо

Обработка по переносу документов поможет перенести документы и процессы из одной базы 1С:Документооборот в другую. Версии двух баз должны совпадать, а релизы конфигураций 1С:Документооборот могут быть различными. Главное, чтобы была синхронизирована НСИ.

09.06.2016 30574 8 10

Блокировка повторного запуска комплексного процесса в 1С: Документооборот 2

Острой проблемой при работе документооборота стал повторный запуск комплексного процесса. Пользователи несколько раз запускали один и тот же комплексный процесс по документу, не убедившись, что этот же процесс уже запущен. В результате наступил хаос, все возмущались и недоумевали, почему один и тот же документ приходил на согласование и исполнение несколько раз.

2 стартмани

04.10.2016 29062 96 zabaluev 25

Права доступа в 1С:Документооборот 2.1

В программе 1С:Документооборот ред 2.1 механизм системы прав доступа сильно изменился. С одной стороны, права доступа в данной версии стали проще и быстрее, с другой стороны - права по рабочим группам объектов теперь могут противоречить политикам доступа. Разберемся в данной статье как работает механизм прав доступа в 1с документообороте 2.1.

16.09.2016 88452 vlush78 0

Новое в 1С:Документооборот ред. 2.1

Фирма 1С не стоит на месте и продолжает радовать нас своими новыми версиями конфигурации 1С:Документооборот. В конце мая 2016 года вышла новая редакция 2.1, которая содержит как принципиально новые возможности, так и улучшение старых функций. В данной статье будут рассмотрены отличия конфигурации 1С:Документооборот редакции 2.1 по сравнению с редакцией 2.0.

15.06.2016 34275 vlush78 7

Нагрузочное тестирование 1С:Документооборот

Перед запуском 1С:Документооборот для средних и крупных внедрений крайне желательно провести нагрузочное тестирование, чтобы проверить корректность и скорость работы системы электронного документооборота в условиях максимальной нагрузки. В данной статье пойдет речь о том, как провести нагрузочное тестирование в 1С:Документооборот без использования 1С:КИП.

Читайте также: