Налаштування окремих кошиків для різних сайтів 1С-Бітрікс

Налаштування окремих кошиків для різних сайтів 1С-Бітрікс Ми стикалися з мультисайтовими проєктами, де роздрібний та оптовий сайти ділять спільний каталог. Проблема: кошик у Бітрікс за замовчуванням прив'язаний до користувача, а не до сайту. Покупець додав товари на роздробі, перейшов на опт — і
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Налаштування окремих кошиків для різних сайтів 1С-Бітрікс
Простий
~1 день

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

Часті запитання

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1466
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1019
  • Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    764
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    882
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    811
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1167

Налаштування окремих кошиків для різних сайтів 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: різні домени без спільних cookie

Найнадійніший спосіб. Якщо сайти працюють на різних доменах (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С-Бітрікс, десятки мультисайтових проєктів. Отримайте консультацію — це безкоштовно.