Как программно получить актуальные курсы валют Сбербанка в 1С?

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

Для многих компаний, осуществляющих валютные операции, недостаточно просто получать официальные курсы Центрального Банка. Зачастую требуется знать реальные курсы продажи и покупки валюты в конкретном коммерческом банке, в данном случае — в Сбербанке. Разберем подробно, как автоматизировать этот процесс, используя механизмы платформы 1С и публичные API банковских сервисов.

Выясняем источник данных: работа с инструментами разработчика

Прежде чем приступать к написанию кода в 1С, нам необходимо выяснить, откуда именно сайт Сбербанка получает информацию. Как справедливо замечено в обсуждении, наиболее эффективный способ — это имитация запросов, которые делает встроенный валютный калькулятор на официальном сайте. Проанализируем ситуацию с помощью инструментов отладки.

Откроем страницу с курсами валют в браузере (например, Google Chrome) и нажмем клавишу F12 или выберем пункт «Просмотреть код». Перейдем на вкладку Network (Сеть). Теперь обновим страницу или изменим параметры в калькуляторе валют на сайте. Мы увидим список запросов. Нас интересуют те, что обращаются к эндпоинтам типа /proxy/services/rates/public/v2/actual или аналогичным. Именно здесь кроется ключ к получению структурированных данных в формате JSON.

Если штатных средств браузера недостаточно, можно воспользоваться специализированным инструментом Fiddler. Он позволяет более детально перехватывать HTTP-трафик и анализировать структуру заголовков и тела запроса, что крайне полезно при отладке сложных взаимодействий.

Разбор параметров запроса: почему возвращаются «другие цифры»

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

  1. rateType (Тип курса): Сбербанк использует разные котировки для разных операций. Например, ERNP — это курсы для физических лиц в отделениях, а ERNP_ONLINE — более выгодные курсы для операций в приложении. Если ваша задача — автоматизировать учет по операциям в «Сбербанк Онлайн», используйте именно онлайн-тип.
  2. regionId (Код региона): Курсы валют в Москве (код 77) могут отличаться от курсов во Владивостоке или Новосибирске. Если не указать этот параметр, сервер может вернуть данные по умолчанию или ошибку. Выясним код нужного региона заранее, проанализировав запрос на сайте при выборе города.
  3. _number_amount (Размер лота): Как отмечено в обсуждении, Сбербанк практикует «пакетные» котировки. При обмене крупных сумм курс становится выгоднее. Если этот параметр не заполнен, API вернет стандартный розничный курс для минимальных сумм.
  4. date (Дата): Параметр даты позволяет получить архивные данные. Важно помнить, что формат даты должен строго соответствовать ожиданиям API (обычно это YYYY-MM-DD).

Техническая реализация в 1С: пишем код для получения данных

Теперь, когда мы понимаем структуру запроса, реализуем механизм получения данных в 1С. Для этого будем использовать объекты HTTPСоединение и HTTPЗапрос. Посмотрим на пример кода, который выполняет запрос к API:


Функция ПолучитьАктуальныйКурсСбера() Экспорт
    
    // Определяем сервер и параметры
    Сервер = "www.sberbank.ru";
    // Используем актуальный путь API v2
    Ресурс = "/proxy/services/rates/public/v2/actual?rateType=ERNP_ONLINE®ionId=77¤cyCode=840";
    
    // Настраиваем защищенное соединение (TLS)
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Защита);
    
    // Формируем запрос
    Запрос = Новый HTTPЗапрос(Ресурс);
    
    // Обязательно добавляем заголовки, чтобы избежать блокировок
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36");
    Запрос.Заголовки.Вставить("Accept", "application/json");
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            Возврат Ответ.ПолучитьТелоКакСтроку();
        Иначе
            ЗаписьЖурналаРегистрации("КурсыВалют", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка запроса: " + Ответ.КодСостояния);
            Возврат Неопределено;
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("КурсыВалют", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка связи: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Важные нюансы: заголовки и защита от роботов

Проанализируем ситуацию с блокировками. Современные банковские сервисы активно защищаются от скрейпинга (автоматического сбора данных). Если мы выполним запрос с пустым заголовком User-Agent, сервер 1С может быть заблокирован. Поэтому мы всегда подставляем строку, имитирующую работу реального браузера.

Также полезно указывать заголовок Referer, содержащий адрес главной страницы банка. Это создает видимость того, что запрос пришел от пользователя, просматривающего сайт, а не от автоматизированного скрипта. Не забываем про Accept-Language со значением ru-RU, так как это может влиять на точность интерпретации полей ответа.

Обработка результата: парсинг JSON и работа с датами

Сбербанк возвращает данные в формате JSON, что значительно упрощает нашу работу в среде 1С версии 8.3. Нам не нужно парсить сложные XML-структуры или, тем более, HTML-код. Разберем по шагам, как преобразовать строку ответа в объект 1С:


ТекстОтвета = ПолучитьАктуальныйКурсСбера();
Если ТекстОтвета <> Неопределено Тогда
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТекстОтвета);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
    
    // В структуре Данные теперь находятся курсы
    // Обычно это массив или дерево соответствий, где ключ - код валюты
    // Пример получения курса продажи для USD
    Если Данные.Свойство("840") Тогда
        КурсПокупки = Данные["840"].buy;
        КурсПродажи = Данные["840"].sell;
        // Время начала действия курса часто передается как Timestamp
        ВремяАктуальности = Данные["840"].activeFrom; 
    КонецЕсли;
КонецЕсли;

Обратите внимание на поле activeFrom. Сбербанк может менять курсы несколько раз в день в зависимости от волатильности на бирже. Это время обычно передается в миллисекундах (Unix Timestamp). В 1С для преобразования такого значения в обычную дату нужно использовать формулу: Дата(1970, 1, 1, 0, 0, 0) + (ЗначениеTimestamp / 1000) + СмещениеЧасовогоПояса.

Альтернативные методы: СберБизнес API

Если ваша задача требует стопроцентной стабильности и юридической чистоты данных, стоит рассмотреть использование SberБизнес API. В отличие от публичного API сайта, который может изменить структуру в любой момент без предупреждения, официальное API для бизнеса работает на основе регламентированных контрактов. Это платный сервис, требующий авторизации через сертификаты или протокол OAuth 2.0, но он гарантирует точность данных и поддержку со стороны банка.

Подводя итог, можно сказать, что получение курсов Сбербанка в 1С — задача вполне решаемая. Главное — правильно определить целевой эндпоинт, имитировать поведение браузера и учитывать региональную специфику котировок. Используя приведенные примеры кода и методику анализа через инструменты разработчика, вы сможете построить надежную систему мониторинга валютных курсов в вашей конфигурации.

← На главную