Как и откуда загрузить прямые курсы валют (USD/CNY, EUR/USD, EUR/CNY) в 1С?

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

При работе с иностранными валютами в 1С часто возникает потребность в получении актуальных курсов обмена. Однако стандартные механизмы загрузки курсов, как правило, ориентированы на данные Центрального банка РФ, которые предоставляют курсы валют по отношению к рублю. Это не всегда удобно, особенно когда требуются прямые кросс-курсы, такие как USD/CNY, EUR/USD или EUR/CNY, без промежуточного пересчета через российскую валюту. Пересчет через рубль может приводить к завышению или искажению курсов, что недопустимо для точного управленческого или оперативного учета. В этой статье мы подробно рассмотрим, как можно организовать загрузку таких прямых курсов валют в вашу конфигурацию 1С, используя внешние API и средства платформы.

Поиск источников прямых курсов валют

Первый шаг в решении задачи — это определение надежного источника данных. Нам нужны сервисы, которые предоставляют прямые котировки для интересующих нас валютных пар. Такие данные обычно доступны через API (Application Programming Interface), который позволяет программно запрашивать информацию и получать ее в структурированном виде, например, в формате JSON или XML.

В ходе обсуждения на форуме был предложен один из таких сервисов – TwelveData.com. Рассмотрим этот вариант подробнее, поскольку он уже имеет готовый пример кода для 1С.

Решение 1: Загрузка курсов валют через API TwelveData.com

TwelveData.com – это один из сервисов, предоставляющих финансовые данные, включая курсы валют, через свой API. Для работы с ним обычно требуется регистрация и получение API-ключа (токена). Многие такие сервисы предлагают бесплатные тарифные планы с ограниченным количеством запросов, чего может быть достаточно для ежедневного обновления курсов.

Разберем по шагам, как можно реализовать загрузку данных из TwelveData.com в 1С:

  1. Получение API-ключа (токена): Для начала работы вам потребуется зарегистрироваться на сайте twelvedata.com и получить свой API-ключ. Этот ключ будет использоваться для авторизации ваших запросов к сервису (сложные механизмы авторизации здесь обычно не требуются).
  2. Формирование HTTP-запроса в 1С: Для взаимодействия с внешними веб-сервисами в 1С используются объекты HTTPСоединение и HTTPЗапрос. Мы формируем запрос, указывая адрес сервера, метод, параметры (валютная пара, дата, API-ключ) и заголовки (для отладки таких запросов удобно использовать Post1С — аналог Postman).
  3. Отправка запроса и получение ответа: После формирования запроса мы отправляем его и получаем ответ от сервера. Ответ, как правило, содержит запрошенные данные в формате JSON.
  4. Парсинг JSON-ответа: Полученный JSON-ответ необходимо разобрать (спарсить) средствами 1С, чтобы извлечь нужную информацию – сам курс валюты.
  5. Запись данных в регистр сведений: Извлеченный курс записывается в специально созданный регистр сведений в 1С, привязываясь к дате.

Посмотрим на пример кода, предложенного на форуме, который демонстрирует этот процесс:


// Конечные точки API имеют префикс
АдресСервера = "api.twelvedata.com";
ИмяМетода = "/exchange_rate";
ВалютнаяПара = "USD/CNY"; // Или EUR/USD, EUR/CNY
Дата = Формат(ТекущаяДата, "ДФ=yyyy-MM-dd");

// Ваш токен, полученный при регистрации на TwelveData.com
// В целях безопасности рекомендуется хранить токен не в коде, а, например, в константе или параметре
Токен = "ВАШ_API_КЛЮЧ"; 

ЗаголовокHTTP = Новый Соответствие;
// В заголовке, как Authorization="apikey your_api_key"
ЗаголовокHTTP.Вставить("Authorization", "apikey " + Токен);

// Формируем полный URL для запроса
// Обратите внимание, что API-ключ может передаваться как в заголовке, так и в параметрах URL. 
// В данном примере он продублирован, что не всегда обязательно, но работает.
Запрос = Новый HTTPЗапрос(ИмяМетода + "?symbol=" + ВалютнаяПара + "&date=" + Дата + "&apikey=" + Токен, ЗаголовокHTTP);

// Устанавливаем соединение с сервером
// Используем защищенное соединение OpenSSL для HTTPS
Соединение = Новый HTTPСоединение(АдресСервера, , , , , , Новый ЗащищенноеСоединениеOpenSSL(), Ложь);

// Отправляем запрос и получаем ответ
Ответ = Соединение.Получить(Запрос);

Таблица = Новый ТаблицаЗначений; // Переменная для демонстрации, куда могли бы быть помещены данные

Если Ответ.КодСостояния = 200 Тогда // Если запрос успешно выполнен (код 200 OK)
    Результат = Ответ.ПолучитьТелоКакСтроку(); // Получаем тело ответа в виде строки
    ЧтениеJSON = Новый ЧтениеJSON; // Создаем объект для чтения JSON
    ЧтениеJSON.УстановитьСтроку(Результат); // Устанавливаем строку JSON для чтения
    СтруктураJSON = ПрочитатьJSON(ЧтениеJSON); // Парсим JSON в структуру 1С
    // Далее вы можете работать со СтруктураJSON, например:
    // Если СтруктураJSON.Свойство("rate") Тогда
    //     Курс = СтруктураJSON.rate;
    //     Сообщить("Курс " + ВалютнаяПара + " на " + Дата + ": " + Курс);
    //     // Здесь следует записать Курс в РегистрСведений
    // КонецЕсли;
Иначе
    Сообщить("Ошибка при получении курсов. Код ответа: " + Ответ.КодСостояния + ". Текст ответа: " + Ответ.ПолучитьТелоКакСтроку());
    // Анализируем код состояния и делаем выводы
КонецЕсли;

Важные моменты при использовании этого кода:

  1. Токен API: Токен (Токен) – это ваш уникальный ключ. Его не рекомендуется хранить непосредственно в коде. Лучше создать для него константу или параметр в 1С и брать значение оттуда.
  2. Валютная пара: Переменная ВалютнаяПара позволяет динамически задавать, какой курс вы хотите получить (например, "USD/CNY", "EUR/USD", "EUR/CNY").
  3. Обработка JSON: После получения СтруктураJSON необходимо изучить структуру ответа от TwelveData (или другого сервиса) и корректно извлечь значение курса. Обычно это делается обращением к свойствам структуры, например, СтруктураJSON.rate или СтруктураJSON.data.rate.
  4. Запись в регистр сведений: Финальный этап – запись полученного курса в ваш отдельный регистр сведений. Вам потребуется определить структуру этого регистра (например, измерения: Валюта1, Валюта2, Дата; ресурсы: Курс).

Решение 2: Альтернативные сторонние API для получения курсов валют

Помимо TwelveData.com, существует множество других сервисов, предоставляющих аналогичные API для получения курсов валют. Многие из них имеют бесплатные тарифные планы с достаточными ограничениями для большинства задач. Рассмотрим несколько популярных вариантов, которые могут стать хорошей альтернативой:

  1. ExchangeRate-API (exchangerate-api.com):

    Этот сервис предоставляет курсы для более чем 160 валют. Он известен своей простотой и бесплатным планом, который обычно не требует привязки банковской карты. Данные предоставляются в формате JSON, что упрощает их обработку в 1С. Запросы к API выглядят примерно так: https://v6.exchangerate-api.com/v6/YOUR_API_KEY/pair/USD/CNY.

  2. Currencylayer (currencylayer.com):

    Является одним из широко используемых решений, предлагающим курсы для 168 мировых валют и драгоценных металлов. Данные поставляются также в формате JSON. Бесплатный план включает до 1000 запросов в месяц, что часто достаточно для ежедневного обновления курсов. Запросы могут быть вида: http://api.currencylayer.com/live?access_key=YOUR_API_KEY¤cies=CNY,USD&source=EUR.

  3. Open Exchange Rates (openexchangerates.org):

    Этот сервис также предоставляет доступ к курсам валют через API и имеет бесплатный тарифный план. Он позволяет получать курсы по отношению к доллару США, что очень удобно для последующих пересчетов (например, если вам нужен EUR/CNY, вы можете получить EUR/USD и USD/CNY, а затем перемножить). Запросы выглядят примерно так: https://openexchangerates.org/api/latest.json?app_id=YOUR_APP_ID.

Принцип работы с этими API в 1С будет аналогичен примеру с TwelveData.com: формирование HTTPЗапроса, отправка, получение JSON-ответа, парсинг с помощью ЧтениеJSON и ПрочитатьJSON, а затем запись в РегистрСведений.

Решение 3: Прямая интеграция с центральными банками

Для получения наиболее официальных и авторитетных котировок, особенно если речь идет о европейских валютах или юане, можно рассмотреть возможность прямой интеграции с центральными банками.

  1. Европейский центральный банк (ЕЦБ):

    ЕЦБ (ecb.europa.eu) предоставляет официальные курсы обмена евро к основным мировым валютам. Информация доступна как через их веб-сайт, так и через API, который можно использовать для получения прямых котировок для пары EUR/USD и других валют по отношению к евро. На основе этих данных можно рассчитать и другие кросс-курсы, например, EUR/CNY, если доступны курсы EUR/USD и USD/CNY. Существуют даже готовые обработки для 1С, которые позволяют загружать курсы с сайта ЕЦБ, хотя, возможно, их придется адаптировать под ваши конкретные нужды.

  2. Народный банк Китая и Bank of China (Hong Kong):

    Получение данных напрямую от Народного банка Китая может быть более сложной задачей из-за языкового барьера и специфики их IT-инфраструктуры, которая может быть менее открыта для внешних запросов. Однако, Bank of China (Hong Kong) Limited (bankofchina.com/hk/en/) часто предоставляет API, через который можно получать курсы обмена по отношению к доллару США и гонконгскому доллару. Это может служить надежным источником для котировок, включающих китайский юань (CNY), особенно если ваши операции связаны с Гонконгом. Придется изучить их документацию по API для корректной интеграции.

Техническая реализация в 1С: Общий алгоритм

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

  1. Подготовка рабочего места и объектов 1С:

    • В вашей конфигурации 1С создайте отдельный регистр сведений. Этот регистр будет хранить прямые курсы валют. Определите его структуру:
      • Измерения: Валюта1 (ссылка на справочник Валюты), Валюта2 (ссылка на справочник Валюты), ДатаКурса (тип Дата).
      • Ресурсы: Курс (тип Число), Кратность (тип Число).
    • Создайте справочник Валюты, если его нет, и заполните его необходимыми валютами (USD, EUR, CNY).
    • Разработайте внешнюю обработку или добавьте функциональность в существующий модуль для выполнения запросов к API.
  2. Формирование HTTP-запроса:

    Используйте объекты HTTPСоединение и HTTPЗапрос для связи с внешним сервисом. Вам потребуется:

    • Новый HTTPСоединение(АдресСервера, [Порт], [Пользователь], [Пароль], [Прокси], [ПортПрокси], [ПользовательПрокси], [ПарольПрокси], [ЗащищенноеСоединение], [Таймаут]): Создает соединение. Для HTTPS используйте Новый ЗащищенноеСоединениеOpenSSL() в параметре ЗащищенноеСоединение.
    • Новый HTTPЗапрос(АдресРесурса, [Заголовки]): Формирует запрос к конкретному ресурсу на сервере. В АдресРесурса укажите путь и параметры API (например, "/exchange_rate?symbol=USD/CNY&date=2023-01-01&apikey=..."). В Заголовки передайте соответствие с дополнительными HTTP-заголовками, такими как Authorization для API-ключа.
  3. Отправка запроса и получение ответа:

    После создания запроса используйте метод Получить() или Отправить() объекта HTTPСоединение для взаимодействия с сервером. В ответ вы получите объект HTTPОтвет.

    
    // Пример получения ответа
    Ответ = Соединение.Получить(Запрос);
    

    Анализ кода состояния: Всегда проверяйте Ответ.КодСостояния. Код 200 означает успешное выполнение. Другие коды (например, 400, 401, 403, 404, 500) указывают на различные ошибки, которые следует обрабатывать. Используйте Ответ.ПолучитьТелоКакСтроку() для получения текстового описания ошибки, если оно есть.

  4. Парсинг (разбор) ответа:

    Полученный ответ от API обычно представляет собой строку в формате JSON. Для работы с JSON в 1С используйте:

    • Новый ЧтениеJSON(): Создает объект для чтения JSON.
    • ЧтениеJSON.УстановитьСтроку(СтрокаJSON): Устанавливает строку, которую нужно разобрать.
    • ПрочитатьJSON(ЧтениеJSON): Парсит строку JSON и возвращает структуру, массив или другое значение 1С, соответствующее корневому элементу JSON.

    После получения структуры (например, СтруктураJSON), вы можете обращаться к ее свойствам по именам, чтобы извлечь нужные данные, например, СтруктураJSON.rate или СтруктураJSON["data"]["value"], в зависимости от формата ответа API.

    
    Если Ответ.КодСостояния = 200 Тогда
        Результат = Ответ.ПолучитьТелоКакСтроку();
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Результат);
        СтруктураJSON = ПрочитатьJSON(ЧтениеJSON);
        
        // Пример извлечения курса (структура ответа может отличаться)
        Если СтруктураJSON.Свойство("data") И СтруктураJSON.data.Свойство("rate") Тогда
            Курс = СтруктураJSON.data.rate;
            // ... дальнейшая обработка и запись
        ИначеЕсли СтруктураJSON.Свойство("conversion_rate") Тогда
            Курс = СтруктураJSON.conversion_rate;
            // ... дальнейшая обработка и запись
        КонецЕсли;
    КонецЕсли;
    
  5. Запись в регистр сведений:

    После того как вы извлекли значение курса, его необходимо записать в ваш регистр сведений. Это делается с использованием менеджера записи регистра:

    
    // Предположим, у нас есть значения:
    // Валюта1_Объект - ссылка на справочник Валюты для первой валюты
    // Валюта2_Объект - ссылка на справочник Валюты для второй валюты
    // ДатаКурса - Дата
    // Курс - Число
    // Кратность - Число (обычно 1, если курс за 1 единицу Валюты2)
    
    МенеджерЗаписи = РегистрыСведений.МоиПрямыеКурсыВалют.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Валюта1 = Валюта1_Объект;
    МенеджерЗаписи.Валюта2 = Валюта2_Объект;
    МенеджерЗаписи.ДатаКурса = ДатаКурса;
    МенеджерЗаписи.Курс = Курс;
    МенеджерЗаписи.Кратность = Кратность; // Важно учесть кратность курса
    МенеджерЗаписи.Записать();
    

    Не забудьте учесть кратность курса. Некоторые сервисы могут предоставлять курс, например, за 100 единиц валюты, а не за 1. Это нужно отразить в поле Кратность вашего регистра сведений.

  6. Автоматизация загрузки:

    Для регулярного обновления курсов вы можете настроить регламентное задание в 1С. Это позволит автоматически запускать вашу обработку по расписанию (например, раз в день или несколько раз в день) и обновлять данные в регистре сведений без участия пользователя. В таком случае, всю логику загрузки курсов необходимо будет вынести в общий модуль, доступный для регламентных заданий.

Важное примечание: Типовые конфигурации 1С уже имеют встроенные механизмы для загрузки курсов валют, но они, как правило, ориентированы на данные Центрального банка РФ. Фирма "1С" также рекомендует использовать собственный сервис для загрузки курсов валют и классификатора банков. Однако, для нестандартных прямых кросс-курсов, не предоставляемых ЦБ РФ, создание собственных обработок или доработка существующих является наиболее гибким и эффективным решением.

Таким образом, для успешной реализации вам потребуется навык работы с HTTP-запросами, понимание структуры JSON, а также знание основ программирования в 1С для парсинга данных и записи их в информационные регистры. В итоге вы получите надежный механизм для загрузки прямых курсов валют, который позволит вам вести более точный и гибкий учет.

← На главную