אופטימיזציה של מסלולי משלוחים ב-1C-Bitrix

תכנון ידני של מסלולי משלוחים לוקח זמן ומוביל לעיכובים, הפוגעים במוניטין העסקי. אנחנו מפתחים אינטגרציה של 1C-Bitrix עם שירותי ניתוב, ומבצעים אוטומציה של בניית מסלולים אופטימליים תוך התחשבות בפקקים ובחלונות זמן. הצוות שלנו מספק את הפרויקט במפתח מלא—מבדיקת היתכנות ועד הטמעה ותמיכה שוטפת, ומבטיח פתרון אמין שמתאים לגידול בכמות ההזמנות.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
אופטימיזציה של מסלולי משלוחים ב-1C-Bitrix
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

תארו לעצמכם: שירות שליחויות מעבד 20 הזמנות ביום. המתאם מבלה חצי שעה בתכנון המסלול, אבל חצי מהלקוחות עדיין לא מרוצים מהעיכובים. מה הבעיה? בדרך כלל מדובר בתכנון ידני וחוסר בנתונים מדויקים על תנועה וחלונות זמן. שילוב 1C-Bitrix עם שירותי ניתוב—Yandex.Routing או OR-Tools—פותר את זה ב-5 שניות. קילומטראז' מופחת ב-33%, ושיעור המשלוחים בזמן עולה מ-60% ל-95%. זה לא רק חיסכון בדלק—זה עמידה בהתחייבויות ללקוחות והפחתת עלויות תפעול.

כיצד האינטגרציה פותרת את בעיית הסוכן הנוסע

המהות פשוטה: Bitrix אוסף נתוני הזמנות—כתובות, חלונות זמן, משקל. השירות החיצוני פותר את בעיית הסוכן הנוסע (NP-hard)—בונה את סדר הביקור האופטימלי. התוצאה מועברת חזרה כגיליונות מסלול. אנו הופכים את החיבור הזה לשקוף ואמין. ביצועים: 20 נקודות מעובדות ב-5 שניות, בעוד תכנון ידני לוקח 30 דקות—הפרש של פי 360.

מידע נוסף על בעיית הסוכן הנוסעבעיית הסוכן הנוסע (TSP) היא בעיה קלאסית מסוג NP-hard של מציאת המסלול הקצר ביותר שמבקר בכל הנקודות הנתונות בדיוק פעם אחת. בהקשר של משלוחים, היא נפתרת עם חלונות זמן וכושר רכב, מה שהופך אותה למורכבת עוד יותר (VRPTW). אלגוריתמים מודרניים כמו אופטימיזציית מושבות נמלים או תכנות ליניארי מוצאים פתרונות כמעט אופטימליים תוך שניות.

שלב 1: הכנת נתונים

כדי לבנות מסלול, יש צורך ברשימת כתובות עם קואורדינטות וחלונות זמן. הכתובות נלקחות ממאפייני ההזמנה:

$deliveries = \Bitrix\Sale\OrderTable::getList([
    'filter' => [
        'STATUS_ID' => 'TD', // статус "к доставке сегодня"
        '>=DATE_STATUS' => new \Bitrix\Main\Type\Date(),
    ],
    'select' => ['ID'],
])->fetchAll();

$points = [];
foreach ($deliveries as $row) {
    $order = \Bitrix\Sale\Order::load($row['ID']);
    $props = $order->getPropertyCollection();
    $points[] = [
        'order_id' => $row['ID'],
        'address' => $props->getItemByOrderPropertyCode('ADDRESS')?->getValue(),
        'lat' => $props->getItemByOrderPropertyCode('LAT')?->getValue(),
        'lon' => $props->getItemByOrderPropertyCode('LON')?->getValue(),
        'time_from' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_FROM')?->getValue(),
        'time_to' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_TO')?->getValue(),
        'weight' => $this->getOrderWeight($order),
    ];
}

יש לקבל קואורדינטות (LAT/LON) במהלך ביצוע ההזמנה—באמצעות Yandex או Google geocoding API מהכתובת שהוזנה. שמרו אותן במאפייני המשתמש של ההזמנה.

מדוע גיאוקידינג מדויק חיוני למסלולים אופטימליים

ללא קואורדינטות, שירות האופטימיזציה לא יודע היכן בדיוק נמצאת הנקודה. גיאוקידינג ממיר כתובת טקסטואלית לקווי רוחב/אורך. אנו מיישמים אותו ישירות בטופס ההזמנה—בקשת AJAX לגיאוקודר כאשר שדה הכתובת מתמלא. כך זה נראה:

fetch(`https://geocode-maps.yandex.ru/1.x/?apikey=KEY&format=json&geocode=${encodeURIComponent(address)}`)
  .then(r => r.json())
  .then(data => {
    const pos = data.response.GeoObjectCollection.featureMember[0]?.GeoObject?.Point?.pos;
    if (pos) {
      const [lon, lat] = pos.split(' ');
      document.getElementById('lat-field').value = lat;
      document.getElementById('lon-field').value = lon;
    }
  });

הקואורדינטות נשמרות בשקט בשדות נסתרים בטופס ומגיעות למאפייני ההזמנה. הנהג אף פעם לא יודע—הכל אוטומטי.

שלב 2: אינטגרציה עם שירות האופטימיזציה

לאחר איסוף הנקודות, שלחו אותן ל-API של אופטימיזציית המסלולים. דוגמה עם Yandex.Routing:

$httpClient = new \Bitrix\Main\Web\HttpClient();
$response = $httpClient->post(
    'https://courier.yandex.ru/api/v1/companies/{company_id}/routes',
    json_encode(['vehicles' => $vehicles, 'orders' => $points]),
    ['Authorization' => 'Bearer ' . YANDEX_COURIER_API_KEY]
);
$routes = json_decode($response, true);

המסלולים המוחזרים מכילים רשימה מסודרת של נקודות עבור כל שליח. שמרו אותן בטבלת $deliveries = \Bitrix\Sale\OrderTable::getList([ 'filter' => [ 'STATUS_ID' => 'TD', // статус "к доставке сегодня" '>=DATE_STATUS' => new \Bitrix\Main\Type\Date(), ], 'select' => ['ID'], ])->fetchAll(); $points = []; foreach ($deliveries as $row) { $order = \Bitrix\Sale\Order::load($row['ID']); $props = $order->getPropertyCollection(); $points[] = [ 'order_id' => $row['ID'], 'address' => $props->getItemByOrderPropertyCode('ADDRESS')?->getValue(), 'lat' => $props->getItemByOrderPropertyCode('LAT')?->getValue(), 'lon' => $props->getItemByOrderPropertyCode('LON')?->getValue(), 'time_from' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_FROM')?->getValue(), 'time_to' => $props->getItemByOrderPropertyCode('DELIVERY_TIME_TO')?->getValue(), 'weight' => $this->getOrderWeight($order), ]; } והקצו לשליחים דרך משימות CRM או אפליקציה ניידת.

שלב 3: הצגת המסלול לשליח

צרו דף נייד או שלחו לשליח קישור למסלול ב-Google Maps או Yandex.Maps עם נקודות ציון. פורמט עבור Google Maps:

https://www.google.com/maps/dir/DEPOT_LAT,DEPOT_LON/STOP1_LAT,STOP1_LON/STOP2_LAT,STOP2_LON/... 

צרו קישור זה מנתוני fetch(`https://geocode-maps.yandex.ru/1.x/?apikey=KEY&format=json&geocode=${encodeURIComponent(address)}`) .then(r => r.json()) .then(data => { const pos = data.response.GeoObjectCollection.featureMember[0]?.GeoObject?.Point?.pos; if (pos) { const [lon, lat] = pos.split(' '); document.getElementById('lat-field').value = lat; document.getElementById('lon-field').value = lon; } }); ושלחו אותו לשליח באמצעות SMS או דוא"ל.

מה אופטימיזציית מסלולים משיגה

פרמטר משלוח ידני ניתוב אופטימלי
קילומטראז' ממוצע ל-20 נקודות 180 ק"מ 120 ק"מ (33% פחות)
משלוחים בזמן 60% 95%
עלויות דלק 100% 70%
זמן תכנון מסלול 30 דקות 5 שניות

ניתוב אופטימלי מהיר פי 30 מתכנון ידני ומפחית קילומטראז' ב-33%. כל קילומטר שנחסך מפחית משמעותית את צריכת הדלק, וביחד עם חיסכון בזמן שליחים ומתאמים, תקציב המשלוחים יכול לרדת ב-30–40%.

טעויות הגדרה נפוצות

טעות השלכה פתרון
כתובת ללא גיאוקידינג השירות לא יכול לבנות מסלול הוספת בקשת AJAX לגיאוקודר
חלונות זמן לא מוגדרים השליח נוסע בכל שעה יצירת מאפיינים DELIVERY_TIME_FROM/DELIVERY_TIME_TO
התעלמות ממשקל עומס יתר על השליח כלילת משקל בחישוב המסלול
אין סוכן איסוף הנתונים מתיישנים הגדרת סוכן דרך Cron או Bitrix agents

כיצד אנו הופכים משלוחים לאוטומטיים במפתח מלא

אנו מבצעים את מחזור העבודה המלא:

  1. יצירת מאפייני משתמש להזמנה $httpClient = new \Bitrix\Main\Web\HttpClient(); $response = $httpClient->post( 'https://courier.yandex.ru/api/v1/companies/{company_id}/routes', json_encode(['vehicles' => $vehicles, 'orders' => $points]), ['Authorization' => 'Bearer ' . YANDEX_COURIER_API_KEY] ); $routes = json_decode($response, true); , bl_courier_routes, https://www.google.com/maps/dir/DEPOT_LAT,DEPOT_LON/STOP1_LAT,STOP1_LON/STOP2_LAT,STOP2_LON/... , bl_courier_routes.
  2. הטמעת גיאוקידינג AJAX דרך Yandex או Google.
  3. הגדרת סוכן לאיסוף נקודות וקריאה ל-API של האופטימיזציה.
  4. יצירת טבלת LAT לאחסון מסלולים.
  5. יצירת קישורי מפה ושליחתם לשליחים.
  6. הדרכת מתאמים ושליחים.
  7. מתן קוד מקור ותיעוד לשינויים.

הלקוחות שלנו חוסכים בממוצע $270–390 בחודש על דלק ומשכורות מתאמים. מומחים מוסמכים, קוד שקוף, תמיכה לאחר המסירה. צרו קשר לבדיקת מערכת המשלוחים—נעריך תקציב ולוחות זמנים תוך יום אחד. הזמינו הגדרה במפתח מלא וקבלו ייעוץ למשימה שלכם.