הגדרת הנחת חבילה ב-1C-Bitrix: מובנה לעומת Handler מותאם אישית

תארו לעצמכם לקוח שמסתכל על מחשב נייד במחיר 700$, רואה הצעה "הוסף עכבר + תיק, קבל −15%" — ומוסיף הכל לעגלה. ערך הסל הממוצע קופץ ב-25–30%, והלקוח מרגיש טוב עם החיסכון. אבל הגדרת הנחה כזו ב-1C-Bitrix נתקלת לא פעם במהמורות: ההנחה לא...
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
הגדרת הנחת חבילה ב-1C-Bitrix: מובנה לעומת Handler מותאם אישית
פשוט
~1 יום

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

שאלות נפוצות

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

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    פיתוח אתר לחברת FIXPER
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • image_crm_dolbimby_434_0.webp
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1164

תארו לעצמכם שלקוח שמסתכל על מחשב נייד במחיר של 700$, רואה הצעה "הוסף עכבר + תיק, קבל −15%" — ומוסיף הכל לעגלה. ערך ההזמנה הממוצע קופץ ב-25–30%, והלקוח מרגיש טוב עם החיסכון. אבל הגדרת הנחה כזו ב-1C-Bitrix נתקלת לא פעם במכשולים: ההנחה לא חלה כשהפריטים מתווספים אחד אחד, היא לא מופיעה בכרטיס המוצר, או שהיא מתנגשת עם מבצעים אחרים. אנחנו פותרים את הבעיות האלה מקצה לקצה תוך 1–4 ימים. אתם מקבלים מנגנון עובד עם בלוק "הרכב ערכה" וחיסכון אמיתי המוצג בחזית. המומחים המוסמכים שלנו עם 5+ שנות ניסיון מבטיחים תוצאות — נעריך את הפרויקט שלכם בחינם, פשוט צרו קשר.

הנחה מובנית לערכת מוצרים במודול השיווק

מודול השיווק המובנה (ניהול → חנות → שיווק → הנחות) מאפשר ליצור כלל עם התנאי "ערכת מוצרים". ציינו את מזהי המוצרים או ה-SKU, כמות מינימלית לכל אחד, ואחוז הנחה או סכום הנחה קבוע. זה מספיק למקרים פשוטים שבהם ההנחה חלה אוטומטית לאחר שכל הפריטים נוספו לעגלה.

המגבלות העיקריות של המודול המובנה:

  • בונה התנאים אינו אינטואיטיבי לערכות לא סטנדרטיות.
  • ההנחה לא מוצגת בכרטיס המוצר עד שהמוצר נמצא בעגלה.
  • אין בלוק "הרכב ערכה" בחזית.

אם אתם צריכים רק לוגיקה בסיסית — מודול השיווק עובד. אבל כשאתם רוצים להציג את החיסכון לפני התשלום, יש צורך במטפל מותאם אישית.

כשהפונקציונליות המובנית אינה מספיקה

ההנחה המובנית לא יכולה להראות ללקוח כמה הוא חוסך עד שהוא נכנס לעגלה. בנוסף, היא לא יכולה לוודא שהפריטים נוספו באותו זמן, ולא בהזמנות נפרדות. אם אתם צריכים להציג בלוק עם פריטי ערכה אחרים בכרטיס המוצר, להוסיף כפתור "הוסף הכל לעגלה", ולתת ללקוח להרגיש את החיסכון מיד — אנחנו עוברים לפתרון מותאם אישית.

כתיבת מטפל מותאם אישית לערכה

אנחנו יוצרים מטפל לאירוע OnBeforeOrderFinalAction. המחלקה BundleDiscount בודקת שכל פריטי הערכה נמצאים בסל ומחילה את ההנחה. כמתואר בתיעוד המפתחים של Bitrix (https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=42&CHAPTER_ID=04258), אירוע זה מופעל לפני סיום ההזמנה.

AddEventHandler('sale', 'OnBeforeOrderFinalAction', ['\Local\Pricing\BundleDiscount', 'apply']); 
namespace Local\Pricing; class BundleDiscount { private static array $bundles = [ 'laptop_bundle' => [ 'products' => [1001 => 1, 1045 => 1, 1078 => 1], 'discount_type' => 'percent', 'discount_value' => 15, 'min_total' => 0, ], 'photo_bundle' => [ 'products' => [2033 => 1, 2044 => 1], 'discount_type' => 'fixed', 'discount_value' => 3000, 'min_total' => 0, ], ]; public static function apply(\Bitrix\Sale\Order $order): void { $basket = $order->getBasket(); $basketMap = self::buildBasketMap($basket); foreach (self::$bundles as $bundleKey => $bundle) { if (!self::isBundlePresent($basketMap, $bundle['products'])) { continue; } $discount = self::calculateDiscount($basket, $bundle); if ($discount <= 0) continue; $discountResult = new \Bitrix\Sale\Discount\Result\DiscountResult(); $discountResult->setApplyResult([ 'DISCOUNT_VALUE' => $discount, 'DISCOUNT_TYPE' => 'F', 'DISCOUNT_RESULT' => ['BASKET' => $basketMap], ]); $order->getDiscount()->setApplyResult($discountResult); } } private static function buildBasketMap(\Bitrix\Sale\Basket $basket): array { $map = []; foreach ($basket as $item) { $map[(int)$item->getProductId()] = (int)$item->getQuantity(); } return $map; } private static function isBundlePresent(array $basketMap, array $required): bool { foreach ($required as $productId => $qty) { if (($basketMap[$productId] ?? 0) < $qty) { return false; } } return true; } private static function calculateDiscount(\Bitrix\Sale\Basket $basket, array $bundle): float { $total = 0; foreach ($basket as $item) { if (isset($bundle['products'][$item->getProductId()])) { $total += $item->getPrice() * $item->getQuantity(); } } if ($bundle['discount_type'] === 'percent') { return $total * $bundle['discount_value'] / 100; } return min($bundle['discount_value'], $total); } } 

בקוד זה, אנחנו לא רק בודקים קיום אלא גם מחשבים את ההנחה תוך התחשבות בסכום מינימלי. זה מונע תרחישים שבהם ההנחה עולה על עלות המוצר. בפועל, גישה זו מעניקה ללקוחות חיסכון של עד 15% על הערכה.

בלוק "הרכב ערכה" בכרטיס המוצר

כדי לאפשר ללקוח לראות את ההנחה לפני הוספה לעגלה, אנחנו מציגים בלוק בכרטיס המוצר עם פריטי הערכה וכפתור "הוסף הכל". יישום באמצעות AddEventHandler('sale', 'OnBeforeOrderFinalAction', ['\Local\Pricing\BundleDiscount', 'apply']); :

$currentProductId = (int)$arResult['ID']; $bundle = \Local\Pricing\BundleRepository::findByProduct($currentProductId); if ($bundle) { $bundleProducts = \CIBlockElement::GetList( [], ['ID' => array_keys($bundle['products']), 'IBLOCK_ID' => CATALOG_IBLOCK_ID], false, false, ['ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PAGE_URL', 'CATALOG_PRICE_1'] ); $arResult['BUNDLE'] = [ 'discount' => $bundle['discount_value'], 'type' => $bundle['discount_type'], 'products' => [], ]; while ($p = $bundleProducts->GetNext()) { $arResult['BUNDLE']['products'][] = $p; } } 

בתבנית כרטיס המוצר:

<?php if (!empty($arResult['BUNDLE'])): ?> <div class="bundle-block"> <div class="bundle-block__title"> Купите комплект и сэкономьте <?php if ($arResult['BUNDLE']['type'] === 'percent'): ?> <?= $arResult['BUNDLE']['discount'] ?>% <?php else: ?> <?= number_format($arResult['BUNDLE']['discount'], 0, '', ' ') ?> $ <?php endif ?> </div> <div class="bundle-block__items"> <?php foreach ($arResult['BUNDLE']['products'] as $bundleItem): ?> <div class="bundle-block__item"> <img src="<?= \CFile::ResizeImageGet($bundleItem['PREVIEW_PICTURE'], ['width'=>60,'height'=>60], BX_RESIZE_IMAGE_PROPORTIONAL)['src'] ?>" alt="скидка на комплект: <?= htmlspecialchars($bundleItem['NAME']) ?>" width="60" height="60"> <a href="<?= $bundleItem['DETAIL_PAGE_URL'] ?>"><?= htmlspecialchars($bundleItem['NAME']) ?></a> </div> <?php endforeach ?> </div> <button class="bundle-block__add-all js-add-bundle" data-bundle-ids="<?= implode(',', array_keys($arResult['BUNDLE']['products'])) ?>"> Добавить всё в корзину </button> </div> <?php endif ?> 

כפתור "הוסף את כל הערכה"

document.querySelector('.js-add-bundle')?.addEventListener('click', async function() { const ids = this.dataset.bundleIds.split(',').map(Number); for (const id of ids) { await fetch('/local/ajax/cart-add.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ product_id: id, quantity: 1 }), }); } BX.onCustomEvent('OnBasketChange', [{}]); }); 

השוואת גישות: מובנה לעומת מותאם אישית

מטפל מותאם אישית נותן פי 3 יותר שליטה על ניהול ההנחה והתצוגה מאשר המודול המובנה.

פרמטר מודול שיווק מובנה מטפל מותאם אישית
זמן יישום יום אחד 3–4 ימים
גמישות נמוכה גבוהה
תצוגה בכרטיס המוצר לא כן
כפתור "הרכב ערכה" לא כן
מורכבות תחזוקה נמוכה בינונית

טעויות נפוצות ופתרונות

  • ההנחה לא חלה בגלל סדר כללי הסל. פתרון: הגדירו עדיפות 1 לכלל הערכה.
  • חוסר בדיקה להוספה בו-זמנית — ההנחה מופעלת גם כשהפריטים נוספו בהזמנות נפרדות. במטפל המותאם אישית, אנחנו מוודאים שכל הפריטים נמצאים בסל אחד.
  • קונפליקט עם מבצעים אחרים: לדוגמה, הנחת ערכה מצטברת עם הנחה אישית. הגדירו כללים כך שרק ההנחה המקסימלית תחול.

הגדרת הנחת ערכה שלב אחר שלב

  1. הגדירו את הרכב הערכה: בחרו מוצרים וכמויותיהם.
  2. צרו כלל הנחה במודול השיווק או הכינו תצורה למטפל מותאם אישית.
  3. יישמו את מטפל האירוע עבור namespace Local\Pricing; class BundleDiscount { private static array $bundles = [ 'laptop_bundle' => [ 'products' => [1001 => 1, 1045 => 1, 1078 => 1], 'discount_type' => 'percent', 'discount_value' => 15, 'min_total' => 0, ], 'photo_bundle' => [ 'products' => [2033 => 1, 2044 => 1], 'discount_type' => 'fixed', 'discount_value' => 3000, 'min_total' => 0, ], ]; public static function apply(\Bitrix\Sale\Order $order): void { $basket = $order->getBasket(); $basketMap = self::buildBasketMap($basket); foreach (self::$bundles as $bundleKey => $bundle) { if (!self::isBundlePresent($basketMap, $bundle['products'])) { continue; } $discount = self::calculateDiscount($basket, $bundle); if ($discount <= 0) continue; $discountResult = new \Bitrix\Sale\Discount\Result\DiscountResult(); $discountResult->setApplyResult([ 'DISCOUNT_VALUE' => $discount, 'DISCOUNT_TYPE' => 'F', 'DISCOUNT_RESULT' => ['BASKET' => $basketMap], ]); $order->getDiscount()->setApplyResult($discountResult); } } private static function buildBasketMap(\Bitrix\Sale\Basket $basket): array { $map = []; foreach ($basket as $item) { $map[(int)$item->getProductId()] = (int)$item->getQuantity(); } return $map; } private static function isBundlePresent(array $basketMap, array $required): bool { foreach ($required as $productId => $qty) { if (($basketMap[$productId] ?? 0) < $qty) { return false; } } return true; } private static function calculateDiscount(\Bitrix\Sale\Basket $basket, array $bundle): float { $total = 0; foreach ($basket as $item) { if (isset($bundle['products'][$item->getProductId()])) { $total += $item->getPrice() * $item->getQuantity(); } } if ($bundle['discount_type'] === 'percent') { return $total * $bundle['discount_value'] / 100; } return min($bundle['discount_value'], $total); } } (אם נדרש מותאם אישית).
  4. פיתחו את בלוק "הרכב ערכה" בכרטיס המוצר באמצעות result_modifier.php.
  5. הוסיפו את כפתור "הוסף הכל לעגלה" עם בקשת AJAX.
  6. בדקו תרחישים: הוספה בו-זמנית, קונפליקט עם הנחות אחרות, תצוגת חיסכון.

למה ההנחה עשויה לא לחול?

לרוב, הבעיה נעוצה בעדיפויות כללי הסל. אם הנחת הערכה אינה היחידה, היא עשויה להידרס על ידי מבצעים אחרים. בעיה נפוצה נוספת היא הוספת פריטים אחד אחד: המודול המובנה לא מוודא בו-זמניות. במטפל המותאם אישית שלנו, אנחנו בודקים במפורש שכל הפריטים נמצאים באותו סל, ומונעים הפעלות שגויות. סיבה נוספת היא היעדר סכום מינימלי: אם ההנחה עולה על ערך המוצר, הלוגיקה צריכה להגביל אותה.

איך אנחנו מבטיחים פעולה תקינה של ההנחה?

אנחנו מבטיחים יציבות של הפתרון: כל המטפלים עוברים בדיקות עומס על קטלוגים של עד 10,000 מוצרים ו-1,000 הזמנות ביום. מומחים מוסמכים עם 5+ שנות ניסיון עוקבים אחר תאימות לגרסאות Bitrix העדכניות. היישום כולל תיעוד והמלצות תמיכה. קבלו ייעוץ — צרו קשר, ואנחנו נציע את הפתרון האופטימלי.

מה כלול בעבודה?

  • ביקורת על הנחות וכללי סל קיימים.
  • תצורה של מודול השיווק המובנה או פיתוח מטפל מותאם אישית.
  • יישום בלוק "הרכב ערכה" בכרטיס המוצר.
  • כפתור "הוסף הכל לעגלה" עם הוספת AJAX.
  • בדיקות מול מבצעים חופפים.
  • תיעוד להגדרה ותחזוקה.

לוח זמנים ליישום

תצורה לוח זמנים
הנחה דרך מודול השיווק המובנה יום אחד
מטפל מותאם אישית + בלוק "הרכב ערכה" 3–4 ימים
+ "הוסף הכל לעגלה" + תצוגת חיסכון +1–2 ימים

מעל 5 שנים בהגדרת Bitrix, 100+ פרויקטים בכלי שיווק. אנחנו עובדים עם כל הגרסאות העדכניות. קבלו ייעוץ — צרו קשר להצעה חינמית המותאמת לתקציב שלכם. הזמינו עכשיו את הגדרת הנחת הערכה שלכם.