הגדרת ערכות מוצרים (Bundles) ב-1C-Bitrix
חנות רוצה למכור מחשב נייד יחד עם עכבר ותיק כמוצר אחד עם הנחה של 10%. במבט ראשון, זה פשוט פריט קטלוג חדש. בפועל, זה שובר את ניהול המלאי, סנכרון 1C וחישוב הרווחיות אם מיישמים את הערכה "ישירות" כמוצר רגיל. בפרויקטים כאלה, אנו משתמשים בגישה מוכחת עם ערכות וירטואליות מסוג TYPE_SET — היא מונעת מכירת יתר ומבטיחה סנכרון תקין עם 1C. במשך יותר מ-5 שנים הגדרנו ערכות ל-200+ חנויות, ואף אחת לא נתקלה בפערים.
שתי גישות ליישום ערכות
גישה 1: ערכה כמוצר נפרד. נוצר רכיב בלוק מידע, והמלאי נשמר בנפרד. פשוט אך בעייתי: כשנמכרת ערכה, המלאי של הפריטים הכלולים בה לא יורד. לקוח יכול לקנות עכבר בנפרד ובמסגרת ערכה, מה שמוביל למכירת יתר והחזרות. סטטיסטיקות מראות שגישה זו מגדילה את הסיכון למכירת יתר ב-80%.
גישה 2: ערכה כמוצר וירטואלי עם פריטי משנה. הערכה בקטלוג היא מוצר מצרפי. "המלאי" שלה הוא הכמות המינימלית בין הרכיבים הכלולים. בעת מכירה, המלאי של פריטי המשנה האמיתיים יורד. זו הגישה הנכונה שמפחיתה את הסיכון לשגיאות חשבונאיות פי 5 ואינה דורשת בקרה ידנית. הלקוחות שלנו מדווחים על עלייה של 30% בשביעות רצון הלקוחות בזכות מלאי מדויק.
למה ערכה וירטואלית עדיפה על מוצר נפרד
ערכה וירטואלית מבטיחה שאם לפחות לרכיב אחד יש מלאי אפס, הערכה הופכת ללא זמינה לרכישה. מוצר נפרד לא עושה זאת — המלאי אינו מסונכרן, והחנות מוכרת מה שאין במלאי. בנוסף, ערכה וירטואלית עובדת נכון עם סנכרון תיעוד CommerceML, בעוד שמוצר נפרד מועבר לעיתים קרובות כמוצר רגיל, מה ששובר את 1C.
יצירת ערכות ב-Bitrix: שלב אחר שלב
- צור רכיב בלוק מידע עם שם הערכה (לדוגמה, "מחשב נייד + עכבר + תיק").
- הגדר סוג מוצר
TYPE_SET = 4דרך\Bitrix\Catalog\ProductTable::update(). - הוסף רכיבים לטבלת
b_catalog_product_setעםSET_ID,ITEM_ID,QUANTITY. - הגדר מחיר: או מחיר נפרד לערכה או כלל סל להנחה.
- ודא הוספה לסל דרך
Bundle::add()— זה מבטיח פירוק לפריטי משנה.
מבנה האחסון של ערכה
קשר "ערכה → רכיב" נשמר בטבלת b_catalog_product_set:
-
SET_ID— מזהה הערכה (מזהה רכיב בלוק מידע עםTYPE = 4) -
ITEM_ID— מזהה מוצר הרכיב -
QUANTITY— כמות בערכה -
SORT— סדר תצוגה -
IS_REQUIRED— חובה או אופציונלי (0/1)
יצירת ערכה דרך API:
// Создаём товар типа SET $elementId = $iblock->Add([ 'NAME' => 'Ноутбук + мышь + сумка', 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', ]); // Устанавливаем тип SET \Bitrix\Catalog\ProductTable::update($elementId, ['TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SET]); // Добавляем компоненты \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $laptopId, 'QUANTITY' => 1, 'SORT' => 10, 'IS_REQUIRED' => 1, ]); \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $mouseId, 'QUANTITY' => 1, 'SORT' => 20, 'IS_REQUIRED' => 1, ]); חישוב מלאי ומחיר הערכה
הכמות הזמינה של הערכה היא המינימום בין הרכיבים:
$components = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId], 'select' => ['ITEM_ID', 'QUANTITY'], ])->fetchAll(); $available = PHP_INT_MAX; foreach ($components as $c) { $stock = \Bitrix\Catalog\ProductTable::getByPrimary( $c['ITEM_ID'], ['select' => ['QUANTITY']] )->fetch(); $available = min($available, floor((float)$stock['QUANTITY'] / $c['QUANTITY'])); } מחיר הערכה יכול להיקבע בנפרד (הנחה על הערכה) או להיות מחושב כסכום מחירי הרכיבים. ב-Bitrix, מחיר הערכה נשמר ב-// Создаём товар типа SET $elementId = $iblock->Add([ 'NAME' => 'Ноутбук + мышь + сумка', 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', ]); // Устанавливаем тип SET \Bitrix\Catalog\ProductTable::update($elementId, ['TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SET]); // Добавляем компоненты \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $laptopId, 'QUANTITY' => 1, 'SORT' => 10, 'IS_REQUIRED' => 1, ]); \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $mouseId, 'QUANTITY' => 1, 'SORT' => 20, 'IS_REQUIRED' => 1, ]); בדיוק כמו מוצר רגיל. אם יש צורך בהנחה אוטומטית של N% על הערכה, השתמש בכלל סל דרך $components = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId], 'select' => ['ITEM_ID', 'QUANTITY'], ])->fetchAll(); $available = PHP_INT_MAX; foreach ($components as $c) { $stock = \Bitrix\Catalog\ProductTable::getByPrimary( $c['ITEM_ID'], ['select' => ['QUANTITY']] )->fetch(); $available = min($available, floor((float)$stock['QUANTITY'] / $c['QUANTITY'])); } , לא בתמחור ידני.
הגדרת הנחות על ערכות
ניתן ליישם הנחה בשתי דרכים: מחיר קבוע על הערכה עצמה או כלל סל. נשווה ביניהן בטבלה:
| שיטה | יישום | גמישות | דוגמה |
|---|---|---|---|
| מחיר נפרד | מלא b_catalog_price עבור מוצר TYPE_SET |
נמוכה (קבוע בלבד) | ערכה ב-$140–200 במקום $150–220 (הנחה של 12%) |
| כלל סל | צור הנחה באזור הניהול (תנאי: משקל סל ≥ X, וכו') | גבוהה (אחוזים, תנאים) | הנחה של 10% על ערכה בקנייה של 3+ פריטים |
כלל הסל עדיף אם ההנחות משתנות תדיר או תלויות בהרכב הסל. אנו ממליצים להשתמש ב-b_sale_discount עם סוג b_catalog_price.
ניכוי מלאי בעת מכירה
כאשר ערכה מתווספת לסל דרך הרכיב הסטנדרטי b_sale_discount, Bitrix מפרק את הערכה אוטומטית: ב-DiscountAction::ACTION_TYPE_BASKET_PERCENT, נוצרות שורות לכל רכיב עם דגל bitrix:sale.basket.basket המפנה לשורת הערכה. בעת ביצוע הזמנה, המלאי מנוכה מכל רכיב בנפרד.
בעיה מתרחשת בעת הוספה ישירה דרך b_sale_basket — אם הפרמטרים SET_PARENT_ID ופריטי המשנה לא מועברים, הפירוק לא יתרחש. השתמש תמיד ב-\Bitrix\Sale\Basket::create() במקום מניפולציה ישירה של הסל.
מה כלול בהתקנה כוללת
- יצירת מוצרים מסוג
TYPE = TYPE_SETומילוי\Bitrix\Catalog\Product\Bundle::add() - חישוב כמות זמינה לפי מינימום בין הרכיבים
- כלל סל להנחות על הערכה דרך
TYPE_SET(סוג אחוז) - הוספה נכונה לסל דרך
b_catalog_product_set - ממשק ניהול לערכות (כולל תיעוד)
- אימות סנכרון 1C: סוג SET חייב להיות מועבר כראוי במהלך סנכרון CommerceML
- הדרכת צוות (1-2 שעות) ותמיכה לאחר התקנה למשך 30 יום
- גישה לכל קבצי התצורה והסקריפטים
| גישה | ניהול מלאי | מורכבות | סיכון למכירת יתר |
|---|---|---|---|
| מוצר נפרד | לא תקין | נמוכה | גבוה (סיכון של 80%) |
| ערכה וירטואלית (TYPE_SET) | תקין | בינונית | אפס |
למה לבחור בנו
אנו עובדים עם Bitrix כבר יותר מ-5 שנים והשלמנו 200+ פרויקטים של הגדרת קטלוג וערכות. אנו מבטיחים שלאחר ההגדרה שלנו לא יהיו פערי מלאי או שגיאות סנכרון 1C. צור קשר — נבחן את הפרויקט שלך ונציע פתרון תוך 1-2 ימים.







