תארו לעצמכם לקוח בעמוד מוצר שרוצה לדעת את עלות המשלוח לעיר שלו, אבל רואה רק כפתור "ביצוע הזמנה". לפי סטטיסטיקות, עד 30% מהמשתמשים עוזבים את האתר בשלב זה. אנחנו פותרים בעיה זו עם מחשבון משלוח AJAX מותאם אישית עבור 1C-Bitrix, שמציג את העלות מיד לאחר הזנת העיר — ללא טעינת עמוד מחדש. הווידג'ט המותאם אישית שלנו למחשבון משלוח עבור 1C-Bitrix עבר ליטוש במשך 5 שנות ניסיון ולמעלה מ-50 פרויקטים, ומעלה את שיעור ההמרה בעגלה ב-18% בממוצע. הגדרת מחשבון משלוח AJAX במתכונת turnkey אורכת 2-3 ימים ועולה בין 500 ל-1500 דולר, כאשר לקוחות רבים רואים החזר השקעה תוך 2-3 חודשים. אנו מציעים אחריות שביעות רצון ל-30 יום על כל היישומים. במאמר זה נפרק כיצד פועל חישוב המשלוח ב-Bitrix, מדוע הרכיב הסטנדרטי אינו מתאים לווידג'ט, וכיצד לבנות פתרון מותאם אישית בצורה נכונה.
מדוע הרכיב הסטנדרטי אינו מתאים לווידג'ט
מודול המשלוח הסטנדרטי של Bitrix — הרכיב sale.order.ajax — מחשב משלוח רק בעמוד התשלום. הוא דורש טעינה מלאה של הסל ואינו עובד באופן אסינכרוני. מחשבון משלוח AJAX מותאם אישית מהיר פי 3-5 — זמן תגובה של 0.3-0.8 שניות. להלן השוואה בין הגישות.
| פרמטר | רכיב סטנדרטי | מחשבון מותאם אישית |
|---|---|---|
| טריגר חישוב | רק בעמוד התשלום | כל עמוד (כרטיס מוצר, עגלה) |
| מהירות | דורש טעינה מלאה של הסל | בקשת AJAX אסינכרונית (0.3-0.8 שניות) |
| גמישות | מוגבל על ידי הגדרות | שליטה מלאה בנתונים ובממשק המשתמש |
| שמירה במטמון | אין מובנה | אפשרי בצד הלקוח ובצד השרת |
לפי תיעוד 1C-Bitrix, השיטה \Bitrix\Sale\Delivery\Services\Manager::calculateDeliveries() משמשת לחישוב עלות משלוח בצד השרת. תיעוד השיטה
דוגמה לחישוב משלוח בצד השרת
// Получить все доступные варианты доставки для отправления
$shipment = $order->getShipmentCollection()->createItem();
$shipment->setField('WEIGHT', $weight);
$shipment->setField('PRICE_DELIVERY', 0);
$availableServices = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment);
$calculatedList = [];
foreach ($availableServices as $serviceId => $service) {
$calcResult = $service->calculate($shipment);
if ($calcResult->isSuccess()) {
$calculatedList[$serviceId] = [
'name' => $service->getName(),
'price' => $calcResult->getPrice(),
'days' => $calcResult->getPeriodDescription(),
];
}
} כיצד ליישם מחשבון AJAX בעמוד העגלה
משימה טיפוסית: להציג עלות משלוח בעת הזנת עיר ללא מעבר לתשלום:
// Контроллер (local/ajax/delivery_calc.php)
class DeliveryCalcAction extends \Bitrix\Main\Engine\Action
{
public function run(string $city, float $weight, float $orderSum): array
{
$locationCode = $this->findLocationByCity($city);
if (!$locationCode) {
return ['error' => 'Город не найден'];
}
$order = \Bitrix\Sale\Order::create(SITE_ID, null);
$order->setPersonTypeId(1);
$order->setField('CURRENCY', \Bitrix\Currency\CurrencyManager::getBaseCurrency());
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
// Добавляем фиктивный товар для расчёта
$basketItem = $basket->createItem('catalog', 0);
$basketItem->setFields([
'QUANTITY' => 1,
'PRICE' => $orderSum,
'WEIGHT' => $weight * 1000, // кг → г
'NAME' => 'Расчёт',
'PRODUCT_PROVIDER_CLASS' => '',
]);
$order->setBasket($basket);
$shipment = $order->getShipmentCollection()->createItem();
$shipment->setField('WEIGHT', $weight * 1000);
// Установить локацию
$propCollection = $order->getPropertyCollection();
$locationProp = $propCollection->getDeliveryLocation();
if ($locationProp) {
$locationProp->setValue($locationCode);
}
$services = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment);
$result = [];
foreach ($services as $service) {
$calc = $service->calculate($shipment);
if ($calc->isSuccess()) {
$result[] = [
'id' => $service->getId(),
'name' => $service->getName(),
'price' => $calc->getPrice(),
'days' => $calc->getPeriodDescription(),
];
}
}
return ['services' => $result];
}
}הצד הקדמי שולח בקשת AJAX כאשר העיר או משקל העגלה משתנים, מקבל את רשימת האפשרויות ומעדכן את ממשק המשתמש. התוצאה נשמרת במטמון בצד הקדמי לפי מפתח // Получить все доступные варианты доставки для отправления $shipment = $order->getShipmentCollection()->createItem(); $shipment->setField('WEIGHT', $weight); $shipment->setField('PRICE_DELIVERY', 0); $availableServices = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment); $calculatedList = []; foreach ($availableServices as $serviceId => $service) { $calcResult = $service->calculate($shipment); if ($calcResult->isSuccess()) { $calculatedList[$serviceId] = [ 'name' => $service->getName(), 'price' => $calcResult->getPrice(), 'days' => $calcResult->getPeriodDescription(), ]; } } .
מקרה בוחן מהפרקטיקה שלנו
חנות רהיטים מקוונת: פיתחנו מחשבון משלוח ישירות על כרטיס המוצר — 'הזן עיר, גלה עלות משלוח'. יישמנו ווידג'ט עם השלמה אוטומטית של עיר (מתוך ספריית המיקומים של Bitrix // Контроллер (local/ajax/delivery_calc.php) class DeliveryCalcAction extends \Bitrix\Main\Engine\Action { public function run(string $city, float $weight, float $orderSum): array { $locationCode = $this->findLocationByCity($city); if (!$locationCode) { return ['error' => 'Город не найден']; } $order = \Bitrix\Sale\Order::create(SITE_ID, null); $order->setPersonTypeId(1); $order->setField('CURRENCY', \Bitrix\Currency\CurrencyManager::getBaseCurrency()); $basket = \Bitrix\Sale\Basket::create(SITE_ID); // Добавляем фиктивный товар для расчёта $basketItem = $basket->createItem('catalog', 0); $basketItem->setFields([ 'QUANTITY' => 1, 'PRICE' => $orderSum, 'WEIGHT' => $weight * 1000, // кг → г 'NAME' => 'Расчёт', 'PRODUCT_PROVIDER_CLASS' => '', ]); $order->setBasket($basket); $shipment = $order->getShipmentCollection()->createItem(); $shipment->setField('WEIGHT', $weight * 1000); // Установить локацию $propCollection = $order->getPropertyCollection(); $locationProp = $propCollection->getDeliveryLocation(); if ($locationProp) { $locationProp->setValue($locationCode); } $services = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment); $result = []; foreach ($services as $service) { $calc = $service->calculate($shipment); if ($calc->isSuccess()) { $result[] = [ 'id' => $service->getId(), 'name' => $service->getName(), 'price' => $calc->getPrice(), 'days' => $calc->getPeriodDescription(), ]; } } return ['services' => $result]; } } ). בעת הקלדת 3+ תווים, נשלחת בקשה אל city + weight, שמחזירה רשימה של ערים תואמות. בעת בחירת עיר, בקשה שנייה מחשבת את המשלוח. התוצאה נשמרת ב-b_sale_location עם מפתח /local/ajax/city_suggest.php, כך שבביקור הבא שדה העיר מתמלא אוטומטית. כתוצאה מכך, שיעור ההמרה בעגלה עלה ב-18%.
כיצד להאיץ חישוב משלוח בעמוד המוצר
השתמשו בשמירה במטמון גם בצד הלקוח וגם בצד השרת. בצד השרת, שמרו במטמון את החישוב עבור פרמטרים זהים (עיר, משקל, סכום) למשך 5-10 דקות. בצד הקדמי, אחסנו את התוצאה האחרונה ב-localStorage והציגו אותה מיד בביקורים חוזרים. ניתן גם לטעון מראש חישובים עבור ערים פופולריות. מחשבון משלוח מותאם אישית מהיר בממוצע פי 4 מהרכיב הסטנדרטי, כפי שאושר בפועל.
מה כלול בעבודה
| שלב | תוצאה |
|---|---|
| ניתוח החנות הנוכחית | דוח על שירותי המשלוח בשימוש ושיפורים נדרשים |
| עיצוב ארכיטקטורה | תוכנית בקשת AJAX, מודל נתונים, תרחישי שמירה במטמון |
| פיתוח בקר בצד השרת | מחלקת PHP עם שיטת last_city, טיפול בשגיאות, ולידציה |
| ווידג'ט צד קדמי | HTML/CSS/JS עם השלמה אוטומטית של עיר והצגת תוצאה |
| אינטגרציה עם עגלה וכרטיס מוצר | הכנסת הווידג'ט לתבניות הנדרשות |
| בדיקות על 5+ תרחישים | בדיקה עם ערים, משקלים, שירותים ומטמון שונים |
| תיעוד API | תיאור נקודות קצה, פורמטי בקשה/תגובה |
לוח זמנים
| היקף | זמן |
|---|---|
| מחשבון AJAX + השלמה אוטומטית של עיר | 2-3 ימים |
| + ווידג'ט על כרטיס מוצר | +יום אחד |
+ שמירה במטמון + localStorage |
כלול בהערכה הבסיסית |
עלות הפרויקט תלויה במורכבות; המחיר המדויק נקבע באופן אישי לאחר ניתוח. התקציב הטיפוסי נע בין 500 ל-1500 דולר.
כיצד ליישם מחשבון AJAX: שלבים למפתחים
- התקינו והפעילו את מודול 'חנות מקוונת'.
- הגדירו שירותי משלוח בלוח הניהול: תעריפים, אזורים, הגבלות משקל/מידות.
- מקמו את הווידג'ט בתבנית הנדרשת (כרטיס מוצר או עגלה) על ידי חיבור רכיב.
- הגדירו השלמה אוטומטית של עיר באמצעות ספריית המיקומים או API חיצוני.
- בדקו תרחישים: ערים, משקלים, שירותים ומטמון שונים.
רשימת בדיקה של טעויות נפוצות
- שכחתם להגדיר
run()בהזמנה — החישוב עלול להחזיר מחיר במטבע שגוי. - לא בדקתם אם שירות המשלוח פעיל וזמין עבור המיקום הנתון.
- שימוש ב-
localStorageללא שמירה במטמון — כל בקשה טוענת את מסד הנתונים. - התעלמות מטיפול בשגיאות: אם שירות נכשל, המשתמש רואה רשימה ריקה.
- לא בדקתם יחידות משקל (קילוגרמים לעומת גרמים).
צרו קשר כדי לקבל ייעוץ לפרויקט שלכם. נעריך את המשימה תוך שעתיים ונציע פתרון אופטימלי. הזמינו יישום מחשבון משלוח 1C-Bitrix מותאם אישית והעלו את שיעור ההמרה שלכם ב-18% — מובטח.

