Настройка валют і курсів в інтернет-магазині 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().







