פיתוח PHP Hooks לאירועי 1C-Bitrix

לאחר עדכון ליבת Bitrix נוסף בפרויקט אחד, מטפלי האירועים של מודול המכירות הפסיקו לפעול. משתמשים לא קיבלו הודעות תשלום, הזמנות לא נכנסו ל-CRM. הסיבה הייתה קונפליקט רישום ב-init.php: שני מודולים הצמידו מטפלים לאותו אירוע עם ערכי sort שונים, ו-
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
פיתוח PHP Hooks לאירועי 1C-Bitrix
בינוני
~1-2 שבועות

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

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1460
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1019
  • פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    764
  • פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    809
  • פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1165

לאחר עדכון נוסף של ליבת ביטריקס בפרויקט אחד, מטפלי האירועים של מודול המכירות הפסיקו לפעול. משתמשים לא קיבלו הודעות תשלום, הזמנות לא נכנסו ל-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 נמוך יותר מחזיר Настройки → Производительность → Панель производительности. זה יכול לחסוך עד שעתיים דיבאג בחודש.

תהליך פיתוח מטפלים בצוות שלנו

  1. ביקורת: ניתוח מטפלים קיימים, זיהוי התנגשויות, צווארי בקבוק ודליפות זיכרון. בדרך כלל מוצאים 5-10 בעיות תוך שעתיים.
  2. עיצוב: בחירת ארכיטקטורה (מודול או init.php), תיאום איתך.
  3. יישום: כתיבת קוד עם בדיקות בסביבת staging, כיסוי מקרי קצה (למשל, הזמנה ריקה, מזהים לא תקינים).
  4. בדיקות: בדיקות עומס (סימולציה של 100+ הזמנות במקביל), בדיקת תאימות עם ההתאמות האישיות שלך.
  5. פריסה: העלאה לסביבת הייצור, ניטור למשך שבוע. אם מתעוררות בעיות, חזרה לגרסה קודמת תוך 15 דקות.

מה כלול ואחריות

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

למהנדסים שלנו יש 8+ שנות ניסיון בפיתוח ביטריקס והסמכת ביטריקס. במעל 50+ פרויקטים קבענו תקנים שמבטלים טעויות נפוצות. הזמן ביקורת של המטפלים הנוכחיים שלך — קבל דוח עם המלצות אופטימיזציה. צור קשר לייעוץ. קבל ייעוץ חינם על ארכיטקטורת אירועים.