Автоматическое обновление курса валют в 1С-Битрикс

В файл php_interface/init.php добавить функцию:

<?php

// ...

function GetRateFromCBR($CURRENCY)
{
    global $DB;
    global $APPLICATION;

    CModule::IncludeModule('currency');

    if (!CCurrency::GetByID($CURRENCY))
        return false;

    $DATE_RATE = date("d.m.Y");
    $QUERY_STR = "date_req=" .
        $DB->FormatDate(
            $DATE_RATE,
            CLang::GetDateFormat('SHORT'),
            "D.M.Y"
        );

    $strQueryText = QueryGetData(
        'www.cbr.ru',
        80,
        '/scripts/XML_daily.asp',
        $QUERY_STR,
        $errno,
        $errstr
    );

    $charset = 'windows-1251';

    if (preg_match("/<"."\?XML[^>]{1,}encoding=[\"']([^>\"']{1,})[\"'][^>]{0,}\?".">/i", $strQueryText, $matches)) {
        $charset = Trim($matches[1]);
    }

    $strQueryText = preg_replace(
        "/<!DOCTYPE[^>]{1,}>/",
        "",
        $strQueryText
    );

    $strQueryText = preg_replace(
        "/<"."\?XML[^>]{1,}\?".">/",
        "",
        $strQueryText
    );

    $strQueryText = $APPLICATION->ConvertCharset($strQueryText, $charset, SITE_CHARSET);

    require_once($_SERVER["DOCUMENT_ROOT"] . '/bitrix/modules/main/classes/general/xml.php');

    $objXML = new CDataXML();
    $res = $objXML->LoadString($strQueryText);

    if($res !== false)
        $arData = $objXML->GetArray();
    else
        $arData = false;

    $NEW_RATE=Array();

    if (is_array($arData) && count($arData["ValCurs"]["#"]["Valute"])>0) {
        for ($j1 = 0; $j1<count($arData["ValCurs"]["#"]["Valute"]); $j1++) {
            if ($arData["ValCurs"]["#"]["Valute"][$j1]["#"]["CharCode"][0]["#"]==$CURRENCY) {
                $NEW_RATE['CURRENCY'] = $CURRENCY;
                $NEW_RATE['RATE_CNT'] = IntVal($arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Nominal"][0]["#"]);
                $NEW_RATE['RATE'] = DoubleVal(
                    str_replace(
                        ",",
                        ".",
                        $arData["ValCurs"]["#"]["Valute"][$j1]["#"]["Value"][0]["#"]
                    )
                );

                $NEW_RATE['DATE_RATE'] = $DATE_RATE;

                break;
            }
        }
    }

    if ((isset($NEW_RATE['RATE'])) && (isset($NEW_RATE['RATE_CNT']))) {
        CModule::IncludeModule('currency');

        $arFilter = array(
            'CURRENCY' => $NEW_RATE['CURRENCY'],
            'DATE_RATE' => $NEW_RATE['DATE_RATE']
        );

        $by = 'date';
        $order = 'desc';

        $db_rate = CCurrencyRates::GetList($by, $order, $arFilter);

        if (!$ar_rate = $db_rate->Fetch())
            CCurrencyRates::Add($NEW_RATE);
    }

    return 'GetRateFromCBR("' . $CURRENCY . '");';
}

Зайти в админке в агенты: https://site.com/bitrix/admin/agent_list.php?lang=ru

Нажать «Добавить агента»

Заполнить поля на подобии и сохранить: