Розробка модуля мультивалютності для 1С-Бітрікс

Штатні механізми Бітрікс не справляються з гнучкою мультивалютністю для міжнародної торгівлі. Ми розробляємо модуль під ключ, який автоматизує курси, визначає валюту користувача та фіксує її в замовленнях, забезпечуючи надійну роботу та подальшу підтримку.

Розробка модуля мультивалютності для 1С-Бітрікс

Розробка модулівСередній~1-2 тижні
Часті запитання

Як ми вирішуємо проблему мультивалютності в Бітрікс

Під час розробки міжнародного інтернет-магазину на 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%.

Як визначається валюта користувача?

Пріоритет визначення:

  1. Явний вибір користувачем (cookie user_currency)
  2. Визначення за IP через MaxMind GeoIP2 або ip-api.com: валюта визначається за країною користувача
  3. Заголовок Accept-Language браузера
  4. Валюта за замовчуванням (із налаштувань модуля)
$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 день — просто напишіть нам.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060
  • Розробка віджета онлайн-запису для медичного центру
    Розробка віджета онлайн-запису для медичного центру
    837
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    928
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    865
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1223