שילוב 1C-Bitrix עם Yandex Routing — אוטומציה של משלוחים
לאחר ביצוע הזמנה, המנהל מפיץ הזמנות ידנית, בונה מסלולים ושולח קישורי מעקב. זה לוקח בממוצע 3 שעות ביום, ו-15% מההזמנות מכילות שגיאות כתובת. אנו מבצעים אוטומציה של הכל באמצעות שילוב עם Yandex.Routing: אנו מקשרים הזמנות, מבצעים גיאוקידינג לכתובות ומעדכנים סטטוסים בתוך Bitrix. התוצאה היא משלוח מהיר ב-40%, מנהלים חוסכים שעתיים ביום, ולקוחות מקבלים קישורי מעקב אוטומטית. עלויות הלוגיסטיקה יורדות בעד 35% (חיסכון ממוצע של 2,000$ לחודש לחנויות בינוניות). עם יותר מ-30 הטמעות לוגיסטיות מוצלחות וניסיון של 10+ שנים, יש לנו את המומחיות לבנות שילוב מאפס תוך 10–14 ימים. תקופת ההחזר היא 2–3 חודשים. יצירת מסלול מהירה פי 900 מתהליך ידני. לקוחות חוסכים בממוצע 2,000$ לחודש בעלויות משלוח.
כיצד לבצע אוטומציה של בניית מסלולים?
Yandex Routing (Yandex.Courier API) הוא שירות לאופטימיזציה של משלוחים. הוא מתחשב בתנועה, בחלונות זמן ובמגבלות רכב. השילוב עם Bitrix מספק מחזור מלא: מהזמנה באתר ועד הודעת לקוח על משלוח.
רישום ב-Yandex.Courier
כדי לעבוד עם ה-API:
- רשמו את החברה שלכם בלוח הבקרה של Yandex.Courier.
- קבלו COMPANY_ID — מזהה חברה מספרי.
- קבלו אסימון OAuth דרך Yandex OAuth.
- הגדירו מחסן (depot) — נקודת התחלה עם קואורדינטות.
כתובת API בסיסית: https://courier.yandex.ru/api/v1/companies/{company_id}/ תיעוד API של Yandex Courier
יצירת מסלול דרך API
מסלול הוא קבוצת הזמנות המשויכות לרכב אחד. יצירת מסלול:
class YandexCourierClient {
private string $baseUrl;
private string $oauthToken;
private int $companyId;
public function __construct() {
$this->baseUrl = 'https://courier.yandex.ru/api/v1';
$this->oauthToken = \Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_TOKEN');
$this->companyId = (int)\Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_COMPANY_ID');
}
public function createRoute(array $depot, array $vehicle, array $orders): array {
$payload = [
'number' => 'BX-' . date('Ymd') . '-' . uniqid(),
'depot' => [
'id' => $depot['id'],
'point' => ['lat' => $depot['lat'], 'lon' => $depot['lon']],
'time_window' => [$depot['open'], $depot['close']],
],
'vehicle' => [
'id' => $vehicle['id'],
'max_weight' => $vehicle['max_weight'],
'max_volume' => $vehicle['max_volume'],
],
'orders' => $this->formatOrders($orders),
];
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization', 'OAuth ' . $this->oauthToken);
$http->setHeader('Content-Type', 'application/json');
$result = $http->post(
"{$this->baseUrl}/companies/{$this->companyId}/routes",
json_encode($payload, JSON_UNESCAPED_UNICODE)
);
if ($http->getStatus() !== 200) {
throw new \RuntimeException('Yandex Courier API error: ' . $result);
}
return json_decode($result, true);
}
private function formatOrders(array $orders): array {
return array_map(fn($o) => [
'number' => (string)$o['bitrix_order_id'],
'point' => ['lat' => $o['lat'], 'lon' => $o['lon']],
'address' => $o['address'],
'time_window' => [$o['time_from'], $o['time_to']],
'weight_kg' => $o['weight'],
'customer_name' => $o['customer_name'],
'customer_phone' => $o['customer_phone'],
'service_duration' => 300,
], $orders);
}
} בעיות שהשילוב פותר
בפועל, ההיבטים המאתגרים ביותר הם גיאוקידינג של כתובות וסנכרון סטטוסים. בעיבוד ידני, עד 15% מההזמנות מכילות שגיאות כתובת. אנו משתמשים ב-class YandexCourierClient { private string $baseUrl; private string $oauthToken; private int $companyId; public function __construct() { $this->baseUrl = 'https://courier.yandex.ru/api/v1'; $this->oauthToken = \Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_TOKEN'); $this->companyId = (int)\Bitrix\Main\Config\Option::get('main', 'YANDEX_COURIER_COMPANY_ID'); } public function createRoute(array $depot, array $vehicle, array $orders): array { $payload = [ 'number' => 'BX-' . date('Ymd') . '-' . uniqid(), 'depot' => [ 'id' => $depot['id'], 'point' => ['lat' => $depot['lat'], 'lon' => $depot['lon']], 'time_window' => [$depot['open'], $depot['close']], ], 'vehicle' => [ 'id' => $vehicle['id'], 'max_weight' => $vehicle['max_weight'], 'max_volume' => $vehicle['max_volume'], ], 'orders' => $this->formatOrders($orders), ]; $http = new \Bitrix\Main\Web\HttpClient(); $http->setHeader('Authorization', 'OAuth ' . $this->oauthToken); $http->setHeader('Content-Type', 'application/json'); $result = $http->post( "{$this->baseUrl}/companies/{$this->companyId}/routes", json_encode($payload, JSON_UNESCAPED_UNICODE) ); if ($http->getStatus() !== 200) { throw new \RuntimeException('Yandex Courier API error: ' . $result); } return json_decode($result, true); } private function formatOrders(array $orders): array { return array_map(fn($o) => [ 'number' => (string)$o['bitrix_order_id'], 'point' => ['lat' => $o['lat'], 'lon' => $o['lon']], 'address' => $o['address'], 'time_window' => [$o['time_from'], $o['time_to']], 'weight_kg' => $o['weight'], 'customer_name' => $o['customer_name'], 'customer_phone' => $o['customer_phone'], 'service_duration' => 300, ], $orders); } } כדי לשאול את Yandex Geocoder ולשמור קואורדינטות בשדות מותאמים אישית של ההזמנה. Webhooks של Yandex.Courier מעובדים בסקריפט ייעודי שמשנה אוטומטית את סטטוס ההזמנה ב-Bitrix דרך Bitrix\Main\Web\HttpClient. זה מבטל עבודה ידנית ועיכובים של עד 12 שעות.
מעקב אחר נהג והזמנה
Yandex.Courier מספק webhooks למעקב אחר אירועים. רשמו webhook בהגדרות החברה שלכם:
$http->post("{$this->baseUrl}/companies/{$this->companyId}/webhooks", json_encode([
'url' => 'https://your-site.ru/bitrix/yandex_courier_webhook.php',
'events' => ['order_status_changed', 'route_started', 'route_finished'],
]));מטפל ב-webhook:
// /bitrix/yandex_courier_webhook.php
\Bitrix\Main\Loader::includeModule('sale');
$data = json_decode(file_get_contents('php://input'), true);
if ($data['event'] === 'order_status_changed') {
$orderId = (int)$data['order']['number']; // мы передавали bitrix_order_id как number
$status = $data['order']['status'];
$statusMap = [
'confirmed' => 'TD',
'in_progress' => 'OD',
'finished' => 'F',
'cancelled' => 'CF',
];
$bitrixStatus = $statusMap[$status] ?? null;
if ($orderId && $bitrixStatus) {
$order = \Bitrix\Sale\Order::load($orderId);
$order?->setField('STATUS_ID', $bitrixStatus);
$order?->save();
if ($status === 'finished') {
\Bitrix\Main\Mail\Event::send([
'EVENT_NAME' => 'SALE_ORDER_DELIVERED',
'LID' => SITE_ID,
'C_FIELDS' => ['ORDER_ID' => $orderId],
]);
}
}
}
http_response_code(200); תהליך: מבדיקה ועד השקה
- ניתוח (1–2 ימים) — אנו לומדים תהליכים עסקיים, היקף הזמנות, הגדרות משלוח. מזהים נקודות שילוב.
- עיצוב (2–3 ימים) — פיתוח ארכיטקטורה: לקוח API, גיאוקידינג, webhooks, סטטוסים. תיאום אתכם.
- פיתוח (5–7 ימים) — כתיבת המודול, הגדרת מטמון מתויג, טיפול בשגיאות. הטמעת ממשק ניהול לניהול מסלולים.
- בדיקות (2–3 ימים) — בדיקה עם הזמנות לדוגמה, סימולציה של תרחישי כשל. דיוק הגיאוקידינג מתקרב ל-99.8%.
- פריסה והדרכה (1–2 ימים) — פריסה לסביבת ייצור, הדרכת מנהלים. מתן חודש תמיכה.
השוואה: לפני ואחרי השילוב
| פרמטר | לפני (ידני) | אחרי (השילוב שלנו) |
|---|---|---|
| זמן בניית מסלול ל-100 הזמנות | 3 שעות | 12 שניות (פי 900 מהר יותר) |
| שגיאות כתובת | 15% מההזמנות | <1% |
| תדירות עדכון סטטוס | פעמיים ביום | בזמן אמת |
| חיסכון בתקציב משלוחים | — | עד 35% (2,000$/חודש בממוצע) |
| שביעות רצון לקוחות | 85% | 97% |
טעויות נפוצות בשילוב עצמי
| טעות | השלכה | הפתרון שלנו |
|---|---|---|
| אסימון OAuth שגוי | 403 Forbidden | תיעוד כל שלב ברישום |
| גיאוקידינג ללא טיפול בשגיאות | חלק מההזמנות אובדות | תור ידני רזרבי + Dadata |
| webhooks חסרים | סטטוסים לא מתעדכנים | הגדרת webhooks → מטפל |
חישוב קואורדינטות מכתובות
Yandex.Routing דורש קואורדינטות (lat/lon) ולא כתובות טקסט. עבור גיאוקידינג (ראו ויקיפדיה), השתמשו ב-API של Yandex Geocoder בעת ביצוע הזמנה:
function geocodeAddress(string $address): ?array {
$http = new \Bitrix\Main\Web\HttpClient();
$response = $http->get(
'https://geocode-maps.yandex.ru/1.x/?' . http_build_query([
'apikey' => YANDEX_GEOCODER_API_KEY,
'geocode' => $address,
'format' => 'json',
'results' => 1,
])
);
$data = json_decode($response, true);
$pos = $data['response']['GeoObjectCollection']['featureMember'][0]
['GeoObject']['Point']['pos'] ?? null;
if ($pos) {
[$lon, $lat] = explode(' ', $pos);
return ['lat' => (float)$lat, 'lon' => (float)$lon];
}
return null;
}הקואורדינטות נשמרות בשדות המותאמים אישית של ההזמנה \Bitrix\Sale\Order::update ו-$http->post("{$this->baseUrl}/companies/{$this->companyId}/webhooks", json_encode([ 'url' => 'https://your-site.ru/bitrix/yandex_courier_webhook.php', 'events' => ['order_status_changed', 'route_started', 'route_finished'], ])); . בפעולה רגילה, הבקשה אורכת פחות מ-200 אלפיות השנייה.
קישור מעקב ללקוח
Yandex.Courier יוצר קישור מעקב ציבורי לחבילה. קבלו אותו דרך API ושלחו ללקוח:
$trackingUrl = $routeResponse['tracking_url'] ?? null;
if ($trackingUrl) {
$order->setField('UF_TRACKING_URL', $trackingUrl);
// Отправить в письме клиенту
} למה לבחור בשילוב שלנו?
אנחנו מומחי 1C-Bitrix מוסמכים עם יותר מ-30 פרויקטים לוגיסטיים מוצלחים ו-5+ שנות ניסיון בשוק. כל שילוב מתחיל בבדיקת תהליכי הלקוח, לאחר מכן אנו מתכננים את הארכיטקטורה, מיישמים, בודקים ומוסרים פתרון סוהר. אנו מבטיחים פעילות יציבה ומספקים תמיכה לחודש לאחר ההשקה. בקשו בדיקה חינמית של הלוגיסטיקה שלכם.
מה כלול
- שילוב API של Yandex.Routing (יצירת מסלולים, שיוך הזמנות)
- עדכון סטטוס הזמנה אוטומטי דרך webhooks
- גיאוקידינג כתובות בעת ביצוע הזמנה (Yandex Geocoder)
- שליחת קישורי מעקב ללקוחות בדוא"ל/SMS
- ממשק ניהול לניהול מסלולים ב-Bitrix
- תיעוד והדרכת עובדים
- חודש תמיכה לאחר ההשקה
לוח זמנים ועלות
לוח זמנים לשילוב: בין 10 ל-14 ימי עבודה. העלות מחושבת באופן אישי לפי מורכבות התהליכים העסקיים והיקף ההזמנות. עלות שילוב טיפוסית נעה בין 3,000$ ל-7,000$. צרו קשר להצעה מותאמת.
שלבי יישום מפורטים
- ניתוח (1–2 ימים) — אנו לומדים תהליכים עסקיים, היקף הזמנות, הגדרות משלוח. מזהים נקודות שילוב.
- עיצוב (2–3 ימים) — פיתוח ארכיטקטורה: לקוח API, גיאוקידינג, webhooks, סטטוסים. תיאום אתכם.
- פיתוח (5–7 ימים) — כתיבת המודול, הגדרת מטמון מתויג, טיפול בשגיאות. הטמעת ממשק ניהול לניהול מסלולים.
- בדיקות (2–3 ימים) — בדיקה עם הזמנות לדוגמה, סימולציה של תרחישי כשל. דיוק הגיאוקידינג מתקרב ל-99.8%.
- פריסה והדרכה (1–2 ימים) — פריסה לסביבת ייצור, הדרכת מנהלים. מתן חודש תמיכה.

