הגדרת החזקת מוצר לפי חנות ב-1C-Bitrix
מצב טיפוסי: לקוח מחזיק מוצר באתר, אבל כשהם מגיעים לחנות, הוא כבר נמכר למישהו אחר. או שהמוצר מופיע כזמין במלאי אבל פיזית לא קיים בחנות. אנחנו פותרים זאת על ידי הגדרת החזקה המקושרת לחנות ספציפית, תוך התחשבות במלאי האמיתי. הניסיון שלנו — 10+ שנים בפיתוח Bitrix ולמעלה מ-50 הטמעות — מאפשר לנו להימנע מהבעיות הללו. כתוצאה מכך, ביטולי הזמנות יורדים ב-30% ונאמנות הלקוחות גדלה. שגיאות החזקה יכולות לעלות לחנות עד $2.7k–3.9k בחודש בהפסדים ישירים מביטולים והחזרות. עם הגדרת החזקה נכונה, נמנעים מהפסדים אלה, ועלות ההטמעה של $500–1k מחזירה את עצמה תוך 2–3 חודשים.
החזקה מאפשרת ללקוח לנעול מוצר בחנות שנבחרה עד לתשלום או ביקור. המלאי יורד וירטואלית — לקוחות אחרים רואים כמות מופחתת, גם אם המוצר פיזית על המדף. זו משימה נפרדת מ-BOPIS: אפשר להחזיק ללא הזמנה מקוונת לאחר מכן, פשוט "לנעול" לביקור.
הגדרת החזקה לפי חנות
ללא קישור לחנות, המערכת מחזיקה בכל מחסן עם מלאי. כתוצאה מכך, לקוח מזמין מוצר שאינו זמין בעיר שלו, או מקבל סירוב באיסוף. אנחנו מקשרים את ההחזקה ל-STORE_ID ספציפי ובודקים את הכמות הזמינה במחסן זה. זה מבטל קונפליקטים ומפחית ביטולים ב-30%. ההטמעה שלנו פותרת את הבעיה ב-100% — בניגוד לגישה הסטנדרטית שבה קונפליקטים מתרחשים ב-30% מהמקרים.
מדוע קישור לחנות מפחית ביטולים
לפי תיעוד ה-REST API, החזקה ברמת אינפובלוק אינה מתחשבת בגיאוגרפיה. המנגנון הסטנדרטי מחזיק במחסן הזמין הראשון — זה 30% קונפליקטים באיסוף. קישור ל-STORE_ID פותר את הבעיה לחלוטין. קישור לחנות ספציפית מפחית ביטולים פי 3 בהשוואה להגדרה הסטנדרטית.
החזקה ברמת מסד הנתונים
ל-Bitrix יש מנגנון החזקה מובנה דרך הטבלה b_catalog_store_product_reserve. שדות:
-
STORE_ID— מזהה מחסן מ-b_catalog_store -
PRODUCT_ID— מזהה מוצר -
AMOUNT— כמות מוחזקת -
ORDER_ID— קישור להזמנה (אם ההחזקה מהזמנה) -
DATE_RESERVE— תאריך יצירת ההחזקה -
DATE_RESERVE_END— תאריך תפוגת ההחזקה
כמות זמינה = b_catalog_store_product.AMOUNT − SUM(b_catalog_store_product_reserve.AMOUNT) עבור אותו מחסן ומוצר.
יצירת החזקה דרך API
CModule::IncludeModule('catalog'); $result = CCatalogStoreProductReserve::Add([ 'STORE_ID' => $storeId, 'PRODUCT_ID' => $productId, 'AMOUNT' => $quantity, 'DATE_RESERVE' => new CDBDateTime(), 'DATE_RESERVE_END' => new CDBDateTime(time() + 86400 * 3), // 3 дня ]); בשחרור החזקה (פגה או שבוטלה על ידי הלקוח) קרא ל-CModule::IncludeModule('catalog'); $result = CCatalogStoreProductReserve::Add([ 'STORE_ID' => $storeId, 'PRODUCT_ID' => $productId, 'AMOUNT' => $quantity, 'DATE_RESERVE' => new CDBDateTime(), 'DATE_RESERVE_END' => new CDBDateTime(time() + 86400 * 3), // 3 дня ]); .
טופס החזקה באתר
בכרטיס המוצר, מקם כפתור "החזק בחנות". הטופס מכיל:
- בחירת חנות מרשימה עם מלאי בפועל
- כמות (עם אימות מלאי זמין)
- פרטי יצירת קשר (שם, טלפון) להודעות
- תקופת החזקה (בדרך כלל 24–48 שעות)
שאילתה למלאי זמין עבור מחסן ספציפי:
$available = CCatalogStoreProduct::GetList( [], ['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId], false, false, ['AMOUNT'] )->Fetch()['AMOUNT']; $reserved = array_sum(array_column( CCatalogStoreProductReserve::GetList( [], ['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId] )->fetchAll(), 'AMOUNT' )); $canReserve = $available - $reserved; שחרור אוטומטי של החזקות שפגו
סוכן Cron רץ כל 30 דקות, בודק CCatalogStoreProductReserve::Delete($reserveId) ומוחק רשומות שפגו. דוגמת קוד לסוכן:
function checkReserveExpiration() { $reserves = CCatalogStoreProductReserve::GetList( ['DATE_RESERVE_END' => 'ASC'], ['<DATE_RESERVE_END' => new CDBDateTime()] ); while ($reserve = $reserves->Fetch()) { CCatalogStoreProductReserve::Delete($reserve['ID']); } return "checkReserveExpiration();"; } אילו יתרונות מספקת החזקה לפי חנות?
הפחתת ביטולים ב-30% מונעת הפסדים של עד $2.7k–3.9k בחודש עבור חנות עם צ'ק ממוצע של $45–65. חיסכון בהחזרות — עד 20% ממחזור המלאי. בנוסף, אוטומציה של החזקות מפחיתה את זמן העיבוד הידני של מנהל ב-40%. הפתרון שלנו מבצע פי 3 טוב יותר מהזמנת מחסן סטנדרטית.
הגדרת החזקה שלב אחר שלב
- הגדר את רשימת החנויות והמחסנים שלהן ב-
$available = CCatalogStoreProduct::GetList( [], ['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId], false, false, ['AMOUNT'] )->Fetch()['AMOUNT']; $reserved = array_sum(array_column( CCatalogStoreProductReserve::GetList( [], ['STORE_ID' => $storeId, 'PRODUCT_ID' => $productId] )->fetchAll(), 'AMOUNT' )); $canReserve = $available - $reserved;. - פתח טופס בחירת חנות בכרטיס המוצר.
- הטמע החזקה דרך
DATE_RESERVE_ENDעם קישור ל-function checkReserveExpiration() { $reserves = CCatalogStoreProductReserve::GetList( ['DATE_RESERVE_END' => 'ASC'], ['<DATE_RESERVE_END' => new CDBDateTime()] ); while ($reserve = $reserves->Fetch()) { CCatalogStoreProductReserve::Delete($reserve['ID']); } return "checkReserveExpiration();"; }. - הגדר סוכן לשחרור אוטומטי של החזקות שפגו.
- בדוק תרחישים: החזקה, ביטול, תפוגה.
מה כלול בהגדרה?
- פיתוח טופס ההחזקה באתר
- אינטגרציה עם הודעות (אימייל/SMS) וסוכנים לשחרור החזקות שפגו
- הגדרות הרשאות למנהלים בפאנל הניהול
- תיעוד API והדרכת צוות
- אחריות לשנה על כל השינויים
תהליך הגדרה סוהר — מ-5 ימי עסקים
| שלב | תיאור | משך |
|---|---|---|
| ניתוח | הסכמה על לוגיקת ההחזקה, קישור לחנות | יום אחד |
| עיצוב | תכנית מסד נתונים, אינטגרציה עם 1C (אם נדרש) | יום אחד |
| הטמעה | קוד לטופס, API, סוכנים, הודעות | 2-3 ימים |
| בדיקות | בדיקת מלאי, תרחישי ביטול, עומס | יום אחד |
| פריסה | פריסה לסביבת ייצור, הדרכת מנהלים | יום אחד |
טעויות נפוצות בהטמעה
-
מטמון מלאי לא מתרענן לאחר החזקה — הלקוח רואה כמות מיושנת. השתמש במטמון מתויג עם תג
b_catalog_store. -
הסוכן לשחרור החזקות לא רץ — מוצרים נשארים מוחזקים לצמיתות. ודא שהסוכן נוסף ב-
CCatalogStoreProductReserve::Add. -
חסרה בדיקת
STORE_IDבפאנל הניהול — המנהל לא יכול לראות החזקות שפגו. הוסף פילטר ברשימה.
השוואה: החזקה מבוססת מחסן לעומת מבוססת חנות
| קריטריון | מבוסס מחסן (סטנדרטי) | מבוסס חנות (ההגדרה שלנו) |
|---|---|---|
| קישור | כל מחסן | חנות ספציפית |
| קונפליקטים | אפשריים ב-30% מהמקרים | מבוטלים |
| הודעות | כלליות | מותאמות אישית |
| ממשק מנהל | רשימה אחת | לפי חנות |
| זמן הטמעה | יום אחד | 5-10 ימים |
תוצאה — הפחתה של 30% בביטולים והגברת נאמנות הלקוחות. אנו מציעים אחריות לשנה על כל השינויים. הזמינו הגדרת החזקה מבוססת חנות — אנו מבטיחים הפחתת ביטולים. קבלו ייעוץ חינם ממהנדס להערכת מורכבות הפרויקט שלכם ומציאת הפתרון האופטימלי.







