הגדרת טריגר הגעת מלאי: התראה אוטומטית ב-1C-Bitrix
תארו לעצמכם: מוצר אזל מהמלאי, עשרות משתמשים לחצו על "עדכן אותי כשחוזר למלאי," המחסן התחדש, אבל אף אחד לא מקבל אימייל. הסיבה היא חוסר קישור בין אירוע החידוש לרשימת ההמתנה. במאמר זה, נפרק כיצד להגדיר טריגר הגעת מלאי ב-1C-Bitrix: מקטלוג פשוט ועד ניהול מלאי רב-מחסני עם אינטגרציית 1C. יישמנו מנגנונים כאלה על 30+ פרויקטים—נשתף תקלות אופייניות ופתרונות אופטימליים. לפי תיעוד Bitrix הרשמי, אירוע CATALOG_QUANTITY הוא כלי מפתח למעקב אחר שינויי מלאי. אבל הוא לבדו לא מספיק: צריך לטפל כראוי במנויים ובלוגיקת רב-מחסנים. הניסיון שלנו מראה שיישום נכון מקצר את זמן התגובה להגעת מלאי פי 3 בהשוואה לבדיקה ידנית.
איך עובד ניהול מלאי ב-Bitrix
ב-Bitrix, כמויות מוצרים נמצאות בשני מקומות בהתאם לתצורה. בקטלוג פשוט (ללא ניהול מלאי), שדה b_catalog_product בטבלת CCatalogProduct::Update() משמש. הוא מתעדכן ישירות דרך catalog או באמצעות סנכרון 1C. בניהול מלאי רב-מחסני (מודול קטלוג + מחסנים), נתונים נשמרים בטבלת b_catalog_store_product עם שדות PRODUCT_ID, STORE_ID, AMOUNT. הכמות הכוללת מסוכמת. במהלך סנכרון 1C דרך CommerceML, נתונים נכתבים ל-b_catalog_store_product. המטפל הסטנדרטי לשינויי מלאי הוא OnProductUpdate במודול הקטלוג. הוא מופעל בכל פעם שרשומה ב-catalog משתנה, כולל כמות. עם זאת, לניהול מלאי רב-מחסני זה לא מספיק—האירוע לא עוקב אחר שינויים לכל מחסן בנפרד. ההשוואה פשוטה: מטפל b_catalog_product עובד מיידית אבל רק על המלאי הכולל, בעוד סוכן (בודק כל 5 דקות) מכסה את כל המחסנים אבל עם עיכוב.
הנה דוגמה למטפל בסיסי:
AddEventHandler('catalog', 'OnProductUpdate', function($id, $fields) { if (isset($fields['QUANTITY']) && $fields['QUANTITY'] > 0) { // Товар поступил на склад — была нулевая позиция checkAndNotifyWaitlist($id); } }); בעיה: AddEventHandler('catalog', 'OnProductUpdate', function($id, $fields) { if (isset($fields['QUANTITY']) && $fields['QUANTITY'] > 0) { // Товар поступил на склад — была нулевая позиция checkAndNotifyWaitlist($id); } }); מופעל על כל שינוי במוצר, לא רק על חידוש מלאי. כדי לסנן ספציפית לאירוע "הגיע מאפס," צריך להשוות את הערך הקודם. לפני אירוע PHP, הנתונים עדיין ב-DB, אז קראו את הערך הישן ב-OnProductUpdate:
AddEventHandler('catalog', 'OnBeforeProductUpdate', function($id, &$fields) { $old = \Bitrix\Catalog\ProductTable::getByPrimary($id, ['select' => ['QUANTITY']])->fetch(); $fields['_OLD_QUANTITY'] = (float)($old['QUANTITY'] ?? 0); }); למה המטפל הסטנדרטי לא מתאים לניהול מלאי רב-מחסני
עם ניהול מלאי רב-מחסני, אירוע OnBeforeProductUpdate לא מופעל כאשר AddEventHandler('catalog', 'OnBeforeProductUpdate', function($id, &$fields) { $old = \Bitrix\Catalog\ProductTable::getByPrimary($id, ['select' => ['QUANTITY']])->fetch(); $fields['_OLD_QUANTITY'] = (float)($old['QUANTITY'] ?? 0); }); משתנה. לפעולות מחסן, צריך להירשם לאירועים ברמה עמוקה יותר במודול הקטלוג—או להשתמש ב-hook לאחר כתיבת מסמך מחסן דרך OnProductUpdate. גישה חלופית: סוכן שבודק b_catalog_store_product כל 5 דקות עבור כמויות שאינן אפס של מוצרים ברשימת ההמתנה. פחות אלגנטי, אבל עובד בצורה אמינה יותר עם סכמות עדכון מלאי לא סטנדרטיות (למשל, UPDATE ישיר דרך מחבר 1C). לפי הניסיון שלנו, סוכן מתמודד עם העומס ב-90% מהמקרים, בעוד מטפל מסמכים מגיב פי 10 מהר יותר אבל דורש יישום זהיר יותר.
השוואת גישות: סוכן מול מטפל מסמכים
| פרמטר | סוכן | מטפל מסמכים |
|---|---|---|
| תגובה לשינויים | עד 5 דקות עיכוב | מיידי |
| עומס על מסד הנתונים | שאילתות תקופתיות | רק על שינויים |
| מורכבות יישום | נמוכה | בינונית |
| אמינות בעדכונים המוניים | גבוהה | גבוהה |
| המלצה | לעדכונים לא סטנדרטיים | לפעולות סטנדרטיות |
איך לאחסן מנויים להתראות הגעה
למודול catalog אין מנגנון מובנה של "עדכן כשחוזר למלאי." צריך טבלה מותאמת אישית:
CREATE TABLE bl_stock_notify ( id SERIAL PRIMARY KEY, product_id INT NOT NULL, user_id INT, email VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW(), notified_at TIMESTAMP, UNIQUE (product_id, email) ); הטופס באתר כותב לטבלה זו. המפתח הייחודי \Bitrix\Catalog\Document\DocumentTable מגן מפני כפילויות במנויים חוזרים.
מטפל חידוש מלאי
function checkAndNotifyWaitlist(int $productId): void { $connection = \Bitrix\Main\Application::getConnection(); $waitlist = $connection->query( "SELECT * FROM bl_stock_notify WHERE product_id = {$productId} AND notified_at IS NULL" )->fetchAll(); if (empty($waitlist)) { return; } $product = \CIBlockElement::GetByID($productId)->GetNextElement(); $name = $product->GetField('NAME'); $url = $product->GetField('DETAIL_PAGE_URL'); foreach ($waitlist as $row) { \Bitrix\Main\Mail\Event::send([ 'EVENT_NAME' => 'STOCK_ARRIVED', 'LID' => SITE_ID, 'C_FIELDS' => [ 'EMAIL' => $row['email'], 'PRODUCT_NAME' => $name, 'PRODUCT_URL' => 'https://' . $_SERVER['SERVER_NAME'] . $url, ], ]); $connection->queryExecute( "UPDATE bl_stock_notify SET notified_at = NOW() WHERE id = {$row['id']}" ); } } השוואת גישות: קטלוג פשוט מול ניהול מלאי רב-מחסני
| פרמטר | קטלוג פשוט | ניהול מלאי רב-מחסני |
|---|---|---|
| אירוע שינוי מלאי | b_catalog_store_product | דורש סוכן או מטפל מסמכים |
| טבלת מלאי | catalog | CREATE TABLE bl_stock_notify ( id SERIAL PRIMARY KEY, product_id INT NOT NULL, user_id INT, email VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW(), notified_at TIMESTAMP, UNIQUE (product_id, email) ); |
| מורכבות יישום | נמוכה | בינונית |
| זמן הגדרה | 1-2 ימים | 3-5 ימים |
| אמינות בעדכונים המוניים | גבוהה | דורש סנכרון נוסף |
מה כלול: תוצרים
- פיתוח והתקנה של מטפלי
(product_id, email)ו-function checkAndNotifyWaitlist(int $productId): void { $connection = \Bitrix\Main\Application::getConnection(); $waitlist = $connection->query( "SELECT * FROM bl_stock_notify WHERE product_id = {$productId} AND notified_at IS NULL" )->fetchAll(); if (empty($waitlist)) { return; } $product = \CIBlockElement::GetByID($productId)->GetNextElement(); $name = $product->GetField('NAME'); $url = $product->GetField('DETAIL_PAGE_URL'); foreach ($waitlist as $row) { \Bitrix\Main\Mail\Event::send([ 'EVENT_NAME' => 'STOCK_ARRIVED', 'LID' => SITE_ID, 'C_FIELDS' => [ 'EMAIL' => $row['email'], 'PRODUCT_NAME' => $name, 'PRODUCT_URL' => 'https://' . $_SERVER['SERVER_NAME'] . $url, ], ]); $connection->queryExecute( "UPDATE bl_stock_notify SET notified_at = NOW() WHERE id = {$row['id']}" ); } }עם בדיקת מעבר "0 → N". - יצירת טבלת
OnProductUpdateואינטגרציית טופס המנוי באתר. - הגדרת תבנית האימייל
b_catalog_productבלוח הניהול. - לתצורות רב-מחסניות: יישום סוכן או מטפל מסמכי מחסן.
- לוגיקת חידוש חלקי: בחירת אסטרטגיה (הודע לכולם או ברצף).
- תיעוד גישה ובדיקות בסביבת staging.
- תמיכה ל-14 יום לאחר ההשקה.
תהליך
- ניתוח: לימוד תצורת Bitrix הנוכחית שלך, סכמת סנכרון 1C, עומס מסד נתונים.
- עיצוב: בחירת השיטה האופטימלית (מטפלים או סוכן), הסכמה על לוגיקת תור ההתראות.
- יישום: כתיבת קוד, יצירת טבלת SQL, הגדרת אירועי אימייל.
- בדיקות: אימות על עותק קטלוג, סימולציית הגעת מלאי, מעקב אחר שליחת אימיילים.
- פריסה וניטור: מעבר לסביבת production, רישום טריגרים ראשונים.
טעויות אופייניות בהתקנה עצמית
- סינון אירועים שגוי: שליחת התראות על כל שינוי במוצר, לא רק כשמופיע מאפס.
- מפתח ייחודי חסר בטבלת המנויים—אימיילים כפולים.
- התעלמות מארכיטקטורת רב-מחסנים—התראות נכשלות כשמלאי מתחדש במחסן ספציפי.
- ללא טיפול בחידוש חלקי: אם מגיעות פחות יחידות ממספר המנויים.
ניתן להימנע בקלות מבעיות אלה על ידי ביצוע המתודולוגיה המתוארת.
לוחות זמנים ועלות
לוחות הזמנים המשוערים הם בין 2 ל-10 ימי עבודה בהתאם למורכבות. העלות מחושבת באופן אישי לאחר ניתוח התצורה שלך. צרו קשר להערכה מקדימה—אנו מבטיחים תוצאות שקופות ותמיכה לאחר היישום. קבלו ייעוץ—נמצא את הפתרון האופטימלי לסכמת הניהול שלך. הניסיון שלנו בתחום זה מכסה מעל 30 פרויקטי אוטומציית התראות Bitrix.







