בפרקטיקה שלנו, לעיתים קרובות נוצרים מצבים שבהם מודולי משלוח מוכנים לא מתאימים: חברת שילוח עם API לא סטנדרטי, לוגיקה עסקית הכוללת הובלת מטענים, או מחלקת תחבורה פנימית. פיתוח handler משלוח מותאם אישית ל-1C-Bitrix כולל אינטגרציה עם API של חברת השילוח וקאשינג. בפרויקט אחד עבדנו עם חברת ייצור בעלת צי רכב משלה. הם נזקקו לחישוב עלויות משלוח באמצעות מטריצה של 150 שורות תעריף. פיתחנו handler מותאם אישית המשולב עם בלוק מידע תעריפים. זה אוטומט את החישובים לכל המסלולים והפחית את עלויות הלוגיסטיקה ב-35%, תוך חיסכון של עד 2,000 דולר בחודש. גישה כזו נחוצה לחברות עם לוגיסטיקה ייחודית. למהנדסים שלנו יש ניסיון של למעלה מ-7 שנים עם Bitrix והם יישמו למעלה מ-30 handlers מותאמים אישית. המחירים מתחילים מ-500 דולר עבור handler בסיסי. אנו מבטיחים פעילות יציבה ותיעוד מלא.
מהו Handler משלוח מותאם אישית?
handler משלוח של Bitrix יורש מ-\Bitrix\Sale\Delivery\Services\Base ומיישם מספר מתודות מפתח. התיעוד הרשמי של 1C-Bitrix (ראה dev.1c-bitrix.ru) ממליץ על המבנה הבא:
namespace Local\Delivery; use Bitrix\Main\Localization\Loc; use Bitrix\Sale\Delivery\Services\Base; use Bitrix\Sale\Delivery\CalculationResult; use Bitrix\Sale\Shipment; class CustomDeliveryService extends Base { protected static function getClassTitle(): string { return 'Собственная доставка'; } protected static function getClassDescription(): string { return 'Расчёт стоимости доставки через собственный транспортный отдел'; } public static function canHasProfiles(): bool { return false; } public static function whetherAdminExist(): bool { return false; } public static function isCompatible(\Bitrix\Sale\Shipment $shipment): bool { return true; } protected function getConfigStructure(): array { return [ 'main' => [ 'title' => 'Настройки', 'items' => [ 'API_URL' => ['title' => 'URL API перевозчика', 'type' => 'text'], 'API_KEY' => ['title' => 'Ключ API', 'type' => 'text'], 'FROM_CITY' => ['title' => 'Город отправки', 'type' => 'text', 'default' => 'Москва'], 'PRICE_PER_KG' => ['title' => 'Цена за кг (руб.)', 'type' => 'text', 'default' => '150'], 'BASE_PRICE' => ['title' => 'Базовая стоимость (руб.)', 'type' => 'text', 'default' => '300'], ], ], ]; } protected function calculateConcrete(Shipment $shipment): CalculationResult { $result = new CalculationResult(); try { $price = $this->calcDeliveryPrice($shipment); $result->setDeliveryPrice($price); $result->setPeriodDescription($this->estimatePeriod($shipment)); } catch (\Throwable $e) { $result->addError(new \Bitrix\Main\Error($e->getMessage())); } return $result; } } לחץ להרחבת דוגמת קוד
הקוד המלא עבור handler חישוב מקומי זמין בחלק שלמעלה. עבור אינטגרציה עם API חיצוני, ראה את החלק הבא.
כיצד לבנות Handler משלוח מותאם אישית?
לוגיקת חישוב: תעריף מותאם אישית
חישוב מותאם אישית טיפוסי משלב תעריף בסיסי קבוע וחלק משתנה (משקל, נפח, מרחק). בדוגמה, מטריצת התעריפים מאוחסנת בבלוק מידע: 150 שורות, כל אחת מכילה זוג ערים ותעריף בסיסי. ה-handler בוחר את השורה על פי המסלול ומחיל מקדמים:
private function calcDeliveryPrice(Shipment $shipment): float { $order = $shipment->getOrder(); $weightKg = $shipment->getWeight() / 1000; $basePrice = (float)$this->getOption('BASE_PRICE', 300); $pricePerKg = (float)$this->getOption('PRICE_PER_KG', 150); $price = $basePrice + ($weightKg * $pricePerKg); $volumeWeight = $this->getVolumeWeight($shipment); if ($volumeWeight > $weightKg) { $price = $basePrice + ($volumeWeight * $pricePerKg); } if ($order->getPrice() >= 10000) { $price *= 0.9; } return max($price, $basePrice); } private function getVolumeWeight(Shipment $shipment): float { $length = (float)$this->getOption('DEFAULT_LENGTH', 20); $width = (float)$this->getOption('DEFAULT_WIDTH', 20); $height = (float)$this->getOption('DEFAULT_HEIGHT', 20); return ($length * $width * $height) / 5000; } אינטגרציה עם API של חברת שילוח חיצונית
אם לא ניתן לבצע את החישוב מקומית, נדרשת אינטגרציה עם API של חברת השילוח. להלן דוגמה לאינטגרציה כזו:
private function apiCalc(Shipment $shipment): array { $order = $shipment->getOrder(); $toCity = $this->getOrderCity($shipment); $payload = [ 'from' => $this->getOption('FROM_CITY'), 'to' => $toCity, 'weight' => $shipment->getWeight() / 1000, 'amount' => round($order->getPrice()), ]; $ch = curl_init($this->getOption('API_URL') . '/calculate'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'X-Api-Key: ' . $this->getOption('API_KEY'), ], ]); $response = json_decode(curl_exec($ch), true); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code !== 200 || empty($response['price'])) { throw new \RuntimeException('API вернул ошибку: ' . $code); } return $response; } זמן הקצובה של 5 שניות הוא קריטי. API איטי של חברת שילוח לא אמור להקפיא את דף התשלום. אנו תמיד קובעים מגבלה זו כדי לשמר את חוויית המשתמש.
אופטימיזציה של חישוב עם קאשינג
חישוב המשלוח מופעל בכל שינוי בעגלה. אם ה-API איטי, קאשינג מפחית את העומס על שירותים חיצוניים:
private function calcWithCache(Shipment $shipment): float { $cacheKey = 'delivery_calc_' . md5(serialize([ $shipment->getWeight(), $this->getOrderCity($shipment), $this->getOption('FROM_CITY'), ])); $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($cache->initCache(300, $cacheKey, '/delivery/')) { return $cache->getVars(); } $price = $this->apiCalc($shipment)['price']; $cache->startDataCache(); $cache->endDataCache($price); return (float)$price; } קאשינג מאיץ את החישוב פי 10-15 בהשוואה לקריאות API ללא קאש. זה מפחית את עומס השרת ומאיץ את תהליך התשלום.
רישום ה-Handler ודוגמה מעשית
\Bitrix\Main\Loader::registerAutoLoadClasses(null, [ 'Local\\Delivery\\CustomDeliveryService' => '/local/php_interface/delivery/CustomDeliveryService.php', ]); \Bitrix\Sale\Delivery\Services\Manager::register('Local\\Delivery\\CustomDeliveryService'); לאחר הרישום, ה-handler מופיע ברשימת שירותי המשלוח וזמין להגדרה.
המקרה שלנו: בפרויקט אחד עבדנו עם חברת ייצור ששלחה סחורות עם צי רכב משלה. העלות חושבה באמצעות מטריצה: תעריף בסיסי לכל מסלול בתוספת תוספות עבור משקל ונפח. מטריצת התעריפים אוחסנה בבלוק מידע (150 שורות: מ → אל). ה-handler חיפש את השורה לפי זוג הערים והחיל מקדמים. אם לא נמצא מסלול ישיר, הוצגה הודעה "צור קשר עם המנהל שלך". זה אוטמט 95% מההזמנות והפחית את זמן העיבוד ב-40%. ה-handlers שלנו מטפלים בעד 400 הזמנות ביום עם זמינות של 99.9%.
מה כלול ותהליך הפיתוח
- ניתוח: חקר API של חברת השילוח, לוגיקה עסקית, תעריפים
- עיצוב: ארכיטקטורת ה-handler, הגדרות, קאשינג
- יישום: כתיבת קוד, בדיקות על שרת סטייג'ינג
- תיעוד: תיאור הגדרות, מסמכי API, הוראות למנהלים
- הדרכה: תדרוך קצר לצוות העובד עם משלוחים
- תמיכה: חודש אחד של תמיכה טכנית לאחר ההשקה
- ניתוח — איסוף דרישות, חקר תיעוד API של חברת השילוח.
- עיצוב — הגדרת ארכיטקטורת ה-handler, הגדרות, סכמת קאשינג.
- יישום — כתיבת קוד, הגדרת אינטגרציה, הרצת בדיקות יחידה.
- בדיקות — אימות עם הזמנות אמיתיות במצב בדיקה.
- פריסה — התקנה על שרת ייצור, הגדרת ניטור.
טיפול בשגיאות ומקרי קצה
יציבות ה-handler תלויה בטיפול נכון בחריגות. שגיאות נפוצות באינטגרציה עם API חיצוני: זמן קצובה, תגובת שרת שגויה, חוסר זמינות של חברת השילוח, נתוני משלוח לא תקינים. אנו מיישמים גישה רב-שכבתית: אימות קלט לפני שליחה, רישום שגיאות HTTP עם חותמת זמן, לוגיקת גיבוי (למשל, תעריף מקסימלי אם ה-API לא זמין), מנגנון ניסיון חוזר עם השהיה אקספוננציאלית. כל שגיאה מתועדת לניתוח עתידי. אם משלוח אינו זמין לכתובת מסוימת, המערכת מודיעה ללקוח עם הודעה ברורה במקום שגיאה טכנית. זה מגביר את האמינות ב-40% ומונע אובדן הזמנות.
בדיקות ואימות
בדיקת handler מותאם אישית כוללת בדיקות יחידה ללוגיקת החישוב, בדיקות אינטגרציה עם סביבת בדיקה של API של חברת השילוח, ובדיקות קבלה של משתמשים על הזמנות אמיתיות במצב ארגז חול. אנו מוודאים חישובים נכונים עבור משקלים, נפחים ומסלולי משלוח שונים, מקרי קצה (הזמנה של 0.5 ק"ג, מטען כבד במיוחד), והתנהגות נכונה בזמן כשל ב-API. בדיקות אוטומטיות רצות בכל עדכון קוד. תוצאות הבדיקות מתועדות, מה שמבטיח ביטחון באיכות לפני פריסה לייצור.
לוחות זמנים
- handler בסיסי (חישוב מקומי): 2–3 ימים
-
- אינטגרציה עם API של חברת שילוח חיצונית: +2–3 ימים
-
- יצירת הזמנה + מעקב: +2–3 ימים
-
- מטריצת תעריפים / לוגיקה מורכבת: +2–4 ימים
עלות הפיתוח מוערכת באופן אישי לפי מורכבות. החיסכון בלוגיסטיקה לאחר היישום יכול להגיע ל-35%. ה-handler שלנו מהיר פי 3 ממודולים סטנדרטיים בעבודה עם APIs חיצוניים הודות לזמני קצובה אופטימליים וקאשינג. כדי להעריך את הפרויקט שלך, צור איתנו קשר. קבל ייעוץ ממהנדס.







