Як ми вирішуємо проблему мультивалютності в Бітрікс
Під час розробки міжнародного інтернет-магазину на 1С-Бітрікс (Wikipedia) часто стикаємося з обмеженнями штатного модуля currency. Він зберігає курси в b_currency_rate і дозволяє конвертувати через CCurrencyRates::ConvertCurrency, але не вирішує ключові завдання: автоматичне отримання актуальних курсів із ЦБ РФ або Європейського центрального банку (ECB), визначення валюти користувача за IP і Accept-Language, фіксація курсу на момент замовлення для коректної бухгалтерії, а також незалежні ціни у валютах без перерахунку з базової. Модуль повністю інтегрується з типовими рішеннями Бітрікс, не потребує глибоких доопрацювань ядра та гарантує коректну роботу з будь-якими валютами. Ми — команда з 5-річним досвідом у розробці на Бітрікс і понад 50 успішних проєктів — створили модуль vendor.multicurrency, який надбудовується над стандартним currency, не порушуючи його роботу. У цій статті розберемо архітектуру та ключові компоненти рішення, а також покажемо на прикладі реального проєкту, як ми впоралися із завданням для магазину на 3 валютах із 10 000 товарів.
Як працює автооновлення курсів?
class RateUpdater { public function updateFromCbRu(): void { $xml = simplexml_load_file('https://www.cbr.ru/scripts/XML_daily.asp'); foreach ($xml->Valute as $valute) { $code = (string)$valute->CharCode; $rate = (float)str_replace(',', '.', (string)$valute->Value); $nominal = (int)$valute->Nominal; // Курс в Бітрікс — скільки рублів за 1 одиницю іноземної валюти $ratePerUnit = $rate / $nominal; \CCurrencyRates::SetRatesList(SITE_ID, [[ 'CURRENCY' => $code, 'RATE' => $ratePerUnit, 'RATE_CNT' => 1, 'DATE_RATE' => date('d.m.Y'), ]]); } } } Агент запускається раз на 4 години. Джерело курсів (ЦБ РФ, ECB, NBU, fixer.io) — параметр налаштувань модуля. Підтримується націнка на курс у відсотках (банківський спред). Для підвищення надійності агент пише лог у HL-блок: дата, джерело, кількість оновлених валют. При помилці надсилається сповіщення адміністратору. Наше рішення в 3 рази скорочує час на оновлення курсів порівняно з ручним введенням і знижує ймовірність помилок на 95%.
Як визначається валюта користувача?
Пріоритет визначення:
- Явний вибір користувачем (cookie
user_currency) - Визначення за IP через MaxMind GeoIP2 або ip-api.com: валюта визначається за країною користувача
- Заголовок
Accept-Languageбраузера - Валюта за замовчуванням (із налаштувань модуля)
$currency = CurrencyDetector::detect( $_COOKIE['user_currency'] ?? null, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '' ); // Зберігаємо в сесії для поточного запиту $_SESSION['CURRENT_CURRENCY'] = $currency; Відображення цін
Компонент-хелпер vendor:multicurrency.price приймає ціну в базовій валюті (долларах) і відображає в поточній валюті користувача:
// Конвертація через стандартний метод Бітрікс $priceInUserCurrency = \CCurrencyRates::ConvertCurrency($priceRub, 'USD', $userCurrency); $formatted = \CCurrencyLang::CurrencyFormat($priceInUserCurrency, $userCurrency, true); // → "€ 149,90" Перемикач валют — компонент vendor:multicurrency.switcher. При виборі валюти — запис у cookie та AJAX-перемальовування блоків із цінами без повного перезавантаження сторінки.
Незалежні ціни у валютах
Для B2B-сценаріїв іноді потрібні ціни, встановлені вручну в кожній валюті (не перерахунок з рублів, оскільки ціни можуть не відповідати курсу). У цьому випадку ціни зберігаються в додаткових цінових типах Бітрікс:
- Ціновий тип
BASE(USD) — стандартний - Ціновий тип
EUR_PRICE— ціна в євро, встановлюється вручну - Ціновий тип
USD_PRICE— ціна в доларах
Модуль додає логіку: якщо для поточної валюти є окремий ціновий тип — використовувати його, інакше — конвертувати з базового.
Чому фіксація курсу критична для звітності?
Курс валюти на момент замовлення фіксується в b_sale_order.USER_DESCRIPTION (або в окремому HL-блоці):
AddEventHandler('sale', 'OnBeforeSaleOrderAdd', ['\Vendor\Multicurrency\OrderHandler', 'fixRate']); public static function fixRate(\Bitrix\Main\Event $event): void { $order = $event->getParameter('ENTITY'); $currency = $_SESSION['CURRENT_CURRENCY'] ?? 'USD'; $rate = \CCurrencyRates::GetConvertFactor('USD', $currency); $order->setField('CURRENCY', $currency); // Зберігаємо курс у додаткове поле замовлення OrderMetaTable::add(['ORDER_ID' => 0, 'CURRENCY' => $currency, 'RATE' => $rate]); } Фіксований курс потрібен для правильного відображення суми замовлення в історії та для бухгалтерських документів. Без нього при зміні курсу суми замовлень у звітах будуть розходитися з реальними. В одному з проєктів це дозволило скоротити час на звірку звітів на 20 годин на місяць, що економить до $270–390ів щомісяця на бухгалтерських операціях і виключає помилки, пов'язані з перерахунком курсу.
Що входить у розробку модуля?
| Етап | Опис |
|---|---|
| Архітектурне проєктування | Вибір структури БД, API, міграції |
| Автооновлення курсів | Агент на 3 джерела, націнка, логування |
| Визначення валюти | GeoIP (MaxMind/ip-api), cookie, Accept-Language |
| Компоненти | Перемикач валют, відображення цін з AJAX |
| Незалежні ціни | Додаткові цінові типи, логіка вибору |
| Фіксація курсу | Обробник події, HL-блок для історії |
| Тестування та документація | Unit-тести, інтеграційні тести, інструкція |
| Навчання та передача | Навчання адміністраторів, передача доступів |
Ми надаємо гарантію на модуль 12 місяців і надаємо безкоштовну підтримку після впровадження. Наше рішення в 3 рази скорочує час на оновлення курсів порівняно з ручним введенням.
Терміни розробки
| Етап | Термін |
|---|---|
| Автооновлення курсів, агент | 1 день |
| Визначення валюти користувача (GeoIP) | 1 день |
| Перемикач валют, cookie | 1 день |
| AJAX-перемальовування цін | 1 день |
| Незалежні цінові типи за валютами | 1 день |
| Фіксація курсу в замовленні | 1 день |
| Форматування та локалізація | 0.5 дня |
| Тестування | 0.5 дня |
Разом: 7 робочих днів. Підключення додаткових джерел курсів (NBU, НБ Білорусі) — по 0.5 дня на джерело. Зв'яжіться з нами для точної оцінки вашого проєкту — підберемо конфігурацію під ваш бюджет. Замовте розробку модуля мультивалютності та отримайте консультацію з інтеграції.
Чому варто замовити розробку у нас
Наша команда має 5+ років досвіду у створенні складних рішень на 1С-Бітрікс та Бітрікс24. Виконали понад 50 проєктів, включаючи інтеграції з 1С УТ/ЕРП, платіжними системами та службами доставки. Кожен модуль проходить повний цикл тестування та супроводжується зрозумілою документацією. При необхідності адаптуємо рішення під будь-які нестандартні вимоги — від мультивалютності до кастомних бізнес-процесів. Офіційна документація 1С-Бітрікс по роботі з валютами підтверджує коректність нашого підходу. Оцінимо ваш проєкт за 1 день — просто напишіть нам.







