הגדרת מעקב משלוחים ב-1C-Bitrix
מעקב משלוחים נראה פשוט עד שעושים אותו נכון. "הצגת סטטוס הזמנה" פירושה: קבלת סטטוס בזמן אמת מחברת השילוח, שמירת היסטוריה, עדכון לקוחות על שינויים והצגה נכונה בחשבון האישי. זה דורש ארכיטקטורה מוצקה, סוכן עמיד לתקלות ואינטגרציה עם מגוון APIs. כמומחי 1C-Bitrix מוסמכים, אנו מספקים פתרון מפתח מוכח. בדיקת סטטוס ידנית היא יקרה: מפעיל משקיע בממוצע 5 דקות לכל הזמנה, ועם 500 הזמנות בחודש, מדובר ב-40–60 שעות עבודה. אוטומציה של מעקב יעילה פי 5 ומחזירה את ההשקעה תוך מספר חודשים.
למה בדיקת סטטוס ידנית אינה יעילה
לכל חברת שילוח יש פורמט API משלה, מגבלות תדירות בקשות ושיטות אימות משלה. לדוגמה, CDEK משתמשת ב-OAuth tokens ומחזירה סטטוס מפורט עם 30+ קודים, בעוד הדואר הרוסי דורש מפתח גישה ועובד על SOAP. אנו מיישמים שכבת הפשטה: TrackerInterface אחיד עם trackers ספציפיים שנכתבים עבור כל חברת שילוח. זה מפשט הוספת חברות שילוח חדשות והחלפת ישנות. מעקב אוטומטי מפחית את עומס התמיכה פי 5 בהשוואה לבדיקה ידנית — מאומת בפרויקטים שבהם יישמנו זאת.
בעיות שמעקב פותר
נקודות כאב אופייניות של חנות מקוונת: לקוחות מתקשרים ושואלים "איפה ההזמנה שלי?", מפעילים מבזבזים שעות בבדיקת סטטוסים ידנית, וחבילות שאבדו מתגלות מאוחר מדי. מעקב אוטומטי מטפל בבעיות אלה:
- עומס תמיכה מופחת ב-60–70% — לקוחות רואים סטטוסים בעצמם.
- זיהוי מוקדם של תקלות — אם הסטטוס לא עודכן במשך N ימים, המערכת שולחת התראה.
- נאמנות מוגברת — שקיפות התהליך מאיצה החלטות רכישה חוזרת (הזמנות חוזרות גדלות ב-15–20% לפי נתוני הפרויקטים שלנו).
למה מעקב אוטומטי משתלם יותר מידני
אוטומציה מחזירה את ההשקעה דרך הפחתת עלויות תמיכה ופחות ביטולי הזמנות עקב חוסר ודאות. בפרויקט אחד, לאחר היישום, פניות תמיכה הקשורות למשלוח ירדו ב-70%, ורכישות חוזרות גדלו ב-15%. בנוסף, המערכת מזהה אוטומטית עיכובים במשלוח — ניתן להגיב במהירות. השוו: בדיקה ידנית של 500 הזמנות לוקחת ~40 שעות בחודש, בעוד סוכן אוטומטי לוקח 0.5 שעות על השרת.
איך אנחנו עושים זאת: טכנולוגיות ודוגמת יישום
אנו משתמשים במנגנוני Bitrix סטנדרטיים: סוכנים, ORM, infoblocks v2.0. לאחסון היסטוריה, אנו יוצרים טבלת custom_tracking_history (HL-block או טבלה מותאמת אישית דרך ORM). הסוכן בודק APIs של חברות השילוח עבור הזמנות בסטטוסים פעילים (N, P, Q). דוגמת מבנה בסיסי:
// Таблица истории трекинга (миграция)
class TrackingHistoryTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string
{
return 'custom_tracking_history';
}
public static function getMap(): array
{
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'),
new \Bitrix\Main\ORM\Fields\StringField('CARRIER'), // sdek, boxberry, etc.
new \Bitrix\Main\ORM\Fields\StringField('TRACK_NUMBER'),
new \Bitrix\Main\ORM\Fields\StringField('STATUS_CODE'),
new \Bitrix\Main\ORM\Fields\StringField('STATUS_TEXT'),
new \Bitrix\Main\ORM\Fields\StringField('LOCATION'), // текущее местонахождение
new \Bitrix\Main\ORM\Fields\DatetimeField('STATUS_DATE'),
new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
];
}
}הסוכן בודק הזמנות במחזוריות, ובשינוי סטטוס שומר רשומה ושולח הודעה. קוד הסוכן:
class DeliveryTrackingAgent {
public static function run(): string {
// Выбираем заказы с трекинг-номерами в активных статусах
$orders = \Bitrix\Sale\Order::getList([
'filter' => [
'!PROPERTY_TRACK_NUMBER' => false,
'STATUS_ID' => ['N', 'P', 'Q'], // не закрыты
],
'select' => ['ID', 'PROPERTY_TRACK_NUMBER', 'PROPERTY_CARRIER_CODE'],
]);
$carriers = [
'sdek' => new SdekTracker(),
'boxberry' => new BoxberryTracker(),
'pochta' => new PochtaTracker(),
];
while ($order = $orders->fetch()) {
$carrier = $carriers[$order['PROPERTY_CARRIER_CODE_VALUE']] ?? null;
if (!$carrier) continue;
try {
$status = $carrier->getStatus($order['PROPERTY_TRACK_NUMBER_VALUE']);
self::saveStatus($order['ID'], $status);
} catch (\Throwable $e) {
// логируем, не падаем
\Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), 'tracking', '/local/logs/tracking.log');
}
}
return __CLASS__ . '::run();';
}
private static function saveStatus(int $orderId, array $status): void {
// Проверяем, изменился ли статус
$last = TrackingHistoryTable::getRow([
'filter' => ['ORDER_ID' => $orderId],
'order' => ['STATUS_DATE' => 'DESC'],
'select' => ['STATUS_CODE'],
]);
if ($last && $last['STATUS_CODE'] === $status['code']) return; // не изменился
TrackingHistoryTable::add([
'ORDER_ID' => $orderId,
'STATUS_CODE' => $status['code'],
'STATUS_TEXT' => $status['text'],
'LOCATION' => $status['location'] ?? '',
'STATUS_DATE' => new \Bitrix\Main\Type\DateTime($status['date']),
'CREATED_AT' => new \Bitrix\Main\Type\DateTime(),
]);
// Отправить уведомление при смене статуса
self::notifyCustomer($orderId, $status);
}
} דוגמת הודעה (תבנית דוא"ל)
// В методе notifyCustomer
$event = new \Bitrix\Main\Mail\Event(array(
'EVENT_NAME' => 'TRACKING_STATUS_CHANGED',
'LID' => SITE_ID,
'C_FIELDS' => array(
'ORDER_ID' => $orderId,
'STATUS_TEXT' => $status['text'],
'TRACK_NUMBER' => $trackNumber,
),
));
$event->send();
דף מעקב בחשבון האישי
להצגת היסטוריה בחשבון האישי, אנו משתמשים ברכיב ששולף נתונים מ-// Таблица истории трекинга (миграция) class TrackingHistoryTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'custom_tracking_history'; } public static function getMap(): array { return [ new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'), new \Bitrix\Main\ORM\Fields\StringField('CARRIER'), // sdek, boxberry, etc. new \Bitrix\Main\ORM\Fields\StringField('TRACK_NUMBER'), new \Bitrix\Main\ORM\Fields\StringField('STATUS_CODE'), new \Bitrix\Main\ORM\Fields\StringField('STATUS_TEXT'), new \Bitrix\Main\ORM\Fields\StringField('LOCATION'), // текущее местонахождение new \Bitrix\Main\ORM\Fields\DatetimeField('STATUS_DATE'), new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'), ]; } } . דוגמת שליפת נתונים:
// Компонент отображения истории трекинга
$orderId = (int)$_REQUEST['ORDER_ID'];
$order = \Bitrix\Sale\Order::load($orderId);
if ($order && $order->getUserId() === $USER->GetID()) {
$history = TrackingHistoryTable::getList([
'filter' => ['ORDER_ID' => $orderId],
'order' => ['STATUS_DATE' => 'ASC'],
'select' => ['STATUS_CODE', 'STATUS_TEXT', 'LOCATION', 'STATUS_DATE'],
])->fetchAll();
// Трекинговый номер для ссылки на сайт перевозчика
$trackNumber = $order->getPropertyCollection()
->getItemByOrderPropertyCode('TRACK_NUMBER')
?->getValue();
} | חברת שילוח | קישור מעקב |
|---|---|
| CDEK | CDEK |
| Boxberry | Boxberry |
| הדואר הרוסי | הדואר הרוסי |
| משלוחי Yandex | דרך החשבון האישי באמצעות class DeliveryTrackingAgent { public static function run(): string { // Выбираем заказы с трекинг-номерами в активных статусах $orders = \Bitrix\Sale\Order::getList([ 'filter' => [ '!PROPERTY_TRACK_NUMBER' => false, 'STATUS_ID' => ['N', 'P', 'Q'], // не закрыты ], 'select' => ['ID', 'PROPERTY_TRACK_NUMBER', 'PROPERTY_CARRIER_CODE'], ]); $carriers = [ 'sdek' => new SdekTracker(), 'boxberry' => new BoxberryTracker(), 'pochta' => new PochtaTracker(), ]; while ($order = $orders->fetch()) { $carrier = $carriers[$order['PROPERTY_CARRIER_CODE_VALUE']] ?? null; if (!$carrier) continue; try { $status = $carrier->getStatus($order['PROPERTY_TRACK_NUMBER_VALUE']); self::saveStatus($order['ID'], $status); } catch (\Throwable $e) { // логируем, не падаем \Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), 'tracking', '/local/logs/tracking.log'); } } return __CLASS__ . '::run();'; } private static function saveStatus(int $orderId, array $status): void { // Проверяем, изменился ли статус $last = TrackingHistoryTable::getRow([ 'filter' => ['ORDER_ID' => $orderId], 'order' => ['STATUS_DATE' => 'DESC'], 'select' => ['STATUS_CODE'], ]); if ($last && $last['STATUS_CODE'] === $status['code']) return; // не изменился TrackingHistoryTable::add([ 'ORDER_ID' => $orderId, 'STATUS_CODE' => $status['code'], 'STATUS_TEXT' => $status['text'], 'LOCATION' => $status['location'] ?? '', 'STATUS_DATE' => new \Bitrix\Main\Type\DateTime($status['date']), 'CREATED_AT' => new \Bitrix\Main\Type\DateTime(), ]); // Отправить уведомление при смене статуса self::notifyCustomer($orderId, $status); } } |
מה כלול בעבודת המפתח
- ניתוח הזמנות קיימות וחברות שילוח בשימוש.
- פיתוח טבלת היסטוריית מעקב (HL-block או טבלה מותאמת אישית).
- כתיבת מחלקות tracker עבור כל חברת שילוח.
- הגדרת סוכן עם רישום לוגים וטיפול בשגיאות.
- פיתוח דף היסטוריה בחשבון האישי של הלקוח.
- התראות דוא"ל על שינוי סטטוס (תבניות דוא"ל).
- תיעוד והוראות להוספת חברות שילוח חדשות.
- מסירת גישת שרת וקוד, והדרכת המפתח שלך.
- תמיכה טכנית לחודש אחד לאחר המסירה.
לוחות זמנים
| שלב | משך |
|---|---|
| סוכן מעקב + היסטוריית סטטוסים | 2–3 ימים |
| + דף מעקב בחשבון האישי | +יום אחד |
| + התראות דוא"ל על שינוי סטטוס | +יום אחד |
רוצים ייעוץ לפרויקט שלכם? צרו קשר — נעריך את היקף העבודה ונציע פתרון אופטימלי. יש לנו ניסיון ביותר מ-20 פרויקטי מעקב, עם אחריות איכות ומסירה בזמן. כתבו לנו ונחזור עם הערכת עלות.

