אתר לוגיסטיקה על 1С-Битрикс: פיתוח ותכונות

לקוחות עוזבים כשהמחשבון קורס, המעקב לא מתעדכן, וההזמנה החוזרת אורכת זמן רב. אנחנו בונים אתרי אינטרנט לחברות לוגיסטיקה על 1C-Bitrix הפותרים בעיות אלו. הצוות שלנו מספק פרויקטים במפתח מלא—מארכיטקטורת נתונים ועד אינטגרציה עם 1C ופורטל B2B—תוך הבטחת ביצועים אמינים ותמיכה מתמשכת.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
אתר לוגיסטיקה על 1С-Битрикс: פיתוח ותכונות
מורכב
מ- 1 שבוע עד 3 חודשים

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

שאלות נפוצות

שולח מטען מגיע לאתר עם משימה אחת: לגלות את עלות המשלוח, לבצע הזמנה, לעקוב אחר המטען. אם המחשבון לא עובד, המעקב לא מציג סטטוס, ולמשלוח חוזר צריך למלא שוב 12 שדות—הלקוח עובר למתחרה עם אזור אישי תקין. אנו מפתחים אתרי חברות לוגיסטיקה על 1С-Битрикс, וניסיון של 10+ שנים מאפשר לנו להימנע מטעויות אלה. צרו קשר כדי לדון בארכיטקטורת הפרויקט שלכם.

ביטריקס יכול להרכיב את כל זה, אבל הארכיטקטורה חייבת להיות מותאמת לפרטי הלוגיסטיקה מהיום הראשון. אנחנו לא רק מגדירים בלוקי מידע—אנחנו מתכננים מערכת שתעמוד באלפי בקשות למחשבון, אינטגרציה עם 1С, ותספק מעקב אמין עם אזור B2B. בואו נפרק פתרונות ספציפיים.

כיצד בנוי קטלוג השירותים?

חברת לוגיסטיקה מציעה לא מוצר אחד אלא מטריצת שירותים: FTL (הובלה מלאה), LTL (הובלה חלקית), אחסון, שחרור מכס, משלוח מייל אחרון. לכל סוג יש פרמטרים משלו—מגבלות משקל, מידות, טווח טמפרטורות, גאוגרפיה.

מבנה נתונים:

  • בלוק מידע "שירותים"—סעיפים: הובלה יבשתית, ים, רכבת, אוויר, שירותי מחסן, מכס
  • בלוק Highload "סוגי הובלה"—טבלת עזר: ברזנט, מקרר, מכולה 20', מכולה 40', איזותרמי. שדות: UF_NAME, UF_CAPACITY_KG, UF_VOLUME_M3, UF_PHOTO, UF_DESCRIPTION
  • בלוק Highload "מסלולים"—זוגות עיר-עיר המקושרים לסוגי הובלה. שדות: UF_FROM_CITY, UF_TO_CITY, UF_TRANSPORT_TYPE, UF_TRANSIT_DAYS, UF_ACTIVE
  • בלוק Highload "הגבלות מטען"—משקל מקסימלי, מידות, קטגוריות אסורות לפי סוג הובלה

כל שירות בבלוק המידע מכיל:

מאפיין סוג מטרה
SERVICE_TYPE L (רשימה) FTL / LTL / אחסון / מכס / LastMile
TRANSPORT_TYPES S:Highload (מרובה) קישור לסוגי הובלה מותרים
ROUTE_DIRECTIONS S:Highload (מרובה) כיוונים זמינים
MAX_WEIGHT N משקל מטען מקסימלי, ק"ג
MAX_VOLUME N נפח מקסימלי, מ"ק
TEMPERATURE_MODE L רגיל / מקרר / מקפיא
INSURANCE_AVAILABLE L כן / לא
CUSTOMS_INCLUDED L כן / לא

לקידום אורגני (SEO), דפים כמו "[סוג הובלה] + [מסלול]" הם קריטיים: "הובלה יבשתית מוסקבה — נובוסיבירסק", "LTL מסין". דפים אלה נוצרים מבלוק המידע של השירותים ומבלוק Highload של המסלולים באמצעות רכיב מותאם אישית. כתובת ה-URL נבנית לפי התבנית /uslugi/{service-code}/{from}-{to}/, SEF מוגדר דרך CIBlockElement::GetList עם סינון לפי מאפיינים ROUTE_FROM ו-ROUTE_TO.

כיצד ליישם מחשבון עלויות משלוח?

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

ארכיטקטורת המחשבון מורכבת משלוש שכבות.

שכבה 1—צד לקוח: טופס רב-שלבי. שלב 1: מ-אל (השלמה אוטומטית של ערים דרך AJAX, נתונים מבלוק Highload "ערים" או API חיצוני—Yandex.Geocoder). שלב 2: פרמטרי מטען—משקל, נפח (א×ר×ג), מספר יחידות, סוג אריזה, מצב טמפרטורה. שלב 3: אפשרויות נוספות—ביטוח, שחרור מכס, משלוח עד הדלת. שלב 4: תוצאה—עלות, זמן, סוגי הובלה זמינים.

הטופס מיושם כרכיב React או JavaScript פשוט עם ניווט שלבי. לכל שלב יש אימות AJAX בצד השרת. השלמה אוטומטית של ערים היא נקודת קצה נפרדת /api/cities/suggest/?q=Моск, שמחפשת ב-b_hlbd_cities (בלוק Highload) דרך DataManager::getList() עם פילטר ['%UF_NAME' => $query].

שכבה 2—חישוב מרחק. התעריפים תלויים במרחק. שתי גישות:

גישה A—מטריצת מרחקים מחושבת מראש בבלוק Highload DistanceMatrix. שדות: UF_FROM_CITY_ID, UF_TO_CITY_ID, UF_DISTANCE_KM, UF_TRANSIT_HOURS. עם 500 ערים, 250K רשומות—די אפשרי. יתרון: תגובה מיידית, ללא תלות ב-API חיצוני. חיסרון: צריך חישוב מחדש בעת הוספת ערים.

גישה B—חישוב בזמן אמת דרך API חיצוני. Yandex.Routing API (router.route()) או Google Distance Matrix API. בקשה: שתי נקודות → מרחק בק"מ + זמן נסיעה. שמירה במטמון בבלוק Highload: אם זוג הערים כבר חושב—שימוש במטמון, אחרת—בקשת API + שמירה. TTL של המטמון—30 יום.

// Получение расстояния с кэшированием
class DistanceService {
    public static function getDistance(int $fromCityId, int $toCityId): array {
        // Проверяем кэш в Highload-блоке
        $cached = DistanceMatrixTable::getList([
            'filter' => [
                'UF_FROM_CITY_ID' => $fromCityId,
                'UF_TO_CITY_ID' => $toCityId,
                '>UF_CACHED_AT' => date('Y-m-d', strtotime('-30 days'))
            ]
        ])->fetch();
        if ($cached) {
            return [
                'distance_km' => $cached['UF_DISTANCE_KM'],
                'transit_hours' => $cached['UF_TRANSIT_HOURS']
            ];
        }
        // Запрос к Yandex.Routing API
        $result = YandexRoutingClient::route(
            Cities::getCoordinates($fromCityId),
            Cities::getCoordinates($toCityId)
        );
        // Сохраняем в кэш
        DistanceMatrixTable::add([
            'UF_FROM_CITY_ID' => $fromCityId,
            'UF_TO_CITY_ID' => $toCityId,
            'UF_DISTANCE_KM' => $result['distance'],
            'UF_TRANSIT_HOURS' => $result['duration'],
            'UF_CACHED_AT' => new DateTime()
        ]);
        return $result;
    }
}
פרטי יישום של שמירת מטריצת המרחקים במטמון

השמירה במטמון נעשית עם TTL של 30 יום. בעת בקשה, נבדק תאריך הרשומה. אם אין רשומה או שהיא מיושנת, מתבצעת בקשת API ל-Yandex.Routing. התוצאה נשמרת בבלוק Highload של DistanceMatrix. כדי לעדכן את כל המסלולים פעם בחודש, פועל סוכן שמחשב מחדש רשומות מיושנות.

שכבה 3—חישוב תעריף. התעריפים מאוחסנים בבלוק Highload // Получение расстояния с кэшированием class DistanceService { public static function getDistance(int $fromCityId, int $toCityId): array { // Проверяем кэш в Highload-блоке $cached = DistanceMatrixTable::getList([ 'filter' => [ 'UF_FROM_CITY_ID' => $fromCityId, 'UF_TO_CITY_ID' => $toCityId, '>UF_CACHED_AT' => date('Y-m-d', strtotime('-30 days')) ] ])->fetch(); if ($cached) { return [ 'distance_km' => $cached['UF_DISTANCE_KM'], 'transit_hours' => $cached['UF_TRANSIT_HOURS'] ]; } // Запрос к Yandex.Routing API $result = YandexRoutingClient::route( Cities::getCoordinates($fromCityId), Cities::getCoordinates($toCityId) ); // Сохраняем в кэш DistanceMatrixTable::add([ 'UF_FROM_CITY_ID' => $fromCityId, 'UF_TO_CITY_ID' => $toCityId, 'UF_DISTANCE_KM' => $result['distance'], 'UF_TRANSIT_HOURS' => $result['duration'], 'UF_CACHED_AT' => new DateTime() ]); return $result; } } עם המבנה:

שדה סוג תיאור
UF_SERVICE_TYPE רשימה FTL / LTL / אקספרס
UF_TRANSPORT_TYPE קישור סוג הובלה
UF_DISTANCE_FROM מספר תחילת טווח, ק"מ
UF_DISTANCE_TO מספר סוף טווח, ק"מ
UF_RATE_PER_KM מספר תעריף לק"מ
UF_MIN_RATE מספר עלות מינימלית
UF_WEIGHT_COEFF מספר מקדם חריגה במשקל
UF_VOLUME_COEFF מספר מקדם נפח

נוסחת חישוב ל-LTL: Tariffs. ל-FTL—פשוט יותר: תעריף קבוע לק"מ × מרחק, ללא מקדמי משקל (משאית מלאה).

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

תוצאת המחשבון מוחזרת כתגובת JSON:

{
  "variants": [
    {
      "transport": "Тент 20т",
      "service": "FTL",
      "price": 45000,
      "currency": "RUB",
      "transit_days": 3,
      "distance_km": 1800
    },
    {
      "transport": "Сборный груз",
      "service": "LTL",
      "price": 12500,
      "currency": "RUB",
      "transit_days": 7,
      "distance_km": 1800
    }
  ]
}

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

מדוע מעקב מטען קריטי לשימור לקוחות?

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

מקור נתונים—1С:TMS או 1С:לוגיסטיקה. אינטגרציה דרך תיעוד REST API: 1С שולח עדכוני סטטוס דרך max(distance_km * rate_per_km, min_rate) * weight_coeff * volume_coeff + insurance + customs_fee עם שדות { "variants": [ { "transport": "Тент 20т", "service": "FTL", "price": 45000, "currency": "RUB", "transit_days": 3, "distance_km": 1800 }, { "transport": "Сборный груз", "service": "LTL", "price": 12500, "currency": "RUB", "transit_days": 7, "distance_km": 1800 } ] } , POST /rest/logistics.shipment.updateStatus, tracking_number, status_code. ביטריקס שומר סטטוסים בבלוק Highload location.

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

עדכונים בזמן אמת—באמצעות פולינג כל 60 שניות או WebSocket אם נפח התעבורה מצדיק את המורכבות.

כיצד להקים אזור B2B לחברת לוגיסטיקה?

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

התחברות ותפקידים. חברת הלקוח נרשמת כישות משפטית. בתוך החברה—מספר משתמשים עם תפקידים שונים. יישום דרך קבוצות משתמשים של ביטריקס (timestamp) ושדות מותאמים אישית:

  • מנהל חברה—רואה את כל ההזמנות, מנהל משתמשים, מוריד מסמכים, רואה כספים
  • לוגיסטיקאי—יוצר הזמנות, עוקב אחר סטטוסים, מוריד TTN ו-CMR
  • רואה חשבון—גישה רק למסמכים: חשבוניות, קבלות, חשבוניות מס

קישור משתמש לחברה—דרך שדה מותאם אישית ShipmentStatuses ב-CGroup. בדיקת גישה—Middleware ב-UF_COMPANY_ID שבכל בקשה ל-b_user בודק את קבוצת המשתמש ו-init.php.

פונקציונליות האזור:

היסטוריית הזמנות—רשימת כל משלוחי החברה עם סינון לפי תאריך, סטטוס, כיוון. נתונים מבלוק Highload /personal/ עם שדות: UF_ORDER_NUMBER, UF_COMPANY_ID, UF_FROM_CITY, UF_TO_CITY, UF_STATUS, UF_CARGO_DESCRIPTION, UF_WEIGHT, UF_VOLUME, UF_PRICE, UF_CREATED_AT. דפדוף דרך UF_COMPANY_ID, סינון—AJAX.

ניהול מסמכים—כל הזמנה מכילה סט מסמכים: TTN, CMR, חשבונית, רשימת אריזה, פוליסת ביטוח. קבצים מאוחסנים כמאפיין מרובה מסוג "קובץ" המקושר להזמנה. הורדה—דרך בקר מותאם אישית שבודק שייכות מסמך לחברת המשתמש לפני הגשת הקובץ. אין קישורים ישירים ל-Orders—רק גישה מורשית.

// Проверка доступа к документу
class DocumentController extends Controller
{
    public function download(int $orderId, int $fileId): Response
    {
        $user = $GLOBALS['USER'];
        $order = OrdersTable::getById($orderId)->fetch();
        if ($order['UF_COMPANY_ID'] !== $user->getUfCompanyId()) {
            throw new AccessDeniedException();
        }
        $file = CFile::GetFileArray($fileId);
        return new BinaryFileResponse($file['SRC']);
    }
}

תבניות משלוח חוזר. לקוחות קבועים שולחים את אותו מטען באותם מסלולים. הלוגיסטיקאי שומר הזמנה כתבנית; בפעם הבאה—בוחר תבנית, משנה תאריך, מאשר. תבניות—בלוק Highload נפרד bitrix:system.pagenavigation עם שדות המשכפלים את מבנה ההזמנה, בתוספת UF_TEMPLATE_NAME ו-UF_COMPANY_ID.

סעיף פיננסי—יתרת התחשבנות, חשבוניות שהונפקו, היסטוריית תשלומים. נתונים מסונכרנים מ-1С דרך REST API בלוח זמנים (כל 15 דקות) או לפי אירוע.

אינטגרציה עם 1С:TMS

סנכרון הזמנות בין האתר ל-1С:TMS (או 1С:ניהול רכב) הוא דו-כיווני:

  • אתר → 1С: הזמנה חדשה מהאתר נשלחת ל-1С דרך REST API. נקודת הקצה בצד 1С מקבלת JSON עם פרמטרי הזמנה ויוצרת מסמך "בקשת הובלה"
  • 1С → אתר: שינוי סטטוס ב-1С מפעיל Webhook בביטריקס. ה-handler מעדכן את UF_STATUS בבלוק Highload של ההזמנות ושולח אימייל/SMS ללקוח

פורמט החלפה—JSON דרך HTTP REST. החלפת XML דרך CommerceML מיותרת ללוגיסטיקה—זה פורמט מסחרי, לא להובלה.

מפת כיסוי וצי רכב

מפה אינטראקטיבית—Yandex.Maps עם שכבה מותאמת אישית. סמנים של מחסנים ומרכזי חלוקה מבלוק Highload /upload/ (שדות: UF_NAME, UF_ADDRESS, UF_COORDINATES, UF_TYPE, UF_PHOTO). קווי מסלול בין מרכזים—// Проверка доступа к документу class DocumentController extends Controller { public function download(int $orderId, int $fileId): Response { $user = $GLOBALS['USER']; $order = OrdersTable::getById($orderId)->fetch(); if ($order['UF_COMPANY_ID'] !== $user->getUfCompanyId()) { throw new AccessDeniedException(); } $file = CFile::GetFileArray($fileId); return new BinaryFileResponse($file['SRC']); } } עם נתונים מבלוק Highload של המסלולים. לחיצה על מרכז—בלון עם כתובת, שעות פעילות, שירותים זמינים.

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

API לשותפים

REST API לאינטגרציה עם מערכות שותפים: משלחים בינלאומיים, מרקטפלייסים, מערכות ERP של לקוחות. נקודות קצה:

  • Warehouses—יצירת הזמנה
  • ymaps.Polyline—סטטוס הזמנה
  • bitrix:news.list—מעקב
  • POST /api/v1/orders/create—חישוב עלות

התחברות—מפתח API בכותרת X-Api-Key. מפתחות נוצרים בלוח הניהול, מקושרים לחברת השותף. הגבלת קצב—100 בקשות לדקה דרך Middleware.

שלבים ולוחות זמנים

היקף לוח זמנים
אתר כרטיס ביקור עם מחשבון, עד 10 מסלולים 4-6 שבועות
אתר תאגידי עם אזור אישי, מעקב, אינטגרציית 1С 10-16 שבועות
פלטפורמה עם API לשותפים, פורטל B2B, אוטומציה מלאה 16-24 שבועות

לוחות הזמנים אינם כוללים הגדרת החלפה בצד 1С—זה פרויקט נפרד של מפתח 1С, הפועל במקביל.

מה כלול בפיתוח

  • תיעוד: תיאור ארכיטקטורה, סכמת נתונים, הוראות עדכון תעריפים
  • גישה: קוד מקור, גישה ללוח הניהול, מאגר קוד
  • הדרכה: הדרכת מנהלים לשימוש בלוח הניהול (עד 4 שעות)
  • תמיכה: אחריות חודש אחד לאחר ההשקה

הניסיון שלנו—10+ שנים בפיתוח 1С-Битрикс ו-50+ פרויקטים לחברות לוגיסטיקה. באמצעות ביטריקס, אנו מקצרים את זמן השקת האתר פי 2 בהשוואה לפתרונות מותאמים אישית. קבלו ייעוץ או הזמינו פיתוח אתר לחברת לוגיסטיקה על 1С-Битрикс—נחשב עלות ולוח זמנים תוך יום עסקים אחד.