Настройка раздельных корзин для разных сайтов 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 в корзине есть, и Битрикс его использует. Проблема в том, что fuser_id (fusion user — анонимный пользователь) привязан к cookie BITRIX_SM_FUSER_ID, которая общая для всех поддоменов, если не настроено иначе.
Изоляция корзин по сайтам
Метод 1: разные домены без общих cookies. Самый надёжный способ. Если сайты работают на разных доменах (retail.shop.ru и wholesale.shop.ru) или разных доменах второго уровня, cookie fuser_id не пробрасывается между ними автоматически. В этом случае Битрикс из коробки создаёт отдельные корзины.
Проверить текущую конфигурацию:
// /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 дня |







