Загрузка курсов валют Нацбанка Беларуси в 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 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

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

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

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