Как настроить автоматическую загрузку курсов валют Сербии с сайта Национального банка (NBS) в 1С

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

Автоматизация загрузки курсов валют — стандартная задача для систем на базе 1С, однако работа с иностранными регуляторами часто преподносит сюрпризы. В случае с Национальным банком Сербии (NBS) программисты сталкиваются с тем, что обычное получение текста страницы не возвращает нужных данных. Разберем подробно, почему так происходит, и какие существуют способы решения этой задачи: от простого парсинга до официального взаимодействия через API.

Проблема «пустого» ответа при парсинге сайта

При попытке получить данные напрямую с официального сайта NBS через объект HTTPСоединение, многие разработчики сталкиваются с тем, что в полученной строке ответа есть разметка, заголовки, футер, но отсутствует сама таблица с курсами. Рассмотрим типичный код, который на первый взгляд кажется верным:


Сервер = "nbs.rs";
Ури = "/sr_RS/finansijsko_trziste/medjubankarsko-devizno-trziste/kursna-lista/zvanicni-srednji-kurs-dinara/index.html";
Соединение = Новый HTTPСоединение(Сервер, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос(Ури);
Ответ = Соединение.Получить(Запрос);
Результат = Ответ.ПолучитьТелоКакСтроку();

Причина неудачи: Данные на сайте NBS загружаются внутри iframe (вложенного HTML-документа). Основная страница является лишь «оболочкой», а фактическая таблица с цифрами подгружается по другому адресу. Чтобы получить данные парсингом, нам необходимо обращаться не к основной странице, а напрямую к источнику фрейма.

Решение №1: Прямой доступ к содержимому фрейма и парсинг DOM

Проанализируем структуру страницы. Если открыть инструменты разработчика в браузере, можно найти реальный адрес, по которому отдается таблица. Обычно это скрипт или отдельный HTML-модуль, например, содержащий в пути kursnaListaModul.html. Обратившись к нему, мы получим чистую таблицу с тегами <td>, которую легко разобрать.

Для обработки полученного текста в 1С рекомендуется использовать Объектную Модель Документа (DOM). Это позволит не искать вхождения строк вручную, а обращаться к узлам таблицы программно. Рассмотрим алгоритм:

  1. Создаем объект ЧтениеHTML и загружаем в него полученную строку.
  2. Используем ПостроительDOM для формирования дерева документа.
  3. Через метод ПолучитьЭлементыПоИмени() находим все строки таблицы (теги tr).
  4. Обходим строки в цикле и извлекаем значения ячеек (код валюты, номинал, курс).

Важный нюанс: Сервер NBS может блокировать запросы без заголовка User-Agent. Обязательно добавьте его в HTTPЗапрос, имитируя работу браузера, иначе вы рискуете получить ошибку 403.

Решение №2: Использование официального API (Web-service)

Это наиболее надежный и «правильный» метод с точки зрения архитектуры, но он требует административной подготовки. У Национального банка Сербии есть специализированный SOAP-сервис. Однако доступ к нему не является публичным по умолчанию.

Проанализируем этапы получения доступа к API (согласно регламенту NBS):

  1. Заполнение официальной заявки на участие в системе обмена данными на сайте банка.
  2. Подтверждение электронной почты через переход по ссылке в письме.
  3. Распечатка и подписание бумажного запроса на участие.
  4. Отправка подписанного документа физической почтой на контактный адрес Банка в Белграде.
  5. Ожидание создания учетной записи сотрудниками NBS.
  6. Получение лицензионного кода (API-key) на электронную почту.

После получения Корисничко име (имя пользователя) и Лозинка (пароль), вы сможете подключиться к веб-сервису через объект WSОпределения в 1С. Это позволит получать данные в строго структурированном виде без риска поломки парсера при изменении дизайна сайта.

Решение №3: Загрузка через общедоступные файлы экспорта (XML/CSV)

Если бумажная волокита с регистрацией API вам не подходит, существует «золотая середина». На сайте банка есть функционал генерации отчетов за период. Мы можем сформировать прямую ссылку на скачивание файла в формате XML или CSV. Рассмотрим, как программно обработать такой файл:


// Пример логики загрузки XML
ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");
Ответ.ПолучитьТелоКакФайл(ПутьКФайлу);

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Currency" Тогда
        // Логика извлечения курса
    КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();

Преимущество этого метода в том, что формат XML стабилен, а 1С имеет встроенные высокопроизводительные инструменты для его чтения (ЧтениеXML, ФабрикаXDTO).

Технические тонкости реализации в 1С

При работе с сербскими ресурсами важно учитывать несколько критических моментов:

1. Кодировка текста. Сайт может использовать специфические кодировки для кириллических и латинских символов (например, UTF-8 с BOM или Windows-1250). При использовании Ответ.ПолучитьТелоКакСтроку() без параметров 1С попытается определить кодировку автоматически, но иногда полезно явно указать КодировкаТекста.UTF8.

2. Протокол TLS/SSL. Поскольку сайт работает по HTTPS, объект ЗащищенноеСоединениеOpenSSL обязателен. В некоторых серверных версиях ОС Windows может потребоваться обновление корневых сертификатов, чтобы 1С доверяла сертификату, выданному сербским удостоверяющим центром. Выясним причину ошибки соединения: если 1С выдает «Ошибка при установке защищенного соединения», попробуйте инициализировать объект без проверки сертификатов (только для отладки!):


// Внимание: Не рекомендуется для продуктовых баз без проверки рисков
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

3. Сторонние агрегаторы. Если официальные методы кажутся слишком сложными, проанализируем возможность использования бесплатных финансовых API (например, FloatRates). Они предоставляют курсы RSD (сербского динара) в формате JSON, который в 1С 8.3.6+ разбирается одной командой:


ДанныеКурсов = ПрочитатьJSON(ЧтениеJSON);

Выбор метода зависит от ваших требований к стабильности. Для разовых задач подойдет парсинг фрейма, для крупных корпоративных систем — официальный SOAP API, а для быстрой разработки — загрузка XML-файлов или использование внешних агрегаторов данных.

← На главную