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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Настройка раздельных корзин для разных сайтов 1С-Битрикс
Простой
~1 день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1322
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    915
  • 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
    663
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    811
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    710
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1043

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

Типичные ошибки и чек-лист

Пошаговая инструкция по настройке
  1. Определите архитектуру мультисайта (домены, поддомены, общая сессия).
  2. Выберите метод разделения: домены, SITE_ID или событие.
  3. Реализуйте код события или настройте компоненты.
  4. Проверьте счётчик корзины на каждом сайте.
  5. Протестируйте сценарии: добавление, удаление, оформление заказа.
  6. Убедитесь, что обмен с 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С-Битрикс, десятки мультисайтовых проектов. Получите консультацию — это бесплатно.