При ведении учета по зарубежным компаниям, филиалам или при совершении международных сделок часто возникает необходимость отражать курсы валют (например, евро и долларов США) относительно фунтов стерлингов по официальным котировкам Банка Англии (Bank of England). Пересчет через кросс-курсы Центрального банка РФ для таких задач категорически не подходит, так как из-за разницы во времени фиксации и методиках расчета результаты неизбежно разойдутся с данными британских регуляторов и аудиторов.
Разберем по шагам, откуда и каким образом можно автоматически получать официальные курсы валют Банка Англии в базу 1С, как организовать программный разбор котировок и какие нюансы британского финансового календаря следует учитывать.
Банк Англии предоставляет доступ к своей статистической базе котировок (Interactive Statistical Database, IADB). Через данный сервис можно скачивать актуальные данные напрямую по протоколу HTTP/HTTPS в структурированных форматах, минуя парсинг визуальных веб-страниц.
Проанализируем структуру котировок. Чтобы запрашивать конкретные валютные пары, используются уникальные идентификаторы серий (Series Codes):
XUDLUSS (Spot exchange rate, US$ into Sterling).XUDLERS (Spot exchange rate, Euro into Sterling).Сервер базы данных Банка Англии позволяет формировать прямой GET-запрос с указанием начальной и конечной даты выборки, кодов серий и формата отдачи (CSV или XML). Формат CSV предпочтителен для интеграции, так как его чтение и разбор в платформе 1С выполняются быстрее и проще всего.
Рассмотрим, как правильно настроить подключение к серверу Банка Англии. Поскольку современные веб-ресурсы регуляторов работают по защищенному протоколу, для объекта HTTPСоединение обязательно требуется инициализация защищенного канала через ЗащищенноеСоединениеOpenSSL. Также рекомендуется явно передавать заголовок User-Agent в объекте HTTPЗапрос, чтобы веб-сервер не заблокировал обращение как подозрительный запрос робота.
Посмотрим на пример кода, реализующего получение данных по валюте в формате CSV:
Соединение = Новый HTTPСоединение(
"www.bankofengland.co.uk",
443,
,
,
,
,
Новый ЗащищенноеСоединениеOpenSSL()
);
АдресРесурса = "/boeapps/iadb/fromshowspecs.asp?Code=" + КодСерии + "&CSVF=TN&UsingCodes=Y&VPD=Y&VFD=N";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
// Переходим к парсингу полученных строк
Иначе
ЗаписьЖурналаРегистрации("ЗагрузкаКурсовВалют", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка получения курсов BoE: " + Ответ.КодСостояния);
КонецЕсли;
Выясним, как обработать полученную CSV-строку и сохранить результаты в регистр сведений КурсыВалют. Полученный текст содержит дату и числовое значение курса. В англоязычных форматах разделителем дробной части выступает точка, поэтому перед преобразованием в число необходимо выполнить строковую замену на запятую.
Чтение = Новый ЧтениеТекста;
Чтение.УстановитьСтроку(ТелоОтвета);
СтрокаДанных = Чтение.ПрочитатьСтроку();
Пока СтрокаДанных <> Неопределено Доделай
// Пропускаем строки заголовков при их наличии
Если СтрНайти(СтрокаДанных, "DATE") = 0 И Не ПустаяСтрока(СтрокаДанных) Тогда
МассивЭлементов = СтрРазделить(СтрокаДанных, ",");
Если МассивЭлементов.Количество() >= 2 Тогда
СтрокаДаты = СокрЛП(МассивЭлементов[0]);
СтрокаКурса = СтрЗаменить(СокрЛП(МассивЭлементов[1]), ".", ",");
// Преобразуем строку даты формата DD MMM YYYY в тип Дата
ТекущаяДатаКурса = Дата(СтрокаДаты);
ТекущийКурс = Число(СтрокаКурса);
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаКурса;
МенеджерЗаписи.Валюта = СсылкаНаВалюту;
МенеджерЗаписи.Курс = ТекущийКурс;
МенеджерЗаписи.Кратность = 1;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЕсли;
СтрокаДанных = Чтение.ПрочитатьСтроку();
КонецЦикла;
При интеграции курсов Банка Англии важно учитывать специфику британского финансового рынка:
КурсыВалют при запросе котировки на нерабочий день автоматически вернет значение последнего предшествующего рабочего дня, когда курс был зафиксирован.Для полной автоматизации процесса созданный алгоритм выгрузки помещается в процедуру общего модуля и подключается к объекту РегламентныеЗадания. Запуск задания целесообразно настраивать на вечернее время рабочих дней (после 17:00 по лондонскому времени), когда официальные курсы за текущий торговый день уже окончательно сформированы и опубликованы регулятором.