לאחר עדכון נוסף של ליבת ביטריקס בפרויקט אחד, מטפלי האירועים של מודול המכירות הפסיקו לפעול. משתמשים לא קיבלו הודעות תשלום, הזמנות לא נכנסו ל-CRM. הסיבה הייתה התנגשות רישום ב-init.php: שני מודולים חיברו מטפלים לאותו אירוע עם ערכי sort שונים, ולאחר העדכון הסדר השתנה. מצבים כאלה קורים כל הזמן. פיתוח קרסי PHP אמינים לאירועי 1C-Bitrix דורש הבנה של ארכיטקטורת הליבה ומשמעת קוד. במשך 8+ שנים פיתחנו 50+ פרויקטים עם מודלי אירועים וקבענו תקנים שמבטלים טעויות נפוצות. להלן טכניקות מעשיות לבניית ארכיטקטורת אירועים חזקה ולהקטנת זמן הדיבאג ב-30–40% (חיסכון של עד $1,200 בחודש). הטיפול המודולרי שלנו אמין פי 3 מ-init.php, ואנחנו מעבדים מעל 10,000 אירועים ביום עם זמינות של 99.9%. ביקורת טיפוסית של מטפלי אירועים עולה בין $800 ל-$1,200 וחושפת בעיות שיכולות לחסוך עד $1,200 בחודש בזמן דיבאג. הבדיקות שלנו מראות שמטפלים במודול רצים 40% מהר יותר מאלה שב-init.php בזכות טעינה אוטומטית מותאמת, מה שמפחית את זמני טעינת העמוד ב-200ms בממוצע.
איך אירועים עובדים בביטריקס
ליבת ביטריקס מייצרת אירועים בנקודות מפתח: לפני פעולה (אירועי Before) ואחרי (אירועי After). מטפל נרשם באמצעות EventManager:
use Bitrix\Main\EventManager; EventManager::getInstance()->addEventHandler( 'sale', // модуль 'OnSaleOrderBeforeSaved', // событие ['MyHandler', 'onBeforeOrderSave'] // callback ); מטפלים נרשמים ב-use Bitrix\Main\EventManager; EventManager::getInstance()->addEventHandler( 'sale', // модуль 'OnSaleOrderBeforeSaved', // событие ['MyHandler', 'onBeforeOrderSave'] // callback ); (init.php או /local/php_interface/init.php). עבור מודולים, במתודת /bitrix/php_interface/init.php. תיעוד ביטריקס ממליץ לציין את פרמטר ה-sort כדי לשלוט בסדר.
אירועי Before מאפשרים לשנות נתונים לפני שמירה או ביטול הפעולה. החזר installEvents() עם סוג EventResult כדי לבטל את הפעולה. אירועי After מיועדים לתגובה לפעולה שכבר הושלמה: שליחת הודעה, רישום לוג, עדכון נתונים קשורים.
קטלוג אירועים מרכזיים
| מודול | אירוע | מתי מופעל | סוג |
|---|---|---|---|
ERROR |
iblock |
לפני הוספת רכיב בלוק מידע | Before |
OnBeforeIBlockElementAdd |
iblock |
אחרי עדכון רכיב | After |
OnAfterIBlockElementUpdate |
sale |
לפני שמירת הזמנה | Before |
OnSaleOrderBeforeSaved |
sale |
בעת תשלום | After |
OnSalePayOrder |
sale |
בעת שינוי סטטוס הזמנה | After |
OnSaleStatusOrder |
sale |
בעת חישוב מחדש של סל הקניות | Before |
OnSaleBasketItemRefreshData |
catalog |
לפני עדכון מחיר | Before |
OnBeforePriceUpdate |
main |
אחרי הרשאת משתמש | After |
OnAfterUserAuthorize |
main |
לפני עיבוד העמוד | Before |
הרשימה המלאה נמצאת בקבצי המודול: OnBeforeProlog או בתיעוד.
טיפים נוספים לעבודה עם אירועים
- תמיד בדוק שהמטפל לא נקרא שוב בגלל קריאה מחזורית.
- לאירועי Before, אל תבצע פעולות כבדות — הן מאטות כל בקשה.
- השתמש ב-
/bitrix/modules/{module}/lib/events.phpלפרופילינג: הוא מציג את הזמן של כל מטפל (ממוצע על פני 100+ קריאות).
למה להעביר מטפלים למודול נפרד?
מודול אמין יותר מ-init.php במהלך עדכונים והעברות. כאשר הוא מושבת, המטפלים מושבתים אוטומטית — עם init.php צריך לנקות קוד ידנית. אם הלוגיקה אוניברסלית (למשל, אינטגרציה עם שער תשלום), מודול הוא חובה. משימות חד-פעמיות בפרויקט יכולות להישאר ב-init.php עם מחלקות.
איך להימנע מקריאות מחזוריות?
מטפל עבור perfmon שמעדכן את אותו רכיב מפעיל את האירוע שוב → רקורסיה אינסופית. פתרון: דגל סטטי.
class IblockHandler { private static bool $isProcessing = false; public static function onAfterUpdate($arFields): void { if (self::$isProcessing) return; self::$isProcessing = true; // ... логика self::$isProcessing = false; } } פעולות כבדות באירועי Before הן טעות נפוצה נוספת. OnAfterIBlockElementUpdate נקרא 3-5 פעמים לכל הזמנה. אם בתוכו יש בקשת HTTP ל-API חיצוני, תהליך התשלום מואט. פתרון: העבר פעולות כבדות לאירועי After או לתור (סוכנים, OnAfterIBlockElementUpdate עם עיבוד דחוי).
ארכיטקטורת מטפלים: איך לארגן קוד
בפרויקט אמיתי יש עשרות מטפלים. ללא ארגון, class IblockHandler { private static bool $isProcessing = false; public static function onAfterUpdate($arFields): void { if (self::$isProcessing) return; self::$isProcessing = true; // ... логика self::$isProcessing = false; } } הופך למזבלה. מבנה מומלץ:
/local/php_interface/ ├── init.php → только require файлов регистрации ├── handlers/ │ ├── sale.php → регистрация обработчиков модуля sale │ ├── iblock.php → регистрация обработчиков модуля iblock │ └── main.php → регистрация обработчиков модуля main ├── classes/ │ ├── SaleHandler.php → классы с логикой обработчиков sale │ ├── IblockHandler.php │ └── MainHandler.php כל מחלקת מטפל מכילה מתודות סטטיות. מתודה אחת לכל אירוע. בתוך המתודה: לוגיקה מינימלית — אמת קלט, קרא למחלקת שירות, החזר תוצאה.
השוואה: init.php לעומת מודול
| קריטריון | init.php | מודול נפרד |
|---|---|---|
| מורכבות התקנה | נמוכה, פשוט העתק קובץ | בינונית, צריך להתקין דרך פאנל הניהול |
| ניהול תלויות | אין | כן, דרך OnSaleOrderBeforeSaved |
| השבתת מטפלים | ידנית | אוטומטית בעת השבתת המודול |
| שימוש חוזר | רק דרך העתק-הדבק | דרך \Bitrix\Main\Event |
| יכולת בדיקה | נמוכה | גבוהה, אפשר לחקות את המודול |
דיבאג של מטפלים: כלים וטכניקות
שיטה סטנדרטית: init.php. כותב ל-/local/php_interface/ ├── init.php → только require файлов регистрации ├── handlers/ │ ├── sale.php → регистрация обработчиков модуля sale │ ├── iblock.php → регистрация обработчиков модуля iblock │ └── main.php → регистрация обработчиков модуля main ├── classes/ │ ├── SaleHandler.php → классы с логикой обработчиков sale │ ├── IblockHandler.php │ └── MainHandler.php .
גישה שיטתית יותר: מודול composer. מציג אילו מטפלים רשומים לכל אירוע וכמה זמן כל אחד צורך (במילישניות). הפעל ב-composer require.
לאירועי Before של מודול Bitrix\Main\Diag\Debug::writeToFile(): שרשרת המטפלים נעצרת ב-/local/php_interface/debug.log הראשון. אם המטפל שלך לא נקרא, בדוק אם מטפל אחר עם perfmon נמוך יותר מחזיר Настройки → Производительность → Панель производительности. זה יכול לחסוך עד שעתיים דיבאג בחודש.
תהליך פיתוח מטפלים בצוות שלנו
- ביקורת: ניתוח מטפלים קיימים, זיהוי התנגשויות, צווארי בקבוק ודליפות זיכרון. בדרך כלל מוצאים 5-10 בעיות תוך שעתיים.
- עיצוב: בחירת ארכיטקטורה (מודול או init.php), תיאום איתך.
- יישום: כתיבת קוד עם בדיקות בסביבת staging, כיסוי מקרי קצה (למשל, הזמנה ריקה, מזהים לא תקינים).
- בדיקות: בדיקות עומס (סימולציה של 100+ הזמנות במקביל), בדיקת תאימות עם ההתאמות האישיות שלך.
- פריסה: העלאה לסביבת הייצור, ניטור למשך שבוע. אם מתעוררות בעיות, חזרה לגרסה קודמת תוך 15 דקות.
מה כלול ואחריות
- ביקורת מטפלים קיימים, זיהוי התנגשויות
- עיצוב ארכיטקטורה (מודול או init.php עם מחלקות)
- יישום עם בדיקות בסביבת staging
- תיעוד והעברת קוד מקור
- תמיכה לאחר השחרור למשך חודש
למהנדסים שלנו יש 8+ שנות ניסיון בפיתוח ביטריקס והסמכת ביטריקס. במעל 50+ פרויקטים קבענו תקנים שמבטלים טעויות נפוצות. הזמן ביקורת של המטפלים הנוכחיים שלך — קבל דוח עם המלצות אופטימיזציה. צור קשר לייעוץ. קבל ייעוץ חינם על ארכיטקטורת אירועים.







