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