Как настроить автоматическую загрузку курсов валют Банка Англии в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При ведении учета по зарубежным компаниям, филиалам или при совершении международных сделок часто возникает необходимость отражать курсы валют (например, евро и долларов США) относительно фунтов стерлингов по официальным котировкам Банка Англии (Bank of England). Пересчет через кросс-курсы Центрального банка РФ для таких задач категорически не подходит, так как из-за разницы во времени фиксации и методиках расчета результаты неизбежно разойдутся с данными британских регуляторов и аудиторов.

Разберем по шагам, откуда и каким образом можно автоматически получать официальные курсы валют Банка Англии в базу 1С, как организовать программный разбор котировок и какие нюансы британского финансового календаря следует учитывать.

Официальный источник данных и коды серий котировок

Банк Англии предоставляет доступ к своей статистической базе котировок (Interactive Statistical Database, IADB). Через данный сервис можно скачивать актуальные данные напрямую по протоколу HTTP/HTTPS в структурированных форматах, минуя парсинг визуальных веб-страниц.

Проанализируем структуру котировок. Чтобы запрашивать конкретные валютные пары, используются уникальные идентификаторы серий (Series Codes):

  1. USD к GBP: серия XUDLUSS (Spot exchange rate, US$ into Sterling).
  2. EUR к GBP: серия XUDLERS (Spot exchange rate, Euro into Sterling).

Сервер базы данных Банка Англии позволяет формировать прямой GET-запрос с указанием начальной и конечной даты выборки, кодов серий и формата отдачи (CSV или XML). Формат CSV предпочтителен для интеграции, так как его чтение и разбор в платформе 1С выполняются быстрее и проще всего.

Реализация загрузки курсов через HTTP-соединение в 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 и запись в регистр сведений

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


Чтение = Новый ЧтениеТекста;
Чтение.УстановитьСтроку(ТелоОтвета);

СтрокаДанных = Чтение.ПрочитатьСтроку();
Пока СтрокаДанных <> Неопределено Доделай
    // Пропускаем строки заголовков при их наличии
    Если СтрНайти(СтрокаДанных, "DATE") = 0 И Не ПустаяСтрока(СтрокаДанных) Тогда
        МассивЭлементов = СтрРазделить(СтрокаДанных, ",");
        Если МассивЭлементов.Количество() >= 2 Тогда
            СтрокаДаты = СокрЛП(МассивЭлементов[0]);
            СтрокаКурса = СтрЗаменить(СокрЛП(МассивЭлементов[1]), ".", ",");
            
            // Преобразуем строку даты формата DD MMM YYYY в тип Дата
            ТекущаяДатаКурса = Дата(СтрокаДаты); 
            ТекущийКурс = Число(СтрокаКурса);
            
            МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Период = ТекущаяДатаКурса;
            МенеджерЗаписи.Валюта = СсылкаНаВалюту;
            МенеджерЗаписи.Курс = ТекущийКурс;
            МенеджерЗаписи.Кратность = 1;
            МенеджерЗаписи.Записать(Истина);
        КонецЕсли;
    КонецЕсли;
    СтрокаДанных = Чтение.ПрочитатьСтроку();
КонецЦикла;

Особенности котировок и обработка выходных дней

При интеграции курсов Банка Англии важно учитывать специфику британского финансового рынка:

  1. Прямая котировка Банка Англии: банк котирует валюты как «количество иностранной валюты за 1 британский фунт» (GBP/USD, GBP/EUR). Если вашей базовой валютой учета является фунт стерлингов, эти данные вносятся без пересчета. Если базовой валютой выступает USD или EUR, потребуется использовать механизмы кратности или производить обратный пересчет (1 / курс).
  2. Британские банковские каникулы (Bank Holidays): Банк Англии не устанавливает и не публикует курсы по субботам, воскресеньям и официальным праздничным дням Великобритании (Страстная пятница, Пасхальный понедельник, весенние и летние банковские выходные).
  3. Получение курса на нерабочую дату в 1С: дублировать записи на выходные дни вручную не требуется. Штатный механизм среза последних в регистре сведений КурсыВалют при запросе котировки на нерабочий день автоматически вернет значение последнего предшествующего рабочего дня, когда курс был зафиксирован.

Для полной автоматизации процесса созданный алгоритм выгрузки помещается в процедуру общего модуля и подключается к объекту РегламентныеЗадания. Запуск задания целесообразно настраивать на вечернее время рабочих дней (после 17:00 по лондонскому времени), когда официальные курсы за текущий торговый день уже окончательно сформированы и опубликованы регулятором.

← На главную