Настройка раздельных корзин для разных сайтов 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка раздельных корзин для разных сайтов 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка раздельных корзин для разных сайтов 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 дня