В Битриксе есть встроенный механизм импорта валют из банка, но это подходит только для пользователей из России, так как идет импорт и банка РФ, и валюты привязаны к рублю.
Для Украины удобно делать импорт из украинского банка, где все валюты привязаны к гривне.
Ну и еще, в стандартной поставке Битрикса для ежедневного импорта валют нужно каждый день заходить и клацать кнопочку. Что не прикольно. Попробуем это исправить.
Делается это очень просто. Как правило, все уважающие себя банки делают ежедневную выгрузку курсов валют в 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.
Добавил вилку для проверки насколько изменился курс по отношению к предыдущему, чтобы избежать заведомо неверных курсов.