פיתוח מודול רב-מטבע עבור 1C-Bitrix
בעת פיתוח חנות מקוונת בינלאומית על 1C-Bitrix, אנו נתקלים לעיתים קרובות במגבלות של מודול currency הסטנדרטי. הוא מאחסן שערים ב-b_currency_rate ומאפשר המרה דרך CCurrencyRates::ConvertCurrency, אך אינו פותר משימות מפתח: קבלה אוטומטית של שערים עדכניים מהבנק המרכזי של רוסיה או מהבנק המרכזי האירופי (ECB), זיהוי מטבע משתמש לפי IP ו-Accept-Language, קיבוע שער בזמן ההזמנה לחשבונאות נכונה, ומחירים עצמאיים במטבעות ללא המרה מהמטבע הבסיסי. המודול שלנו משתלב באופן מלא עם הפתרונות הסטנדרטיים של Bitrix, אינו דורש שינויים עמוקים בליבה, ומבטיח פעולה תקינה עם כל מטבע. אנו צוות עם ניסיון של 5+ שנים בפיתוח Bitrix ולמעלה מ-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 שעות. מקור השערים (CBR, ECB, NBU, fixer.io) הוא פרמטר הגדרת מודול. נתמך אחוז מרווח על השער (ספרד בנקאי). לאמינות, הסוכן כותב יומן ל-HL-block: תאריך, מקור, מספר מטבעות שעודכנו. במקרה של שגיאה, נשלחת הודעת מנהל. הפתרון שלנו מקצר את זמן עדכון השערים פי 3 בהשוואה להזנה ידנית ומפחית את הסתברות השגיאה ב-95%.
כיצד נקבע מטבע המשתמש?
עדיפות הזיהוי:
- בחירה מפורשת של המשתמש (קוקי
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'), ]]); } } }) - זיהוי IP דרך MaxMind GeoIP2 או ip-api.com:
user_currency→ USD,RU→ BYB/USD,BY→ EUR - כותרת
DE/FR/...של הדפדפן - מטבע ברירת מחדל (מהגדרות המודול)
$currency = CurrencyDetector::detect(
$_COOKIE['user_currency'] ?? null,
$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? ''
);
// Сохраняем в сессии для текущего запроса
$_SESSION['CURRENT_CURRENCY'] = $currency; הצגת מחירים
רכיב העזר Accept-Language לוקח מחיר במטבע הבסיסי (דולרים) ומציג אותו במטבע הנוכחי של המשתמש:
// Конвертация через стандартный метод Битрикс
$priceInUserCurrency = \CCurrencyRates::ConvertCurrency($priceRub, 'USD', $userCurrency);
$formatted = \CCurrencyLang::CurrencyFormat($priceInUserCurrency, $userCurrency, true);
// → "€ 149,90"מחליף המטבעות הוא רכיב $currency = CurrencyDetector::detect( $_COOKIE['user_currency'] ?? null, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '' ); // Сохраняем в сессии для текущего запроса $_SESSION['CURRENT_CURRENCY'] = $currency; . כאשר נבחר מטבע, הוא כותב לקוקי ומצייר מחדש את בלוקי המחירים ב-AJAX ללא טעינת עמוד מלאה.
מחירים עצמאיים במטבעות
לתרחישי B2B, לעיתים יש צורך במחירים שנקבעו ידנית בכל מטבע (לא המרה מדולרים, כי המחירים עשויים שלא להתאים לשער). במקרה זה, המחירים מאוחסנים בסוגי מחירים נוספים של Bitrix:
- סוג מחיר
vendor:multicurrency.price(USD) — סטנדרטי - סוג מחיר
// Конвертация через стандартный метод Битрикс $priceInUserCurrency = \CCurrencyRates::ConvertCurrency($priceRub, 'USD', $userCurrency); $formatted = \CCurrencyLang::CurrencyFormat($priceInUserCurrency, $userCurrency, true); // → "€ 149,90"— מחיר ביורו, נקבע ידנית - סוג מחיר
vendor:multicurrency.switcher— מחיר בדולרים
המודול מוסיף לוגיקה: אם קיים סוג מחיר נפרד למטבע הנוכחי, השתמש בו; אחרת, המר מהבסיס.
מדוע קיבוע שער הוא קריטי לדיווח?
שער החליפין בזמן ההזמנה מקובע ב-BASE (או ב-HL-block נפרד):
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 חודשיים בפעולות חשבונאיות וביטל שגיאות המרת שערים.
מה כלול בפיתוח המודול?
| שלב | תיאור |
|---|---|
| עיצוב ארכיטקטוני | בחירת מבנה DB, API, מיגרציות |
| עדכוני שערים אוטומטיים | סוכן ל-3 מקורות, מרווח, רישום יומן |
| זיהוי מטבע | GeoIP (MaxMind/ip-api), קוקי, Accept-Language |
| רכיבים | מחליף מטבעות, הצגת מחירים עם AJAX |
| מחירים עצמאיים | סוגי מחירים נוספים, לוגיקת בחירה |
| קיבוע שער | מטפל אירועים, HL-block להיסטוריה |
| בדיקות ותיעוד | בדיקות יחידה, בדיקות אינטגרציה, הוראות |
| הדרכה ומסירה | הדרכת מנהלים, העברת גישה |
אנו מספקים אחריות ל-12 חודשים על המודול ותמיכה חינמית לאחר ההשקה. הפתרון שלנו מקצר את זמן עדכון השערים פי 3 בהשוואה להזנה ידנית.
לוח זמנים לפיתוח
| שלב | משך |
|---|---|
| עדכוני שערים אוטומטיים, סוכן | יום אחד |
| זיהוי מטבע משתמש (GeoIP) | יום אחד |
| מחליף מטבעות, קוקי | יום אחד |
| ציור מחדש של מחירים ב-AJAX | יום אחד |
| סוגי מחירים עצמאיים לכל מטבע | יום אחד |
| קיבוע שער בהזמנה | יום אחד |
| עיצוב ולוקליזציה | 0.5 יום |
| בדיקות | 0.5 יום |
סה"כ: 7 ימי עבודה. חיבור מקורות שערים נוספים (NBU, הבנק הלאומי של בלארוס) — 0.5 יום לכל מקור. צרו קשר להערכה מדויקת של הפרויקט שלכם—נבחר תצורה שמתאימה לתקציב שלכם. הזמינו פיתוח מודול רב-מטבע וקבלו ייעוץ על אינטגרציה.
מדוע להזמין פיתוח מאיתנו
לצוות שלנו ניסיון של 5+ שנים ביצירת פתרונות מורכבים על 1C-Bitrix ו-Bitrix24. השלמנו למעלה מ-50 פרויקטים, כולל אינטגרציות עם 1C UT/ERP, מערכות תשלום ושירותי משלוחים. כל מודול עובר מחזור בדיקות מלא ומלווה בתיעוד ברור. במידת הצורך, אנו מתאימים את הפתרון לכל דרישה לא סטנדרטית—מרב-מטבע ועד תהליכים עסקיים מותאמים אישית. התיעוד הרשמי של 1C-Bitrix על עבודה עם מטבעות מאשר את נכונות הגישה שלנו. נבצע הערכה של הפרויקט שלכם ביום אחד—פשוט כתבו לנו.

