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

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

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

Етапи розробки

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

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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

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

Як працює кошик у 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 у кошику є, і 1С-Бітрікс його використовує. Проблема в тому, що fuser_id (fusion user — анонімний користувач) прив'язаний до cookie BITRIX_SM_FUSER_ID, яка є спільною для всіх піддоменів, якщо не налаштовано інакше.

Ізоляція кошиків за сайтами

Метод 1: різні домени без спільних cookies. Найнадійніший спосіб. Якщо сайти працюють на різних доменах (retail.shop.ua і wholesale.shop.ua) або різних доменах другого рівня, cookie fuser_id автоматично не передається між ними. У цьому випадку 1С-Бітрікс із коробки створює окремі кошики.

Перевірка поточної конфігурації:

// /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 дні