Налаштування роздільних кошиків для різних сайтів 1С-Бітрікс
Мультисайтова інсталяція зі спільним каталогом породжує неочевидну проблему: кошик у 1С-Бітрікс за замовчуванням прив'язаний до користувача, а не до сайту. Покупець додав товари на роздрібному сайті, перейшов на оптовий — і бачить там той самий кошик. Це неприпустимо, якщо у сайтів різні ціни, правила доставки та тип покупця.
Як працює кошик у 1С-Бітрікс
Кошик зберігається в таблиці b_sale_basket. Ключові поля:
SELECT id, fuser_id, site_id, product_id, quantity, price, currency
FROM b_sale_basket
WHERE fuser_id = 12345;
Поле SITE_ID у кошику є, і 1С-Бітрікс його використовує. Проблема в тому, що fuser_id (fusion user — анонімний користувач) прив'язаний до cookie BITRIX_SM_FUSER_ID, яка є спільною для всіх піддоменів, якщо не налаштовано інакше.
Ізоляція кошиків за сайтами
Метод 1: різні домени без спільних cookies. Найнадійніший спосіб. Якщо сайти працюють на різних доменах (retail.shop.ua і wholesale.shop.ua) або різних доменах другого рівня, cookie fuser_id автоматично не передається між ними. У цьому випадку 1С-Бітрікс із коробки створює окремі кошики.
Перевірка поточної конфігурації:
// /bitrix/php_interface/dbconn.php або .settings.php
// Дивимось SESSION_DOMAIN — якщо однаковий для всіх сайтів, є проблема
$_SESSION['BITRIX_SM_FUSER_ID']; // Один для всіх сайтів
Метод 2: явна передача SITE_ID до компонента кошика. Компонент bitrix:sale.basket.basket приймає параметр SITE_ID. Переконуємося, що він передається коректно:
$APPLICATION->IncludeComponent('bitrix:sale.basket.basket', '.default', [
'SITE_ID' => SITE_ID, // Поточний ID сайту
'PRICE_VAT_SHOW_VALUE' => 'Y',
// ...
]);
Метод 3: програмне розділення через подію. Якщо архітектура не дозволяє розділити домени, підписуємося на подію створення позиції кошика і примусово задаємо 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;
}
Відображення лічильника кошика
Лічильник товарів у хедері — типове місце, де роздільні кошики «ламаються» візуально: відображається сумарна кількість по всіх сайтах. Виправляється явним фільтром:
use Bitrix\Sale\Basket;
use Bitrix\Main\Context;
$basket = Basket::loadItemsForFUser(
\CSaleBasket::GetBasketUserID(),
Context::getCurrent()->getSite() // Передаємо поточний SITE_ID
);
$itemCount = $basket->count();
Терміни
| Конфігурація | Термін |
|---|---|
| Діагностика та налаштування розділення (готова архітектура) | 0,5–1 день |
| Налаштування з програмним розділенням | 1–2 дні |
| Рефакторинг шаблонів + тестування | 2–3 дні |







