Загрузка курсов валют Нацбанка Беларуси в 2024
Согласно официальной документации API адрес API поменялся на https://www.nbrb.by/apihelp/exrates:
Взял за основу загрузки курсов валют разработку с Инфостарта.
Пример запроса информации по валюте: https://api.nbrb.by/exrates/rates/643?parammode=1
{"Cur_ID":456,"Date":"2024-01-05T00:00:00","Cur_Abbreviation":"RUB","Cur_Scale":100,"Cur_Name":"Российских рублей","Cur_OfficialRate":3.4998}
Пример запроса курсов за период: https://api.nbrb.by/ExRates/Rates/Dynamics/431?startDate=2022-3-1&endDate=2022-3-10
[{"Cur_ID":431,"Date":"2022-03-01T00:00:00","Cur_OfficialRate":3.0744},{"Cur_ID":431,"Date":"2022-03-02T00:00:00","Cur_OfficialRate":2.9405},{"Cur_ID":431,"Date":"2022-03-03T00:00:00","Cur_OfficialRate":3.0975},{"Cur_ID":431,"Date":"2022-03-04T00:00:00","Cur_OfficialRate":3.0995},{"Cur_ID":431,"Date":"2022-03-05T00:00:00","Cur_OfficialRate":3.0995},{"Cur_ID":431,"Date":"2022-03-06T00:00:00","Cur_OfficialRate":3.0995},{"Cur_ID":431,"Date":"2022-03-07T00:00:00","Cur_OfficialRate":3.0995},{"Cur_ID":431,"Date":"2022-03-08T00:00:00","Cur_OfficialRate":3.0995},{"Cur_ID":431,"Date":"2022-03-09T00:00:00","Cur_OfficialRate":3.0984},{"Cur_ID":431,"Date":"2022-03-10T00:00:00","Cur_OfficialRate":3.3031}]
Скопировал регистр сведений курсов валют:
В форме разместил кнопки загрузки курсов валют за период:
&НаКлиенте Процедура ЗагрузитьКурсы(Команда) ЗагрузитьКурсыНаСервере(); КонецПроцедуры Процедура ЗагрузитьКурсыНаСервере() ОбщегоНазначения.ОбщийМодуль("дор_Сервер").ЗагрузкаКурсовВалютРБ(Дата1, Дата2); КонецПроцедуры
Также создал регламентное задание для загрузки курсов валют.
Грузятся только те валюты, где указан способ загрузки из интернета.
Общий код решения:
Процедура ЗагрузкаКурсовВалютРБ(Дата1 = Неопределено, Дата2 = Неопределено) Экспорт //Из регламентного задания дор_ЗагрузкаКурсовВалютРБ З = Новый Запрос( "ВЫБРАТЬ | Т.Ссылка КАК Ссылка, | Т.Код КАК КодВалюты, | Т.Наименование КАК Наименование, | Т.НаименованиеСокращенное КАК НаименованиеСокращенное, | Т.НаименованиеПолное КАК НаименованиеПолное, | Т.СимвольноеПредставление КАК СимвольноеПредставление, | Т.СпособУстановкиКурса КАК СпособУстановкиКурса, | дор_КурсыВалютРБСрезПоследних.Период КАК Период |ИЗ | РегистрСведений.дор_КурсыВалютРБ.СрезПоследних(, ) КАК дор_КурсыВалютРБСрезПоследних | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Т | ПО дор_КурсыВалютРБСрезПоследних.Валюта = Т.Ссылка |ГДЕ | Т.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета) "); ТЗ = З.Выполнить().Выгрузить(); Для Каждого Строка ИЗ ТЗ Цикл Если ЗначениеЗаполнено(Дата1) Тогда НачалоПериода = Дата1; Иначе НачалоПериода = Строка.Период; Если НачалоПериода = NULL Тогда Продолжить; КонецЕсли; КонецЕсли; Если ЗначениеЗаполнено(Дата2) Тогда КонецПериода = Дата2; Иначе КонецПериода = Текущаядата(); КонецЕсли; СписокВалют = Новый Массив(); СписокВалют.Добавить(Новый Структура("КодВалюты, Валюта", Строка.КодВалюты, Строка.Ссылка)); ПриЗагрузкеВозниклиОшибки = ""; КВ_ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки); КонецЦикла; КонецПроцедуры #Область ЗагрузкаКурсовВалютБеларусь //https://infostart.ru/1c/tools/1620407/ Функция КВ_ПолучитьHTTPСоединение() Экспорт Соединение = Неопределено; SSL = Новый ЗащищенноеСоединениеOpenSSL(); Попытка Таймаут = 120; Соединение = Новый HTTPСоединение("api.nbrb.by",,,,,Таймаут, SSL); //с 10.05.2023 доменное имя изменилось на api.nbrb.by //https://www.nbrb.by/apihelp/exrates //Соединение = Новый HTTPСоединение("www.nbrb.by",,,,,Таймаут, SSL); Исключение Сообщить("Ошибка создания соединения"); Возврат Неопределено; КонецПопытки; Возврат Соединение; КонецФункции Функция КВ_ЗапросHTTP_курс(Код) ЗапросHTTP = Новый HTTPЗапрос(); //ЗапросHTTP.АдресРесурса = "/api/exrates/rates/" + 840 + "?parammode=1&ondate=" + Формат(Дата, "ДФ=yyyy-M-d"); ЗапросHTTP.АдресРесурса = "/exrates/rates/" + Код + "?parammode=1"; Возврат ЗапросHTTP; КонецФункции Функция КВ_ЗапросHTTP_курсы(Код, НачалоПериода, КонецПериода) //https://www.nbrb.by/API/ExRates/Rates/Dynamics/431?startDate=2022-3-1&endDate=2022-3-10 курс валюты за период 1 файлом //Доллар ЗапросHTTP = Новый HTTPЗапрос(); ЗапросHTTP.АдресРесурса = "/ExRates/Rates/Dynamics/" + Код + "?startDate="+Формат(НачалоПериода, "ДФ=yyyy-M-d")+ "&endDate=" + Формат(КонецПериода, "ДФ=yyyy-M-d"); Возврат ЗапросHTTP; КонецФункции Процедура КВ_ЗагрузитьКурсыВалютПоПараметрам(СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки) //https://www.nbrb.by/api/exrates/rates/840?parammode=1 - получение внутреннего кода валюты "Cur_ID" //https://www.nbrb.by/API/ExRates/Rates/Dynamics/431?startDate=2022-3-1&endDate=2022-3-10 курс валюты за период 1 файлом Соединение = КВ_ПолучитьHTTPСоединение(); Если Соединение = Неопределено Тогда Возврат; КонецЕсли; Для каждого Валюта из СписокВалют Цикл ВнутрКод = ""; ЗапросHTTP = КВ_ЗапросHTTP_курс(Валюта.КодВалюты); Ответ = Соединение.Получить(ЗапросHTTP); Если Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 204 Тогда Иначе Возврат; КонецЕсли; ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); ПП = КВ_ПрочитатьОтветJSON(ТелоОтвета); ВнутрКод = ПП["Cur_ID"]; Кратность = Число(ПП["Cur_Scale"]); ЗапросHTTP = КВ_ЗапросHTTP_курсы(ВнутрКод, НачалоПериода, КонецПериода); Ответ = Соединение.Получить(ЗапросHTTP); Если Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 204 Тогда Иначе Возврат; КонецЕсли; ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); ПП = КВ_ПрочитатьОтветJSON(ТелоОтвета); Для каждого Эл из ПП Цикл Курс = Число(Эл["Cur_OfficialRate"]); Дата = КВ_СтрокаДаты_ГГГГ_ММ_ДД_ВДату(Эл["Date"]);//"2021-07-09T00:00:00" КВ_ЗаписатьКурсВалюты(Валюта.Валюта, Дата, Курс, Кратность) КонецЦикла; КонецЦикла; КонецПроцедуры Функция КВ_СтрокаДаты_ГГГГ_ММ_ДД_ВДату(Строка) Д = Число(Сред(Строка, 9, 2)); М = Число(Сред(Строка, 6, 2)); Г = Число(Сред(Строка, 1, 4)); Возврат Дата(Г, М, Д); КонецФункции Функция КВ_ПрочитатьОтветJSON(СтрокаJSON) Экспорт Результат = Неопределено; Попытка ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаJSON); Результат = ПрочитатьJSON(ЧтениеJSON, Истина,,,"ПреобразованиеJSON", ); Исключение Возврат Неопределено; КонецПопытки; Возврат Результат; КонецФункции Процедура КВ_ЗаписатьКурсВалюты(Валюта, Дата, Курс, Кратность) МЗ = РегистрыСведений.дор_КурсыВалютРБ.СоздатьМенеджерЗаписи(); МЗ.Валюта = Валюта; МЗ.Период = Дата; МЗ.Курс = Курс; МЗ.Кратность = Кратность; МЗ.Записать(); КонецПроцедуры #КонецОбласти
Среда: УНФ 3.0.4.88. Объем: 2 час.
Свежие комментарии