Настройка валют и курсов в интернет-магазине 1С-Битрикс
Модуль currency в 1С-Битрикс отвечает за хранение валют, их курсов и правил форматирования. Без корректной настройки валют невозможна работа каталога, корзины и отчётов — система просто не сможет привести цены к единому знаменателю. Разберём устройство валютной подсистемы, автоматическое обновление курсов и особенности мультивалютного каталога.
Структура хранения валют
Все валюты регистрируются в таблице b_catalog_currency. Каждая запись содержит трёхсимвольный ISO-код (RUB, USD, EUR), сортировку и дату создания. Параметры форматирования — разделители, количество знаков после запятой, шаблон вывода — хранятся отдельно в b_catalog_currency_lang с привязкой к языку сайта. Это позволяет показывать «$100.00» англоязычным пользователям и «100,00 USD» — русскоязычным.
Курсы фиксируются в b_catalog_currency_rate. Каждый курс привязан к паре «валюта → базовая валюта» и дате. Битрикс при конвертации берёт ближайший по дате курс, поэтому важно, чтобы записи обновлялись регулярно.
Базовая валюта задаётся в настройках модуля currency. Все внутренние расчёты — скидки, наценки, отчёты — ведутся именно в ней. Менять базовую валюту на работающем магазине без пересчёта цен — прямой путь к хаосу в заказах.
Автоматическое обновление курсов
Ручное обновление курсов допустимо для магазинов с фиксированными ценами в одной валюте. Во всех остальных случаях нужен агент.
Битрикс из коробки умеет забирать курсы из ЦБ РФ (cbr.ru) и Европейского центрального банка (ECB). Настройка выполняется в разделе Валюты → Обновление курсов. Агент \Bitrix\Currency\CurrencyManager::updateCurrencyRates запускается по расписанию через систему агентов.
Механика работы агента:
- Агент обращается к выбранному провайдеру (ЦБ РФ или ECB) по HTTP.
- Парсит XML-ответ, извлекая курсы нужных валют.
- Записывает новые значения в
b_catalog_currency_rateс текущей датой. - Если запрос не удался — курс не обновляется, остаётся предыдущее значение.
Типичные проблемы:
- Агент не запускается — проверяйте
cronдляcron_events.phpи таблицуb_agent. Без cron агенты выполняются только при хитах, и на малопосещаемых сайтах курсы могут не обновиться сутками. - Расхождение часовых поясов — ЦБ РФ публикует курсы на следующий день примерно в 15:00 MSK. Агент, запущенный в 8:00, получит «вчерашний» курс.
- Нужен нестандартный провайдер (например, НБ РБ или Forex API) — придётся писать свой обработчик, реализующий интерфейс
\Bitrix\Currency\RateProvider. МетодgetRate()должен вернуть массив курсов в формате, совместимом со стандартным сохранением.
Для продакшн-систем рекомендуется дублировать обновление курсов отдельным cron-скриптом, который пишет лог и отправляет алерт при недоступности провайдера.
Мультивалютный каталог
Мультивалютность в Битрикс работает на двух уровнях: хранение цен и отображение.
На уровне хранения каждый тип цены (b_catalog_price) привязан к конкретной валюте. Можно задать оптовую цену в EUR, а розничную — в RUB. Битрикс конвертирует все цены к базовой валюте при сравнении и сортировке в каталоге.
На уровне отображения компонент catalog.element и catalog.section используют метод CCurrencyLang::CurrencyFormat() для форматирования. Валюта отображения определяется:
- Явно — через параметр компонента
CURRENCY_ID. - Автоматически — по настройке сайта или геолокации пользователя.
Конвертация в корзине происходит в момент добавления товара. Объект \Bitrix\Sale\Basket хранит цену в валюте сайта заказа. Если товар имеет цену в USD, а сайт работает в RUB — конвертация выполняется по текущему курсу. После добавления в корзину цена фиксируется и не пересчитывается при изменении курса (если не вызвать пересчёт явно).
Для показа цен в валюте пользователя без реальной конвертации используется JavaScript-пересчёт на клиенте. Серверная цена остаётся в базовой валюте, а на фронте умножается на курс, переданный через BX.Currency.setCurrencyFormat(). Такой подход снижает нагрузку на сервер, но требует аккуратной синхронизации курсов между сервером и клиентом.
Рекомендации по настройке
- Одна базовая валюта — не меняйте её после запуска магазина.
- Cron обязателен — не полагайтесь на агенты по хитам для обновления курсов.
- Округление — задавайте правила округления в настройках валюты, иначе получите расхождение в копейках между каталогом и корзиной.
-
Кэш курсов — модуль
currencyкэширует курсы. После ручного обновления сбрасывайте кэш через\Bitrix\Currency\CurrencyManager::clearCurrencyCache().







