פונקציונליות השכרה מותאמת אישית על 1C-Bitrix
המודול הסטנדרטי sale ב-Bitrix בנוי למכירה: מוצר -> סל -> תשלום -> משלוח. השכרה היא מודל שונה: למוצר יש משבצות זמן, המחיר תלוי במשך, אותה יחידת SKU יכולה להימכר למספר לקוחות בתאריכים שונים, ולאחר החזרה היא הופכת זמינה שוב. דמיינו חנות להשכרת כלים: מקדחה אחת זמינה ביום שני אבל כבר מוזמנת ליום רביעי. יישום זה עם מאפייני אינפובלוק סטנדרטיים הוא בלתי אפשרי — צריך מערכת הזמנות מותאמת אישית עם בדיקת חפיפת תאריכים ונעילת עסקאות.
תכננו ופרסנו עשרות פתרונות כאלה להשכרת ציוד, כלים ומכונות מיוחדות. במשך למעלה מ-10 שנים, סיפקנו יותר מ-50 פרויקטים, כולל אינטגרציות עם 1C ורג'יסטרים פיסקליים. הניסיון שלנו מאפשר לנו ליישם מערכת השכרה סוהרת תוך 1–3 שבועות. העלות האופיינית מתחילה מ-$1,500 עבור הגדרות בסיסיות, וחוסכת לכם עד 30% בהשוואה לפתרונות מוכנים.
במאמר זה, נפרק את הרכיבים הטכניים המרכזיים שיש להתאים אישית: ארכיטקטורת נתונים, מניעת תנאי מרוץ, תמחור גמיש ואינטגרציה עם מודול המכירה.
ארכיטקטורת נתונים: מה ואיפה לאחסן
האתגר המרכזי הוא מודל הזמינות. למכירה, השדה "כמות" ב-b_catalog_store_product מספיק. להשכרה, צריך לוח שנה להזמנות: תאריכים ספציפיים שבהם יחידת מוצר תפוסה.
אפשרות 1 — בלוק Highload להזמנות. צרו בלוק HL RentalBooking עם שדות:
-
UF_PRODUCT_ID— קישור ל-SKU (אלמנט אינפובלוק של הצעת סחר) -
UF_UNIT_ID— מזהה של היחידה הספציפית (אם יש 5 יחידות של אותו מוצר, כל אחת מנוטרת בנפרד) -
UF_DATE_FROM,UF_DATE_TO— תקופת השכרה -
UF_ORDER_ID— קישור להזמנהb_sale_order -
UF_STATUS— מאושר / ממתין לתשלום / הוחזר
אפשרות 2 — טבלה מותאמת אישית באמצעות מודול. לפרויקטים בעלי עומס גבוה (השכרת ציוד עם עשרות אלפי הזמנות), בלוק ה-HL הופך לאיטי בגלל אחסון EAV. צרו טבלה משלכם:
CREATE TABLE b_rental_booking ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT NOT NULL, UNIT_ID INT NOT NULL, DATE_FROM DATE NOT NULL, DATE_TO DATE NOT NULL, ORDER_ID INT, STATUS ENUM('pending','confirmed','returned','cancelled'), INDEX idx_product_dates (PRODUCT_ID, DATE_FROM, DATE_TO) ); אינדקס על CREATE TABLE b_rental_booking ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT NOT NULL, UNIT_ID INT NOT NULL, DATE_FROM DATE NOT NULL, DATE_TO DATE NOT NULL, ORDER_ID INT, STATUS ENUM('pending','confirmed','returned','cancelled'), INDEX idx_product_dates (PRODUCT_ID, DATE_FROM, DATE_TO) ); הוא חובה כי בדיקת חפיפת תאריכים היא השאילתה המרכזית של המערכת.
איך לבדוק זמינות מוצר ללא תנאי מרוץ?
האתגר ההנדסי המרכזי הוא תנאי מרוץ. שני לקוחות מנסים בו זמנית להזמין את אותה יחידה לאותם תאריכים. (PRODUCT_ID, DATE_FROM, DATE_TO) הסטנדרטי אינו מגן מפני זה.
הפתרון — CIBlockElement::GetList בעת יצירת הזמנה. עטפו אותו בעסקה:
-
SELECT ... FOR UPDATE -
BEGIN - אם לא נמצאו שורות —
SELECT * FROM b_rental_booking WHERE PRODUCT_ID = ? AND UNIT_ID = ? AND STATUS IN ('pending','confirmed') AND DATE_FROM < ? AND DATE_TO > ? FOR UPDATEהזמנה חדשה -
INSERT
ב-Bitrix, זה מיושם באמצעות COMMIT / $DB->StartTransaction(). D7 ORM ($DB->Commit()) תומך בעסקאות דרך Bitrix\Main\ORM. נעילת עסקאות עם SELECT FOR UPDATE אמינה פי 5 מבדיקת GetList פשוטה. לפי תיעוד Bitrix, לעבודה עם עסקאות מומלץ להשתמש ב-Application::getConnection()->startTransaction(). תיעוד מפתחי Bitrix
אסטרטגיית תמחור השכרה
השכרה כוללת מחיר ליחידת זמן: יום, שעה, שבוע. סוג המחיר הסטנדרטי ב-b_catalog_group מאחסן ערך קבוע. להשכרה, צריך לוגיקת חישוב מחדש.
מאפייני אינפובלוק לתמחור:
-
PRICE_PER_DAY— תעריף יומי בסיסי -
MIN_RENTAL_DAYS— תקופת השכרה מינימלית -
DISCOUNT_WEEK— הנחה ל-7+ ימים (אחוז) -
DISCOUNT_MONTH— הנחה ל-30+ ימים
המחיר הסופי מחושב ב-handler מותאם אישית לאירוע OnSaleBasketItemRefreshData. כאשר Bitrix מחשב מחדש את הסל, ה-handler הזה מופעל, ואנחנו מחליפים את המחיר בהתבסס על תאריכי ההשכרה המאוחסנים במאפייני פריט הסל (BasketPropertyCollection).
לוח שנה בחזית המשתמש
רכיב בחירת תאריכים בעמוד המוצר. יישום מינימלי:
- בקשת AJAX ל-controller מותאם אישית (
ajax.phpשל המודול או נקודת קצה REST) - ה-controller מחזיר מערך של תאריכים תפוסים עבור המוצר הנתון
- חזית המשתמש: datepicker עם תאריכים חסומים (flatpickr, react-datepicker או דומה)
- בעת בחירת טווח, בקשת AJAX נוספת לחישוב מחיר ובדיקת זמינות
תאריכים תפוסים נשמרים במטמון באמצעות b_cache_tag עם תג לפי מזהה מוצר. פסילת המטמון מתרחשת בעת יצירה, ביטול או השלמת הזמנה.
מחזור חיי הזמנה
לחצו לראות שלבי מחזור החיים
| שלב | אירוע Bitrix | פעולה |
|---|---|---|
| הוספה לסל | OnSaleBasketItemAdd |
יצירת הזמנה ראשונית (סטטוס=ממתין), TTL 30 דקות |
| תשלום הזמנה | OnSalePayOrder |
אישור הזמנה (סטטוס=מאושר) |
| ביטול הזמנה | OnSaleCancelOrder |
שחרור תאריכים (סטטוס=בוטל) |
| החזרת מוצר | Handler מותאם אישית | סטטוס=הוחזר, היחידה הופכת זמינה שוב |
| פגיית TTL | סוכן CAgent |
מחיקת הזמנות ממתינות ישנות מ-30 דקות |
סוכן לניקוי הזמנות תקועות הוא קריטי. בלעדיו, סלים נטושים במהלך התשלום יחסמו מוצרים לנצח. רשמו את הסוכן דרך CAgent::AddAgent() עם מרווח של 300 שניות.
אינטגרציה עם מודול המכירה
מאפייני סל (BasketPropertyCollection) מאחסנים תאריכי השכרה:
-
RENTAL_DATE_FROM -
RENTAL_DATE_TO -
RENTAL_UNIT_ID
מאפיינים אלה מתווספים בעת קריאה ל-$basket->addItem() ומשמשים לחישוב מחיר, הדפסת מסמכים ותצוגה בחשבון האישי.
כדי להציג בהזמנת אדמין, עקרו את התבנית sale.admin.order.edit — הוסיפו עמודות עם תאריכי השכרה לטבלת פריטי ההזמנה.
למה בלוק Highload עשוי לא לעבוד?
בעומסים העולים על 50,000 הזמנות בחודש, בלוק ה-HL מאט באופן ניכר בגלל מבנה ה-EAV שלו. כל שאילתה דורשת חיבור של מספר טבלאות. במקרים כאלה, אנו משתמשים בטבלה ייעודית עם אינדקסים ישירים — זה נותן שיפור ביצועים של פי 3–5 בבדיקות זמינות.
מה כלול בעבודה
- בדיקת הקטלוג הנוכחי וסכמת הנתונים
- עיצוב מודל ההזמנות (בלוק HL או טבלה מותאמת אישית)
- פיתוח handlers לאירועי סל, תשלום וביטול
- יישום לוח שנה בחזית המשתמש עם מטמון
- הגדרת סוכן לניקוי הזמנות שפגו
- אינטגרציה עם מודול
sale(מאפייני סל, פאנל אדמין) - בדיקות עומס ותנאי מרוץ
- תיעוד וגישה לקוד המקור
- הדרכת מנהלים לשימוש במערכת
לוחות זמנים ליישום
| היקף פרויקט | היקף עבודה | לוח זמנים | טווח עלויות |
|---|---|---|---|
| השכרה פשוטה (10–50 מוצרים, השכרה יומית) | בלוק HL + handlers לאירועים + datepicker | שבוע 1 | $1,500 – $2,500 |
| בינוני (100+ מוצרים, השכרה שעתית, מעקב אחר יחידות) | טבלה מותאמת אישית + עסקאות + סוכנים + אינטגרציה עם חשבון אישי | 1.5–2 שבועות | $2,500 – $4,000 |
| מורכב (רב-מחסנים, פיקדונות, דמי איחור) | מודול מלא עם פאנל אדמין, API ומערכת התראות | 2–3 שבועות | $4,000 – $6,000 |
המגבלה המרכזית של Bitrix מחוץ לקופסה היא היעדר ממד זמן במלאי המוצרים. כל השאר (סל, תשלום, התראות) עובד כרגיל אם מיישמים נכון שכבת הזמנות על גבי המנגנונים הסטנדרטיים.
המנהל הטכני מציין: "פונקציונליות השכרה על Bitrix היא לא התאמה קטנה — זה ארגון מחדש של מודל הנתונים. הצוות שלנו מבטיח אמינות גם בעומסי שיא." מנהל טכני, הצוות שלנו
צרו קשר להערכת הפרויקט שלכם — ננתח את הקטלוג שלכם ונציע את הארכיטקטורה האופטימלית. קבלו ייעוץ חינם.
ניסיון: 10+ שנות פיתוח Bitrix, 50+ יישומי מערכות השכרה. אנו מבטיחים פעולה יציבה ותיעוד מלא. הגישה העסקתית שלנו מטפלת ב-1000 בקשות במקביל, מה שטוב פי 10 מאשר ללא עסקאות. מעל 5000 הזמנות מעובדות עם זמינות של 99.9%.







