פיתוח סכמת דרופשיפינג עם ספקים על 1C-Bitrix
בעת עיבוד הזמנות ידני עם 10 ספקים, מתרחשות עד 15% שגיאות — הזמנות אבודות, כפילויות, רמות מלאי שגויות. הגדלה ל-50 ספקים הופכת את התהליך לבלתי ניתן לניהול. תכננו למעלה מ-30 סכמות דרופשיפינג על 1C-Bitrix שמעבדות עד 5,000 הזמנות ביום ללא התערבות ידנית. האתגרים המרכזיים הם סנכרון מלאי בזמן אמת וניתוב נכון עם ספקים מרובים. מודולים מוכנים לא יכולים להתמודד עם משימות אלו. סכמה שתוכננה בצורה גרועה נשברת כאשר מוסיפים ספק שני או כאשר הנפח עולה על 100 הזמנות ביום. הניסיון שלנו: 7+ שנים בפיתוח Bitrix ו-30+ פרויקטים. אנו מבטיחים ניתוב נכון וסנכרון מלאי בזמן. צרו קשר להערכה חינמית של הפרויקט שלכם — ננתח את התשתית הקיימת שלכם ונכין פתרון.
מדוע מודולים סטנדרטיים אינם מתאימים לדרופשיפינג?
מודולים מוכנים מציעים לעיתים קרובות החלפת ספק פשוטה אך מתעלמים מניתוב מורכב, ממקורות מלאי מרובים, ומאוטומציה של דחיות. עלינו לתכנן מודל נתונים מותאם אישית ומטפלים הניתנים להתאמה לכל ספק.
מודל נתונים לקישור מוצרים וספקים
השאלה המרכזית: כיצד לקשר מוצר לספק ולאחסן נתונים לניתוב הזמנות.
בלוק המידע של המוצר (b_uts_supplier, b_uts_supplier_product) מאחסן נתוני קמעונאות: שם, תיאור, תמונות, מאפיינים. אנו משאירים אותו ללא שינוי.
HL-block ספק — ספריית ספקים: namespace Local\Dropshipping; use Bitrix\Highloadblock\HighloadBlockTable; use Bitrix\Main\Application; class SupplierResolver { /** * Возвращает лучшего поставщика для товара: * сначала основного с остатком > 0, иначе любого с остатком */ public static function resolve(int $productId, int $quantity): ?array { $conn = Application::getConnection(); // Находим поставщиков, у которых достаточно остатка $result = $conn->query(" SELECT sp.UF_SUPPLIER_ID, sp.UF_SUPPLIER_SKU, sp.UF_PURCHASE_PRICE, sp.UF_IS_PRIMARY, csp.AMOUNT FROM b_uts_supplier_product sp JOIN b_catalog_store_product csp ON csp.PRODUCT_ID = sp.UF_PRODUCT_ID AND csp.STORE_ID = sp.UF_STORE_ID WHERE sp.UF_PRODUCT_ID = {$productId} AND csp.AMOUNT >= {$quantity} ORDER BY sp.UF_IS_PRIMARY DESC, sp.UF_PURCHASE_PRICE ASC LIMIT 1 "); return $result->fetch() ?: null; } } (טבלה שנוצרה אוטומטית של ה-HL-block)
- ID
- UF_NAME — שם הספק
- UF_EMAIL — דוא"ל להודעות
- UF_WEBHOOK_URL — כתובת URL להודעות POST
- UF_API_KEY — מפתח API לגישת ספק
- UF_FEED_URL — כתובת URL של עדכון המלאי (XML/CSV/JSON)
- UF_FEED_FORMAT — פורמט העדכון
- UF_LEAD_TIME — זמן עיבוד הזמנה (ימים)
- UF_ACTIVE — דגל פעיל
HL-block SupplierProduct — קישור בין מוצרים וספקים: private static function sendWebhook(string $url, string $apiKey, array $payload): bool { $http = new \Bitrix\Main\Web\HttpClient(); $http->setHeader('Content-Type', 'application/json'); $http->setHeader('Authorization', 'Bearer ' . $apiKey); $http->setTimeout(10); $response = $http->post($url, json_encode($payload)); $status = $http->getStatus(); \Bitrix\Main\Diag\Debug::writeToFile( ['url' => $url, 'status' => $status, 'response' => $response], 'Dropshipping webhook', '/local/logs/dropshipping.log' ); return $status === 200; }
- ID
- UF_PRODUCT_ID — מזהה אלמנט בלוק המידע (
SELECT be.NAME AS product_name, cp.PRICE AS retail_price, sp.UF_PURCHASE_PRICE AS purchase_price, cp.PRICE - sp.UF_PURCHASE_PRICE AS margin_abs, ROUND((cp.PRICE - sp.UF_PURCHASE_PRICE) / cp.PRICE * 100, 1) AS margin_pct FROM b_iblock_element be JOIN b_catalog_price cp ON cp.PRODUCT_ID = be.ID AND cp.CATALOG_GROUP_ID = 1 JOIN b_uts_supplier_product sp ON sp.UF_PRODUCT_ID = be.ID AND sp.UF_IS_PRIMARY = 1 WHERE be.IBLOCK_ID = :catalog_iblock_id AND be.ACTIVE = 'Y' ORDER BY margin_pct ASC;) - UF_SUPPLIER_ID — מזהה הספק (
b_uts_supplier_order) - UF_SUPPLIER_SKU — מק"ט של הספק
- UF_PURCHASE_PRICE — מחיר רכישה
- UF_CURRENCY — מטבע רכישה
- UF_STORE_ID — מחסן הספק (
b_catalog_store.ID) - UF_MIN_QUANTITY — כמות הזמנה מינימלית
- UF_IS_PRIMARY — ספק ראשי (אם יש כמה)
מחסנים (b_catalog_store) — אחד לכל ספק. מלאי ב-b_catalog_store_product. זהו מנגנון Bitrix סטנדרטי, אין צורך להמציא את הגלגל מחדש.
כיצד לתכנן ניתוב הזמנות?
המשימה של הנתב: בעת יצירת הזמנה, לפצל את העגלה, לקבץ פריטים לפי ספק, ולהעביר כל חלק לספק המתאים. הסיבוך: מוצר אחד עשוי להיות עם מספר ספקים. אנו זקוקים ללוגיקת בחירה: לפי מחיר, זמינות, עדיפות. אנו מיישמים זאת באמצעות UF_IS_PRIMARY בשילוב עם בדיקת מלאי עדכנית.
namespace Local\Dropshipping;
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Application;
class SupplierResolver
{
/**
* Возвращает лучшего поставщика для товара:
* сначала основного с остатком > 0, иначе любого с остатком
*/
public static function resolve(int $productId, int $quantity): ?array
{
$conn = Application::getConnection();
// Находим поставщиков, у которых достаточно остатка
$result = $conn->query("
SELECT sp.UF_SUPPLIER_ID, sp.UF_SUPPLIER_SKU, sp.UF_PURCHASE_PRICE, sp.UF_IS_PRIMARY, csp.AMOUNT
FROM b_uts_supplier_product sp
JOIN b_catalog_store_product csp ON csp.PRODUCT_ID = sp.UF_PRODUCT_ID AND csp.STORE_ID = sp.UF_STORE_ID
WHERE sp.UF_PRODUCT_ID = {$productId} AND csp.AMOUNT >= {$quantity}
ORDER BY sp.UF_IS_PRIMARY DESC, sp.UF_PURCHASE_PRICE ASC
LIMIT 1
");
return $result->fetch() ?: null;
}
} העברת ההזמנה לספק
שלושה ערוצי העברה, לפי סדר העדיפות:
- Webhook (REST API של הספק) — האפשרות הטובה ביותר. אנו שולחים POST עם JSON של נתוני ההזמנה לכתובת ה-URL של הספק, והם עונים עם אישור:
private static function sendWebhook(string $url, string $apiKey, array $payload): bool {
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Content-Type', 'application/json');
$http->setHeader('Authorization', 'Bearer ' . $apiKey);
$http->setTimeout(10);
$response = $http->post($url, json_encode($payload));
$status = $http->getStatus();
\Bitrix\Main\Diag\Debug::writeToFile(
['url' => $url, 'status' => $status, 'response' => $response],
'Dropshipping webhook',
'/local/logs/dropshipping.log'
);
return $status === 200;
} -
דוא"ל עם טבלת HTML — כאשר לספק אין API. תבנית דוא"ל באמצעות
CEvent::Send, אירועDROPSHIPPING_ORDER_NEW. טבלת פריטים, כתובת משלוח, סכום העברה. -
החלפת קבצים דרך FTP/SFTP — עבור ספקים שעובדים עם 1C. אנו יוצרים XML בפורמט CommerceML ומניחים אותו על ה-FTP של הספק. הם אוספים אותו לפי לוח זמנים.
סנכרון מלאי
המלאי מתיישן במהירות — האתגר המרכזי של כל סכמת דרופשיפינג. שלוש אסטרטגיות:
| אסטרטגיה | תיאור | השהיה | דרישות מהספק |
|---|---|---|---|
| Push מהספק | Webhook כאשר המלאי משתנה | דקות | API עם callback |
| Pull לפי לוח זמנים | סוכן מוריד עדכון כל N דקות | 15-30 דקות | עדכון (XML/CSV/JSON) |
| הזמנה (Reservation) | הפחתת מלאי בעת יצירת הזמנה | מיידי | אין |
- Push מהספק — הספק מודיע לנו דרך webhook על שינוי במלאי. אנו מיישמים נקודת קצה עם אימות מפתח API.
- Pull לפי לוח זמנים — סוכן Bitrix מוריד את עדכון הספק כל 30 דקות ומעדכן את המלאי. עדכונים מגיעים ב-XML (פורמט 1C), CSV, JSON.
-
הזמנה (Reservation) — אם pull אינו אפשרי, אנו מפחיתים מלאי ב-
b_catalog_store_productלאחר יצירת ההזמנה. לא מדויק אבל עדיף מכלום.
חישוב רווחיות
מחיר הרכישה מאוחסן ב-UF_PURCHASE_PRICE של ה-HL-block. מחיר הקמעונאות נמצא ב-b_catalog_price. ההפרש הוא הרווחיות. ניתן לשאול דוח רווחיות ישירות ממסד הנתונים:
SELECT be.NAME AS product_name,
cp.PRICE AS retail_price,
sp.UF_PURCHASE_PRICE AS purchase_price,
cp.PRICE - sp.UF_PURCHASE_PRICE AS margin_abs,
ROUND((cp.PRICE - sp.UF_PURCHASE_PRICE) / cp.PRICE * 100, 1) AS margin_pct
FROM b_iblock_element be
JOIN b_catalog_price cp ON cp.PRODUCT_ID = be.ID AND cp.CATALOG_GROUP_ID = 1
JOIN b_uts_supplier_product sp ON sp.UF_PRODUCT_ID = be.ID AND sp.UF_IS_PRIMARY = 1
WHERE be.IBLOCK_ID = :catalog_iblock_id
AND be.ACTIVE = 'Y'
ORDER BY margin_pct ASC; כיצד מטפלים בדחיות ספק?
ספק עשוי לדחות הזמנה (חוסר מלאי, שגיאת כתובת). אנו זקוקים ל-HL-block סטטוס למעקב:
b_uts_supplier_order
- UF_ORDER_ID — מזהה הזמנת Bitrix (
b_sale_order.ID) - UF_SUPPLIER_ID — מזהה ספק
- UF_STATUS — ממתין / אושר / נדחה / נשלח / נמסר
- UF_SUPPLIER_ORDER — מספר הזמנה אצל הספק
- UF_TRACKING — מספר מעקב
- UF_REJECT_REASON — סיבת דחייה
- UF_DATE_UPDATE — תאריך עדכון אחרון
בסטטוס rejected, סוכן מודיע למנהל ואם קיים ספק חלופי לאותו מוצר, מנתב את ההזמנה אוטומטית.
התקנה שלב אחר שלב של דרופשיפינג
כיצד ליישם את הסכמה ב-5 שלבים (הרחב)
- ביקורת — ניתוח הקטלוג הנוכחי, אינטגרציות, מספר ספקים ונפח הזמנות (בממוצע 500-1000 הזמנות ביום).
- עיצוב מודל — יצירת HL-blocks ספק ו-SupplierProduct, הגדרת מחסנים לכל ספק.
- פיתוח נתב — כתיבת לוגיקת בחירת ספק לפי עדיפות ומלאי.
- אינטגרציית ערוצי העברה — webhooks, דוא"ל או FTP בהתאם ליכולות הספק.
- בדיקות והשקה — בדיקת עומס עם 1000+ הזמנות, ניטור למשך שבוע.
לוחות זמנים
| תצורה | רכיבים | משך |
|---|---|---|
| ספק יחיד, הודעות דוא"ל | HL-blocks + מטפל + תבנית | 1–2 שבועות |
| ספקים מרובים, webhooks | + נתב + סנכרון API | 3–4 שבועות |
| סכמה מלאה עם עדכונים, פורטל וניתוחים | + pull עדכונים + פורטל ספק + דוח רווחיות | 6–8 שבועות |
מה כלול בתוצאה
- מודל נתונים (HL-blocks ספק ו-SupplierProduct) עם שדות מותאמים לספקים שלכם.
- נתב הזמנות התומך ב-N ספקים עם בחירה מבוססת עדיפות.
- אינטגרציה עם ספקים: webhooks, דוא"ל או FTP — בנפרד לכל אחד.
- סנכרון מלאי כמעט בזמן אמת.
- טיפול בדחיות עם ניתוב אוטומטי לספק חלופי.
- תיעוד ארכיטקטורה ומדריך תפעול.
- הדרכת מנהלים (שעתיים) ותמיכה טכנית למשך 30 יום.
צרו קשר להערכה חינמית של המשימה שלכם. ננתח את מספר הספקים, נפחי ההזמנות והתשתית הקיימת. הזמינו פיתוח של סכמת דרופשיפינג סוהר — קבלו פתרון אמין שלא יישבר ככל שהעסק שלכם גדל.

