Курсы валют в магазине нужно обновлять каждый день, иначе цены в пересчёте «поплывут». В 1С-Битрикс за это отвечает встроенный агент модуля Валюты, который тянет данные с сайта ЦБ РФ. Разберём, как его включить, где смотреть результат и что делать, когда обновление молча перестаёт работать.
Как Битрикс получает курс от ЦБ РФ
Модуль currency обращается к ежедневному XML ЦБ РФ по адресу https://www.cbr.ru/scripts/XML_daily.asp. В ответе приходит список валют с атрибутами Nominal (номинал, за сколько единиц указан курс) и Value (значение в рублях). Битрикс сопоставляет узлы по коду валюты CharCode (USD, EUR, CNY) и записывает актуальное значение в таблицу курсов.
Ключевая деталь — номинал. Для доллара и евро Nominal равен 1, а, например, для японской иены — 100. Битрикс делит Value на Nominal и хранит курс за одну единицу валюты. Если завести валюту с неверным номиналом в её карточке, пересчёт цен окажется в десятки раз мимо, даже когда XML разобран корректно.
Включение автообновления
Автообновление живёт в настройках модуля: Настройки → Настройки продукта → Настройки модулей → Валюты. Там есть флаг обновления курса и список валют, для которых оно выполняется. После сохранения Битрикс создаёт (или активирует) агента, который раз в сутки дёргает XML ЦБ РФ.
Проверить агента можно в Настройки → Настройки продукта → Агенты. Ищите функцию с префиксом модуля currency — как правило, это \CCurrencyRates::CurrencyAgent(); или аналогичный вызов рейтинга валют. У агента важны два поля:
- Активность — агент должен быть включён;
- Следующий запуск — дата в будущем и разумный интервал (обычно 86400 секунд, то есть раз в сутки).
Если строки агента нет вовсе, снимите и снова поставьте галку обновления в настройках модуля — Битрикс пересоздаст его.
Почему без cron агент запаздывает
По умолчанию агенты в Битрикс выполняются «на хитах» — то есть когда кто-то открывает страницу сайта. На малопосещаемом магазине это значит, что курс может обновиться не в момент публикации ЦБ, а позже, при первом заходе посетителя. Для стабильного ежедневного обновления агенты выносят на cron.
Порядок такой: в /bitrix/php_interface/dbconn.php задают константу
define('BX_CRONTAB', true);
и добавляют в crontab сервера регулярный вызов планировщика:
*/5 * * * * /usr/bin/php -f /home/site/public_html/bitrix/modules/main/tools/cron_events.php
После перевода на cron агенты перестают исполняться на хитах, поэтому убедитесь, что задание реально работает, иначе курс замрёт совсем.
Наценка к курсу ЦБ
Чистый курс ЦБ РФ редко подходит магазину: закупка идёт по курсу банка с комиссией, плюс закладывается запас на волатильность. В карточке валюты (Магазин → Настройки → Валюты) есть поле Курс и множитель, но удобнее задать наценку в процентах прямо в настройках обновления.
Логика простая: Битрикс берёт значение из XML ЦБ и умножает на коэффициент. Типовые схемы:
| Задача | Что задать |
|---|---|
| Курс ЦБ «как есть» | Наценка 0% |
| Запас на комиссию банка | Наценка 2–5% |
| Фиксированный курс месяца | Отключить агент, задать курс вручную |
Если у вас мультивалютный каталог, помните: наценка к курсу влияет на итоговую цену всех товаров, которые пересчитываются из этой валюты в валюту сайта.
Диагностика: курс не обновляется
Самая частая жалоба — «курс завис на прошлой неделе». Проверяйте по порядку:
- Агент активен и не в прошлом. Если «Следующий запуск» в прошлом, а на cron агенты не переведены — они просто не сработали.
- Сервер видит cbr.ru. С консоли:
curl -I https://www.cbr.ru/scripts/XML_daily.asp. Firewall или отсутствие исходящего HTTPS — типичная причина тишины. - SSL и время. Устаревшие CA-сертификаты на сервере ломают HTTPS-запрос к ЦБ; ошибка уходит в лог, а курс остаётся старым.
- Выходные и праздники. ЦБ РФ не публикует новый курс в выходные — в эти дни XML отдаёт значение последнего рабочего дня, и это нормально.
Настройки → Инструменты → Журнал событий, если включено логирование, либо временно вызвать обновление из-под отладки, чтобы увидеть текст исключения.Ручное обновление и API
Когда нужно обновить курс немедленно (например, перед выгрузкой прайса), не обязательно ждать агента. В административной части карточки валюты есть кнопка получения текущего курса. Программно то же самое делается через методы модуля:
CCurrencyRates::GetConvertCurrency($sum, $from, $to) — пересчёт суммы между валютами по сохранённому курсу; CCurrencyRates::UpdateBaseRates() и родственные методы — принудительное обновление.
Свою логику удобно оформить отдельным агентом или cron-скриптом: инициализируете ядро через require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');, подключаете модуль currency и вызываете обновление. Это пригодится, если вы тянете курс не с ЦБ, а с другого источника (курс банка-эквайера, биржи) и разбираете свой формат ответа.
Итог
Автообновление курсов ЦБ РФ в Битрикс — это связка из трёх звеньев: включённый флаг в настройках модуля currency, живой агент с корректным интервалом и, желательно, cron для точного ежедневного запуска. Отдельно следите за номиналом валют и наценкой к курсу, чтобы цены пересчитывались верно, и проверяйте доступ сервера к cbr.ru, если обновление внезапно замолчало.
Если магазин мультивалютный, курс завязан на выгрузку из 1С или обновление ломается после переезда на другой сервер, мы помогаем настроить обмен, агентов и cron так, чтобы цены оставались корректными без ручного контроля.
Частые вопросы
Как часто Битрикс обновляет курс ЦБ?
По умолчанию агент запускается раз в сутки. ЦБ РФ публикует новый курс один раз в рабочий день, поэтому чаще обновлять смысла нет.
Почему курс не меняется по выходным?
ЦБ РФ не устанавливает новые курсы в выходные и праздники. В эти дни XML отдаёт значение последнего рабочего дня — это ожидаемое поведение, а не сбой.
Нужен ли cron для автообновления курсов?
Строго не обязателен: агенты работают и на хитах. Но на сайтах с малой посещаемостью cron гарантирует, что курс обновится вовремя, а не при первом заходе посетителя.
Курс завис на старом значении, что проверить?
Проверьте активность агента и дату следующего запуска, доступ сервера к cbr.ru через curl и актуальность SSL-сертификатов. Часто причина — заблокированный исходящий HTTPS.
Как добавить наценку к курсу ЦБ?
В настройках обновления валют указывается процент наценки, на который Битрикс умножает значение из XML ЦБ. Так закладывают комиссию банка и запас на волатильность.
Можно ли обновить курс вручную прямо сейчас?
Да. В карточке валюты в админке есть кнопка получения текущего курса, а программно доступны методы CCurrencyRates для принудительного обновления и пересчёта.
Почему пересчёт цен ошибается в десятки раз?
Скорее всего неверно задан номинал валюты. Битрикс делит значение курса на номинал из XML, и рассинхрон номинала в карточке валюты искажает все пересчитанные цены.
Можно ли брать курс не с ЦБ, а из другого источника?
Да, через собственный агент или cron-скрипт: подключаете ядро и модуль currency, разбираете нужный формат ответа и записываете курс методами модуля.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.