Настройка раздельных корзин для разных сайтов 1С-Битрикс
Мы сталкивались с мультисайтовыми проектами, где розничный и оптовый сайты делят общий каталог. Проблема: корзина в Битрикс по умолчанию привязана к пользователю, а не к сайту. Покупатель добавил товары на рознице, перешёл на опт — и видит ту же корзину. Это недопустимо, если цены, доставка и тип клиента разные. На практике такое ломает отчётность и путает менеджеров. За 7 лет работы мы настроили раздельные корзины для 30+ мультисайтовых проектов, и вот как это делается.
Почему корзина становится общей? — настройка раздельных корзин
Корзина хранится в таблице 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, которая общая для всех поддоменов, если не настроено иначе. Цитата из документации: «Корзина привязывается к fuser_id, который может быть одинаковым для разных сайтов, если они используют общий домен сессии». Это приводит к смешиванию товаров.
Как выбрать метод разделения?
| Метод | Сложность | Изоляция | Когда использовать |
|---|---|---|---|
| Разные домены | Низкая | 100% | Есть возможность разнести сайты по разным доменам |
| Передача SITE_ID в компонент | Средняя | 90% | Один домен, но нужна быстрая настройка без кода |
| Событие OnBeforeBasketItemAdd | Высокая | 99% | Единый домен, требуется жёсткая привязка |
Метод 1: разные домены без общих cookies
Самый надёжный способ. Если сайты работают на разных доменах (retail.shop.ru и wholesale.shop.ru) или разных доменах второго уровня, cookie fuser_id не пробрасывается автоматически. Битрикс из коробки создаёт отдельные корзины. Этот подход лучше всего подходит для разделения: он исключает влияние соседнего сайта на 100%.
Проверить текущую конфигурацию:
// /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: программное разделение через событие
Если архитектура не позволяет разделить домены, подписываемся на событие OnBeforeBasketItemAdd и принудительно задаём 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;
}
Событие OnBeforeBasketItemAdd — это точка входа, когда данные ещё не записаны. Мы изменяем SITE_ID на текущий перед записью. Гарантия, что корзина будет привязана именно к тому сайту, где совершается покупка.
Как правильно считать товары в корзине?
Счётчик товаров в хедере — типичное место, где раздельные корзины «ломаются» визуально: показывается суммарное количество по всем сайтам. Исправляем явным фильтром:
use Bitrix\Sale\Basket;
use Bitrix\Main\Context;
$basket = Basket::loadItemsForFUser(
\CSaleBasket::GetBasketUserID(),
Context::getCurrent()->getSite() // Передаём текущий SITE_ID
);
$itemCount = $basket->count();
Типичные ошибки и чек-лист
Пошаговая инструкция по настройке
- Определите архитектуру мультисайта (домены, поддомены, общая сессия).
- Выберите метод разделения: домены, SITE_ID или событие.
- Реализуйте код события или настройте компоненты.
- Проверьте счётчик корзины на каждом сайте.
- Протестируйте сценарии: добавление, удаление, оформление заказа.
- Убедитесь, что обмен с 1С и CRM не нарушен.
Частая ошибка — неверная настройка SESSION_DOMAIN в .settings.php. Если он общий, cookie fuser_id пробрасывается между сайтами. Решение — либо разнести домены, либо использовать событие. Ещё одна частая проблема — авторизованный пользователь: даже при разных доменах его корзина хранится в базе по USER_ID, поэтому событие OnBeforeBasketItemAdd обязательно и для залогиненных клиентов. Дополнительно рекомендуем чистить кеш компонентов корзины по тегу catalog_basket, иначе счётчик товаров в шапке может отображать старые значения после переключения между сайтами. При обмене с 1С проверьте, что в выгрузке заказов указан корректный LID — иначе менеджеры увидят заказы в неправильной группе.
Что входит в работу?
- Аудит текущей конфигурации мультисайта (домены, cookie, настройки сессии).
- Выбор оптимального метода разделения корзин (домены, компонент, событие).
- Реализация программного разделения через
OnBeforeBasketItemAdd(если требуется). - Корректировка шаблонов компонентов корзины и малой корзины.
- Настройка счётчика товаров с учётом
SITE_ID. - Тестирование на розничном и оптовом сайте: добавление, изменение, удаление товаров.
- Документирование доработок и передача доступов.
- Гарантийная поддержка 30 дней после сдачи.
Сроки
| Конфигурация | Срок |
|---|---|
| Диагностика и настройка разделения (готовая архитектура) | 0,5–1 день |
| Настройка с программным разделением | 1–2 дня |
| Рефакторинг шаблонов + тестирование | 2–3 дня |
Стоимость рассчитывается индивидуально. Мы оцениваем проект бесплатно — напишите, и мы подберём решение под вашу архитектуру. Наш опыт: 7+ лет в разработке на 1С-Битрикс, десятки мультисайтовых проектов. Получите консультацию — это бесплатно.







