1. Многосайтовость (Multisite) — встроенный механизм
Самый надёжный способ — использовать многосайтовость в рамках одной установки.
В таблице корзины b_sale_basket есть поле LID (ID сайта),
и корзины автоматически разделяются по сайтам.
Как настроить:
На странице Настройки > Настройки продукта > Сайты > Список сайтов
создайте второй сайт с уникальным ID (например s2).
Даже на одном домене можно разместить сайты в подпапках:
example.ru/ — первый сайт, example.ru/shop2/ — второй сайт.
У каждого будет собственная корзина.
Важно: Если нужна сквозная авторизация между сайтами, включите настройку "Распространять авторизацию на все домены" в Настройки > Настройки продукта > Настройки модулей > Главный модуль.
2. Разделение корзин через кастомное поле (программный подход)
Если многосайтовость не подходит, можно добавить к элементам корзины
пользовательское свойство (например, TYPE — "основная" / "оптовая")
и фильтровать данные через события модуля sale.
Шаги реализации:
-
Добавьте пользовательское поле к таблице корзины
Bitrix\Sale\Basketчерез API пользовательских полей. -
При добавлении товара в корзину через
\Bitrix\Sale\BasketItem::setField('PROPERTY_' . $propId, $value)проставляйте метку типа корзины. -
В компонентах вывода корзины (
sale.basket) фильтруйте элементы по значению этого свойства. -
Используйте события
OnSaleBasketItemSetFieldилиOnSaleBasketBeforeSaveдля автоматической установки метки.
3. Работа с FUSER (продвинутый подход через API)
Класс \Bitrix\Sale\Fuser отвечает за идентификатор покупателя.
Технически можно создать несколько FUSER ID для одного пользователя,
но это вмешательство в ядро и требует особой осторожности.
Стандартный путь получения корзины:
$fuserId = \Bitrix\Sale\Fuser::getId();
$basket = \Bitrix\Sale\Basket::loadItemsByFUser($fuserId, $siteId);
Если вы подмените $fuserId в зависимости от условия
(например, GET-параметр, тип пользователя, cookie), система будет
загружать разные корзины для одного и того же посетителя.
4. Кастомное хранилище корзин
Самый гибкий, но и самый трудоёмкий вариант — написать собственную
реализацию хранения корзин (например, через HL-блоки или отдельную таблицу),
не используя стандартную таблицу b_sale_basket. В этом случае
вы полностью контролируете логику разделения: по складу, типу цены,
группе пользователя, валюте и т.д.
Рекомендация
Для большинства сценариев достаточно многосайтовости (п.1) — это штатный механизм, не требующий доработок ядра. Если нужно именно "2 корзины на одной странице", выбирайте п.2 с пользовательскими свойствами и фильтрацией. Программное вмешательство в FUSER (п.3) или полная кастомная реализация (п.4) оправданы только в сложных нестандартных проектах.