בעת הרכבת ערכת "מחשב גיימינג" בחנות מקוונת על 1C-Bitrix, עולה משימה נפוצה: יחידת המערכת היא חובה, בעוד שמקלדת, עכבר ואוזניות הם אופציונליים. ללא פיתוח מותאם אישית, מנגנון b_catalog_product_set הסטנדרטי מאפשר רק לסמן פריט כחובה או לא. קיבוץ אפשרויות, חישוב מחיר דינמי וניהול מלאי נפרד אינם נתמכים. למהנדסים שלנו, עם ניסיון של 5+ שנים, יש ניסיון ביישום עשרות פרויקטים כאלה — מחנויות קטנות ועד קטלוגים עם 50,000 פריטים. אנו מציעים פתרון מוכן שמתאים בקלות לכל תרחיש עסקי.
הגדרת פריטי חובה ואופציונליים בערכת 1C-Bitrix
למנגנון b_catalog_product_set הסטנדרטי יש שדה IS_REQUIRED, אך הלוגיקה של צד הלקוח לבחירת אפשרויות אינה מיושמת כברירת מחדל. הרחבת המערכת דורשת פיתוח נוסף.
שדה IS_REQUIRED והמגבלות שלו
שדה IS_REQUIRED מקבל ערכים 0 (אופציונלי) ו-1 (חובה). זהו ההבחנה היחידה במבנה הסטנדרטי. לתרחישים מורכבים יותר — לדוגמה, "בחירת פריט אחד בדיוק מקבוצה" — יש צורך להרחיב את הסכמה. בפרויקט אחד, צמצמנו את הזמן להוספת ערכה חדשה מ-3 שעות ל-10 דקות הודות לטבלת הקיבוץ שלנו.
אנו מוסיפים את שדה GROUP_ID ל-b_catalog_product_set דרך שדה משתמש או על ידי הרחבת הטבלה (אם מדיניות העדכון מאפשרת). חלופה ללא שינוי מבנה הטבלה: אחסון קיבוצים בטבלת bl_bundle_option_group נפרדת. מנגנון b_catalog_product_set מתואר ב-תיעוד 1C-Bitrix הרשמי על ערכות מוצרים.
CREATE TABLE bl_bundle_option_group ( id SERIAL PRIMARY KEY, bundle_id INT NOT NULL, group_code VARCHAR(100) NOT NULL, group_name VARCHAR(255), min_select SMALLINT DEFAULT 0, -- минимум выбранных из группы max_select SMALLINT DEFAULT 1, -- максимум выбранных из группы item_ids INT[] NOT NULL, -- массив ITEM_ID из b_catalog_product_set UNIQUE (bundle_id, group_code) ); יישום בחירה מקבוצת אפשרויות עם מינימום/מקסימום
דף הערכה מציג פריטי חובה כלא ניתנים להסרה (עם סימון שלא ניתן להסיר) ואופציונליים כתיבות סימון או לחצני רדיו (אם CREATE TABLE bl_bundle_option_group ( id SERIAL PRIMARY KEY, bundle_id INT NOT NULL, group_code VARCHAR(100) NOT NULL, group_name VARCHAR(255), min_select SMALLINT DEFAULT 0, -- минимум выбранных из группы max_select SMALLINT DEFAULT 1, -- максимум выбранных из группы item_ids INT[] NOT NULL, -- массив ITEM_ID из b_catalog_product_set UNIQUE (bundle_id, group_code) ); בקבוצה).
כאשר הבחירה משתנה, הסקריפט מחשב מחדש את המחיר הכולל. המחיר של כל רכיב אופציונלי נלקח מ-max_select = 1 לפי b_catalog_price שלו. חשוב להתחשב במחירים ספציפיים למשתמש: אם לקונה יש קבוצת מחיר, יש לבדוק PRODUCT_ID. הפתרון המותאם אישית שלנו מהיר פי 10 מהפתרון הסטנדרטי בעת הוספת אפשרויות חדשות לערכה קיימת.
function recalcBundle(selectedItems) { const basePrice = bundleData.basePrice; // цена обязательных позиций let optionsTotal = 0; selectedItems.forEach(itemId => { optionsTotal += bundleData.items[itemId].price; }); document.getElementById('bundle-total').textContent = formatPrice(basePrice + optionsTotal); } בדיקת מלאי לפריטים אופציונליים
זמינות ערכה עם פריטים אופציונליים: אנו בודקים מלאי רק עבור רכיבי חובה. אופציונליים נבדקים בנפרד, ואנו מציגים "זמין N יחידות" ליד כל תיבת סימון. אם פריט אופציונלי אזל, תיבת הסימון מושבתת, אך ניתן לרכוש את הערכה בלעדיו. הנחה על הערכה מוחלת רק כאשר כל הפריטים האופציונליים נבחרים (תצורה מלאה) — מקרה עסקי נפוץ. זה מיושם דרך כלל סל: ההנחה מופעלת כאשר קבוצת הפריטים בעגלה תואמת להרכב הערכה המלא. תנאי הכלל: כל b_catalog_price.CATALOG_GROUP_ID מ-function recalcBundle(selectedItems) { const basePrice = bundleData.basePrice; // цена обязательных позиций let optionsTotal = 0; selectedItems.forEach(itemId => { optionsTotal += bundleData.items[itemId].price; }); document.getElementById('bundle-total').textContent = formatPrice(basePrice + optionsTotal); } נמצאים בעגלה בכמויות הנדרשות. עבור חנות בינונית טיפוסית, יישום פתרון זה עולה כ-$1,500 - $3,000, וחוסך עד 40% על התאמות ערכה עתידיות.
הוספה לסל עם אפשרויות נבחרות
בעת הוספה לסל, יש להעביר את הרכב הערכה — רק את הפריטים שנבחרו. דרך AJAX POST, אנו שולחים ITEM_ID ומערך b_catalog_product_set. בשרת:
// Формируем состав для добавления в корзину $bundle = new \Bitrix\Sale\BasketItem(); // Обязательные позиции берём всегда $requiredItems = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId, 'IS_REQUIRED' => 1], ])->fetchAll(); // Опциональные — только из $_POST['selected_items'] $optionalItems = array_intersect( array_column($requiredItems, 'ITEM_ID'), (array)$_POST['selected_items'] ); ההרכב הסופי מועבר ל-bundle_id. כל רכיב יוצר שורה נפרדת ב-selected_items[] עם דגל // Формируем состав для добавления в корзину $bundle = new \Bitrix\Sale\BasketItem(); // Обязательные позиции берём всегда $requiredItems = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId, 'IS_REQUIRED' => 1], ])->fetchAll(); // Опциональные — только из $_POST['selected_items'] $optionalItems = array_intersect( array_column($requiredItems, 'ITEM_ID'), (array)$_POST['selected_items'] ); .
השוואה בין הגישה הסטנדרטית למותאמת אישית
| מאפיין | מנגנון סטנדרטי | ההרחבה שלנו |
|---|---|---|
| חובה / אופציונלי | רק שדה IS_REQUIRED | קיבוץ עם בחירת מינימום/מקסימום |
| בחירה מקבוצה | לא | כן, דרך bl_bundle_option_group |
| חישוב מחיר דינמי בחזית | לא | דינמי דרך JS |
| מחירים ספציפיים למשתמש | לא | כן, דרך CATALOG_GROUP_ID |
| הנחה לתצורה מלאה | לא | כלל סל |
| בקרת מלאי נפרדת | לא | רק חובה משפיעים על זמינות |
שלבי העבודה
| שלב | משך |
|---|---|
| ניתוח ועיצוב סכמה | 2 עד 5 ימים |
| יצירת טבלת bl_bundle_option_group ומיגרציה | 1 עד 2 ימים |
| שינוי תבנית הרכיב (תיבות סימון, חישוב מחיר) | 3 עד 7 ימים |
| מטפל AJAX להוספה לסל | 2 עד 4 ימים |
| כלל סל להנחה | 1 עד 2 ימים |
| בדיקות ותיעוד | 2 עד 4 ימים |
מה כלול בהתקנה?
- יצירת טבלת
\Bitrix\Catalog\Product\Bundle::Add()עם פרמטרי קיבוץ - שינוי תבנית הרכיב להצגת הערכה (תיבות סימון, חישוב מחיר)
- מטפל AJAX להוספה לסל עם אפשרויות נבחרות
- כלל סל להנחה על תצורה מלאה
- בדיקת מלאי נפרדת לפריטי חובה ואופציונליים
- תיעוד והדרכה לצוות שלך
למה להפקיד בידינו את ההתקנה?
אנו עובדים עם 1C-Bitrix למעלה מ-5 שנים ויישמנו עשרות פרויקטים עם ערכות מותאמות אישית. המומחים המוסמכים שלנו מבטיחים פעולה יציבה לאחר ההשקה. צור קשר להערכת קטלוג — נכין מפרט טכני ונחשב לוחות זמנים. בקש ביקורת פרויקט — היא תסייע לזהות צווארי בקבוק ביישום הערכה הנוכחי שלך. ערכות Bitrix24 יכולות גם הן להפיק תועלת מגישה זו, תוך הבטחת גמישות ומדרגיות.







