Автоматизация загрузки курсов валют — стандартная задача для систем на базе 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-документа). Основная страница является лишь «оболочкой», а фактическая таблица с цифрами подгружается по другому адресу. Чтобы получить данные парсингом, нам необходимо обращаться не к основной странице, а напрямую к источнику фрейма.
Проанализируем структуру страницы. Если открыть инструменты разработчика в браузере, можно найти реальный адрес, по которому отдается таблица. Обычно это скрипт или отдельный HTML-модуль, например, содержащий в пути kursnaListaModul.html. Обратившись к нему, мы получим чистую таблицу с тегами <td>, которую легко разобрать.
Для обработки полученного текста в 1С рекомендуется использовать Объектную Модель Документа (DOM). Это позволит не искать вхождения строк вручную, а обращаться к узлам таблицы программно. Рассмотрим алгоритм:
ЧтениеHTML и загружаем в него полученную строку.ПостроительDOM для формирования дерева документа.ПолучитьЭлементыПоИмени() находим все строки таблицы (теги tr).Важный нюанс: Сервер NBS может блокировать запросы без заголовка User-Agent. Обязательно добавьте его в HTTPЗапрос, имитируя работу браузера, иначе вы рискуете получить ошибку 403.
Это наиболее надежный и «правильный» метод с точки зрения архитектуры, но он требует административной подготовки. У Национального банка Сербии есть специализированный SOAP-сервис. Однако доступ к нему не является публичным по умолчанию.
Проанализируем этапы получения доступа к API (согласно регламенту NBS):
После получения Корисничко име (имя пользователя) и Лозинка (пароль), вы сможете подключиться к веб-сервису через объект WSОпределения в 1С. Это позволит получать данные в строго структурированном виде без риска поломки парсера при изменении дизайна сайта.
Если бумажная волокита с регистрацией API вам не подходит, существует «золотая середина». На сайте банка есть функционал генерации отчетов за период. Мы можем сформировать прямую ссылку на скачивание файла в формате XML или CSV. Рассмотрим, как программно обработать такой файл:
// Пример логики загрузки XML
ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");
Ответ.ПолучитьТелоКакФайл(ПутьКФайлу);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Currency" Тогда
// Логика извлечения курса
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Преимущество этого метода в том, что формат XML стабилен, а 1С имеет встроенные высокопроизводительные инструменты для его чтения (ЧтениеXML, ФабрикаXDTO).
При работе с сербскими ресурсами важно учитывать несколько критических моментов:
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-файлов или использование внешних агрегаторов данных.