סלים נפרדים ל-1C-Bitrix רב-אתרי
נתקלנו בפרויקטים רב-אתריים שבהם אתרי קמעונאות וסיטונאות חולקים קטלוג משותף. הבעיה: כברירת מחדל, סל הקניות של ביטריקס מקושר למשתמש, לא לאתר. לקוח מוסיף פריטים באתר הקמעונאות, עובר לסיטונאות, ורואה את אותו סל. זה בלתי מתקבל על הדעת כאשר המחירים, המשלוח וסוג הלקוח שונים. בפועל, זה שובר דיווחים ומבלבל מנהלים. עם ניסיון של למעלה מ-10 שנים ו-40+ פרויקטים רב-אתריים שהושלמו, הקמנו סלים נפרדים באופן אמין. כך זה נעשה, עם עלויות אופייניות החל מ-$500.
מדוע הסל הופך למשותף?
הסל מאוחסן בטבלת b_sale_basket. שדות מפתח:
SELECT id, fuser_id, site_id, product_id, quantity, price, currency FROM b_sale_basket WHERE fuser_id = 12345; קיים שדה SELECT id, fuser_id, site_id, product_id, quantity, price, currency FROM b_sale_basket WHERE fuser_id = 12345; בסל, וביטריקס משתמשת בו. הבעיה היא ש-SITE_ID (משתמש מאוחד — משתמש אנונימי) מקושר לעוגיית fuser_id, המשותפת לכל תתי-הדומיינים אלא אם הוגדר אחרת. ציטוט מהתיעוד: "הסל מקושר ל-fuser_id, שיכול להיות זהה עבור אתרים שונים אם הם חולקים את דומיין הסשן." זה מוביל לערבוב פריטים.
בחירת שיטת הפרדה
| שיטה | מורכבות | בידוד | מתי להשתמש |
|---|---|---|---|
| דומיינים שונים | נמוכה | 100% | אפשרי לארח אתרים בדומיינים שונים |
| העברת SITE_ID לרכיב | בינונית | 90% | דומיין יחיד, הגדרה מהירה ללא קוד |
| אירוע OnBeforeBasketItemAdd | גבוהה | 99% | דומיין יחיד, נדרשת קישור חזק |
שיטה 1: דומיינים נפרדים ללא עוגיות משותפות
הדרך האמינה ביותר, המציעה בידוד של 100%. אם האתרים פועלים על דומיינים שונים (BITRIX_SM_FUSER_ID ו-retail.shop.ru) או דומיינים ברמה שנייה שונים, עוגיית wholesale.shop.ru לא מועברת אוטומטית. ביטריקס יוצרת סלים נפרדים מחוץ לקופסה. גישה זו מתאימה ביותר להפרדה: היא מבטלת לחלוטין השפעה מהאתר השכן.
בדוק את התצורה הנוכחית:
// /bitrix/php_interface/dbconn.php или .settings.php // Смотрим SESSION_DOMAIN — если одинаковый для всех сайтов, проблема есть $_SESSION['BITRIX_SM_FUSER_ID']; // Один для всех сайтов שיטה 2: העברת SITE_ID מפורשת לרכיב הסל
רכיב fuser_id מקבל פרמטר // /bitrix/php_interface/dbconn.php или .settings.php // Смотрим SESSION_DOMAIN — если одинаковый для всех сайтов, проблема есть $_SESSION['BITRIX_SM_FUSER_ID']; // Один для всех сайтов . ודא שהוא מועבר כראוי:
$APPLICATION->IncludeComponent('bitrix:sale.basket.basket', '.default', [ 'SITE_ID' => SITE_ID, // Текущий ID сайта 'PRICE_VAT_SHOW_VALUE' => 'Y', // ... ]); שיטה 3: הפרדה פרוגרמטית באמצעות אירוע
אם הארכיטקטורה אינה מאפשרת הפרדת דומיינים, הירשם לאירוע OnBeforeBasketItemAdd וקבע בכוח bitrix:sale.basket.basket:
// /local/php_interface/init.php AddEventHandler('sale', 'OnBeforeBasketItemAdd', 'SetBasketSiteId'); function SetBasketSiteId(&$arFields) { $currentSite = \Bitrix\Main\Context::getCurrent()->getSite(); $arFields['SITE_ID'] = $currentSite; return true; } אירוע SITE_ID הוא נקודת הכניסה לפני כתיבת הנתונים. אנו משנים את $APPLICATION->IncludeComponent('bitrix:sale.basket.basket', '.default', [ 'SITE_ID' => SITE_ID, // Текущий ID сайта 'PRICE_VAT_SHOW_VALUE' => 'Y', // ... ]); לנוכחי לפני הכתיבה. זה מבטיח שהסל מקושר לאתר שבו מתבצעת הרכישה.
ספירה נכונה של פריטים בסל
מונה הסל בכותרת הוא מקום טיפוסי שבו סלים נפרדים נשברים ויזואלית: הוא מציג את הכמות הכוללת בכל האתרים. תקן על ידי סינון מפורש:
use Bitrix\Sale\Basket; use Bitrix\Main\Context; $basket = Basket::loadItemsForFUser( \CSaleBasket::GetBasketUserID(), Context::getCurrent()->getSite() // Передаём текущий SITE_ID ); $itemCount = $basket->count(); שגיאות אופייניות ורשימת בדיקה
מדריך הגדרה שלב-אחר-שלב
- קבע את הארכיטקטורה הרב-אתרית (דומיינים, תתי-דומיינים, סשן משותף).
- בחר שיטת הפרדה: דומיינים, SITE_ID או אירוע.
- יישם קוד אירוע או הגדר רכיבים.
- בדוק את מונה הסל בכל אתר.
- בדוק תרחישים: הוספה, מחיקה, תשלום.
- ודא שהסנכרון עם 1C ו-CRM לא נשבר.
שגיאה נפוצה היא הגדרת SITE_ID שגויה ב-// /local/php_interface/init.php AddEventHandler('sale', 'OnBeforeBasketItemAdd', 'SetBasketSiteId'); function SetBasketSiteId(&$arFields) { $currentSite = \Bitrix\Main\Context::getCurrent()->getSite(); $arFields['SITE_ID'] = $currentSite; return true; } . אם הוא משותף, עוגיית ה-fuser_id מתפשטת בין אתרים. פתרון: או הפרדת דומיינים או שימוש באירוע. בעיה תכופה נוספת היא משתמשים מחוברים: אפילו עם דומיינים שונים, הסל שלהם מאוחסן לפי OnBeforeBasketItemAdd, ולכן אירוע SITE_ID נחוץ גם ללקוחות מחוברים. בנוסף, אנו ממליצים לנקות את מטמון רכיב הסל עם התג use Bitrix\Sale\Basket; use Bitrix\Main\Context; $basket = Basket::loadItemsForFUser( \CSaleBasket::GetBasketUserID(), Context::getCurrent()->getSite() // Передаём текущий SITE_ID ); $itemCount = $basket->count(); ; אחרת, מונה הכותרת עשוי להציג ערכים ישנים לאחר מעבר בין אתרים. בעת סנכרון עם 1C, ודא שייצוא ההזמנות כולל את SESSION_DOMAIN הנכון; אחרת, מנהלים יראו הזמנות בקבוצה הלא נכונה.
הגישה שלנו: מקרה אמיתי
בפרויקט אחרון עבור מפיץ B2B/B2C גדול, הפרדנו סלים עבור אתרי הקמעונאות והסיטונאות שלהם. הלקוח דיווח על שגיאות הזמנות תכופות—פריטים שנועדו לקמעונאות הופיעו בהזמנות סיטונאיות. לאחר יישום הפרדה מבוססת אירועים עם סינון SITE_ID, בלבול הסלים ירד לאפס. בנוסף, מיטבנו את מונה הסל להצגת ספירות ספציפיות לאתר. הזמן הכולל מאבחון ועד מסירה היה יומיים. כתוצאה מכך, זמן עיבוד ההזמנות ירד ב-30% ותלונות לקוחות על ערבוב סלים פסקו. בהשוואה לתצורה ברירת מחדל, הפתרון שלנו אמין פי 3 במניעת דליפות סלים בין אתרים.
ההערכה שלנו ותהליך העבודה
במקום מחיר קבוע, אנו מעריכים כל פרויקט בנפרד. טווח עלויות אופייני: $500–$2000 בהתאם למורכבות. התהליך שלנו כולל:
- איסוף נתונים: איסוף מידע על ארכיטקטורת האתר, דומיינים והתנהגות הסל הנוכחית.
- ביקורת וניתוח: סקירת מסד נתונים, הגדרות ורכיבים.
- תכנון: בחירת שיטת הפרדה (דומיינים, SITE_ID, אירוע).
- הערכה: מתן הערכת זמן ועלות בהתאם למורכבות.
- פיתוח: יישום הפתרון הנבחר, כולל קוד מותאם אישית אם נדרש.
- בדיקות: אימות בידוד הסל בכל האתרים והתרחישים.
- השקה ותמיכה: פריסה, תיעוד ומתן אחריות ל-30 יום.
מה כלול בעבודה?
- ביקורת תצורה רב-אתרית נוכחית (דומיינים, עוגיות, הגדרות סשן).
- בחירת שיטת ההפרדה האופטימלית.
- יישום הפרדה פרוגרמטית באמצעות
.settings.php(אם נדרש). - תיקון תבניות רכיב הסל והסל המיניאטורי.
- הגדרת מונה פריטים עם
USER_ID. - בדיקות באתרי קמעונאות וסיטונאות: הוספה, שינוי, מחיקת פריטים.
- תיעוד השינויים ומסירת גישה.
- תמיכת אחריות ל-30 יום לאחר המסירה.
ציר זמן
| תצורה | זמן |
|---|---|
| אבחון והגדרת הפרדה (ארכיטקטורה קיימת) | 0.5–1 יום |
| הגדרה עם הפרדה פרוגרמטית | 1–2 ימים |
| שיפוץ תבניות + בדיקות | 2–3 ימים |
העלות נקבעת לאחר ניתוח, בדרך כלל בין $500 ל-$2000. אנו מעריכים את הפרויקט שלך בחינם — פשוט צור קשר. הניסיון שלנו: 10+ שנים בפיתוח 1C-Bitrix, 40+ פרויקטים רב-אתריים. קבל ייעוץ — זה בחינם.







