В Битриксе есть встроенный механизм импорта валют из банка, но это подходит только для пользователей из России, так как идет импорт и банка РФ, и валюты привязаны к рублю.
Для Украины удобно делать импорт из украинского банка, где все валюты привязаны к гривне.
Ну и еще, в стандартной поставке Битрикса для ежедневного импорта валют нужно каждый день заходить и клацать кнопочку. Что не прикольно. Попробуем это исправить.
Делается это очень просто. Как правило, все уважающие себя банки делают ежедневную выгрузку курсов валют в xml-файл. Остается только каждый день читать этот файл, и добавлять записи в "Курсы валют".
У меня сейчас в "Настройки" - "Валюты" - "Курсы валют" занесены три валюты - доллар, евро и рубль.
[spoiler]
Я написал фукнцию импорта, и обернул для удобства её класс. Код можно положить в /bitrix/php_interface/init.php
Осталось настроить, чтобы функция импорта запускалась каждый день. Это проще всего повесить на агент, так как операция чтения с файла банка занимает как правило меньше 0,01 сек.
Тут в этом же классе для удобства я добавил функцию создания агента. Чтобы добавить агент нужно запустить функцию NBUCurrencyLoad::AddBitrixAgent();
Заходим в "Настройки" - "Инструменты" - "Командрая строка PHP" и вписываем туда этот код.
Жмем "Выполнить", и если все прошло удачно - то должна появился надпись "Агент импорта валют добавлен".
Убедиться что агент добавлен, можно на странице "Настройки" - "Инструменты" - "Агенты" (сразу под пунктом с командной строкой PHP).
После этого заходим в "Настройки" - "Валюты" - "Курсы валют", и видим, что для сегодняшнего дня добавились новые курсы валют (если они на этот день еще не были заданы).
Вот, собственно, и все.
Скрипт требует наличия на сервере PHP библиотеки simplexml, как правило она установлена почти на всех хостингах.
В скрипте явно прописаны валюты, для которых делается выгрузка ("USD, "EUR", RUR".
Можно конечно было сразу брать все установленные в системе валюты, и для них обновлять курс, но во первых это дополнительные запросы к базе, а валюты добавляются обычно только один раз. А во вторых в системе могут быть специальные валюты, для которых курс импортировать не нужно, и для которых курс устанавливается вручную.
UPD.
Добавил вилку для проверки насколько изменился курс по отношению к предыдущему, чтобы избежать заведомо неверных курсов.
Для Украины удобно делать импорт из украинского банка, где все валюты привязаны к гривне.
Ну и еще, в стандартной поставке Битрикса для ежедневного импорта валют нужно каждый день заходить и клацать кнопочку. Что не прикольно. Попробуем это исправить.
Делается это очень просто. Как правило, все уважающие себя банки делают ежедневную выгрузку курсов валют в xml-файл. Остается только каждый день читать этот файл, и добавлять записи в "Курсы валют".
У меня сейчас в "Настройки" - "Валюты" - "Курсы валют" занесены три валюты - доллар, евро и рубль.
[spoiler]
Я написал фукнцию импорта, и обернул для удобства её класс. Код можно положить в /bitrix/php_interface/init.php
//========================================// // Импорта курса валют Нацбанка Украины // //========================================// class NBUCurrencyLoad { function DoTheLoad() { // Список валют, для которых будет обновляться курс $curr_list = array( "EUR", "USD", // "RUR" ); $base_currency = "UAH"; // Базовая валюта $percent_koeff = 0.05; // Допустимый дипапзон изменений валюты (5%) // Путь к xml-файлу на сервере банка, в котором хранятся валюты $xml_file_path = "http://pfsoft.com.ua/service/currency/?date=".strftime("%d%m%Y",time()); // Формат даты в xml-файле $xml_date_format = "YYYY-MM-DD"; // Получим список курсов валют в виде массива $curr_result = NBUCurrencyLoad::GetCurrency($curr_list, $xml_file_path); if (!empty($curr_result)) { if (CModule::IncludeModule("currency")) // Проверяем, подключен ли модуль валют { foreach ($curr_result as $code => $arCurrency) { // Если массив с валютой не пустой - то добавим валюту if (!empty($arCurrency)) { // Проверяем насколько изменился курс $rate = CCurrencyRates::GetConvertFactor($code, $base_currency); $rate_loaded = $arCurrency["RATE"] / $arCurrency["QUANTITY"]; // Если изменения попали в вилку, значит можно добавлять валюту if ($rate - $rate * $percent_koeff <= $rate_loaded && $rate_loaded <= $rate + $rate * $percent_koeff ) { $arFields = array( "RATE" => $arCurrency["RATE"], "RATE_CNT" => $arCurrency["QUANTITY"], "CURRENCY" => $code, "DATE_RATE" => $arCurrency["DATE"] ); // Если валюта на этот уже день сущетсвует, она добавлена не будет $rez = CCurrencyRates::Add($arFields); } } } } } return 'NBUCurrencyLoad::DoTheLoad();'; } // Функция получение курса валют Нацбанка function GetCurrency($curr_load=array(), $filepath="") { $curr_result = array(); if (empty($curr_load) || empty($filepath)) return false; // Считываем xml-файл в массив if ($xml = simplexml_load_file($filepath)) { foreach ($xml->Valute as $it) { foreach ($curr_load as $curr_code) { if ($it->CharCode == $curr_code) { $curr_result[$curr_code]["RATE"] = (string)$it->Value; $curr_result[$curr_code]["QUANTITY"] = (string)$it->Nominal; $curr_result[$curr_code]["DATE"] = date("d.m.Y"); } } } return ($curr_result); } else { // Если считать файл не удалось - возвратим false return false; } } // Функция добавления агента function AddBitrixAgent() { $rez = CAgent::AddAgent( "NBUCurrencyLoad::DoTheLoad();", // имя функции "", // идентификатор модуля (без модуля) "Y", // запускать один раз за интервал 86400, // интервал запуска (сутки) "", // когда проверить первый запуск? (сейчас) "Y" // агент активен ); echo ($rez)? "Агент импорта валют добавлен.<br />" : "Ошибка! Агент не добавлен. ".$rez->LAST_ERROR."<br />"; } } |
Осталось настроить, чтобы функция импорта запускалась каждый день. Это проще всего повесить на агент, так как операция чтения с файла банка занимает как правило меньше 0,01 сек.
Тут в этом же классе для удобства я добавил функцию создания агента. Чтобы добавить агент нужно запустить функцию NBUCurrencyLoad::AddBitrixAgent();
Заходим в "Настройки" - "Инструменты" - "Командрая строка PHP" и вписываем туда этот код.
Жмем "Выполнить", и если все прошло удачно - то должна появился надпись "Агент импорта валют добавлен".
Убедиться что агент добавлен, можно на странице "Настройки" - "Инструменты" - "Агенты" (сразу под пунктом с командной строкой PHP).
После этого заходим в "Настройки" - "Валюты" - "Курсы валют", и видим, что для сегодняшнего дня добавились новые курсы валют (если они на этот день еще не были заданы).
Вот, собственно, и все.
Скрипт требует наличия на сервере PHP библиотеки simplexml, как правило она установлена почти на всех хостингах.
В скрипте явно прописаны валюты, для которых делается выгрузка ("USD, "EUR", RUR".
Можно конечно было сразу брать все установленные в системе валюты, и для них обновлять курс, но во первых это дополнительные запросы к базе, а валюты добавляются обычно только один раз. А во вторых в системе могут быть специальные валюты, для которых курс импортировать не нужно, и для которых курс устанавливается вручную.
UPD.
Добавил вилку для проверки насколько изменился курс по отношению к предыдущему, чтобы избежать заведомо неверных курсов.