Битрикс управление сайтом корзина

Разбираемся, как в Битрикс управление сайтом и корзина работают вместе: настройка, кастомизация и лайфхаки для удобного интернет-магазина.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Корзина заказов — это сердце любого интернет-магазина на платформе 1С-Битрикс: Управление сайтом. От правильной настройки компонентов корзины зависит конверсия‚ удобство пользователей и корректность обработки заказов. В этой статье мы подробно разберем архитектуру современных компонентов корзины‚ типичные проблемы при интеграции (в частности‚ в условиях многосайтовости) и подходы к кастомизации для вывода дополнительных свойств товаров.

Архитектура компонентов корзины в современном Битриксе

Начиная с версий модуля sale (модуль «Интернет-магазин» новой генерации)‚ структура компонентов кардинально изменилась. Ранее использовался монолитный sale.basket.basket‚ теперь же функционал разделен на специализированные компоненты по методологии «Компоненты 2.0»:

  • sale.basket.basket.line (или basket.basket.line в старых неймспейсах) — компонент строки товара. Отвечает за рендеринг отдельной позиции: изображение‚ название‚ свойства SKU‚ количество‚ цена‚ кнопки удаления/изменения количества.
  • sale.basket.basket.small — компонент «Маленькая корзина» (выпадающий блок в хедере)‚ обычно работает через AJAX.

Важно: Данные между этими компонентами передаются через общий контекст (переменные $arResult и JS-объекты BX;Sale.BasketComponent). Разделение позволяет гибко верстать шаблоны и переиспользовать строки товаров в разных местах (например‚ в попапе быстрого заказа и на странице оформления).

Типичная проблема: Расхождение данных между sale.basket.basket и basket.basket.line

Частая ситуация на форумах разработчиков (например‚ на dev.1c-bitrix.ru): на одной странице размещены оба компонента‚ но sale.basket.basket показывает 0 товаров‚ в то время как basket.basket.line корректно выводит реальное количество позиций.

Причина: Многосайтовость и привязка корзины к сайту

В Битриксе корзина привязана к ID сайта (LID / SITE_ID). Если на одном домене/поддомене работает несколько сайтов (многосайтовость)‚ а компоненты вызваны без явного указания параметра SITE_ID‚ может возникнуть рассинхрон:

  1. Компонент basket.basket.line часто работает в контексте текущей страницы и корректно определяет SITE_ID через ядро.
  2. Компонент sale.basket.basket (особенно если он вызывается в header.php или footer.php вне основного контента‚ или через bitrix:main.include) может выполняться в контексте «главного» сайта портала (обычно s1)‚ игнорируя текущий сайт (s2‚ s3…).

В результате sale.basket.basket читает корзину сайта s1 (которая пуста)‚ а basket.basket.line — корзину сайта s2 (где лежат товары).

Решение проблемы

  1. Явная передача SITE_ID. В параметрах вызова компонента sale.basket.basket обязательно укажите "SITE_ID" => SITE_ID (константа текущего сайта).
  2. Проверка шаблонов. Даже если компоненты «немодифицированные»‚ проверьте‚ не скопированы ли их шаблоны в /bitrix/templates/.default/components/... или в шаблон сайта с ошибками. Как отмечали эксперты на форуме: «Компонент sale.basket.basket не показывает нулевое количество [по умолчанию]. Значит‚ проблема где-то в другом месте».
  3. Очистка кэша. Компоненты корзины активно кэшируются. После изменений в настройках многосайтовости обязательно сбросьте кэш компонента и управляемый кэш (/bitrix/managed_cache/).
  4. Настройки модуля Sale. Проверьте настройки модуля «Интернет-магазин» -> «Настройки корзины» -> «Привязка корзины к сайту».

Совет: Если проблема не решается стандартными методами‚ подготовьте доступы (админка‚ FTP/SSH) и обратитесь в Техническую поддержку 1С-Битрикс. Контакты ТП: email info@‚ тел. (Москва)‚ тел. * (Калининград). Режим работы: 10:00–19:00 МСК.

Стандартный компонент sale.basket.basket выводит базовые поля товара (ID‚ название‚ цена‚ количество‚ свойства SKU). Часто бизнес требует вывести в корзине: анонс товара‚ детальную картинку‚ бренд‚ артикул из основного инфоблока‚ которые не являются свойствами SKU.

Поскольку в массиве $arResult['BASKET_ITEMS'] нет прямых ссылок на элемент инфоблока (только PRODUCT_ID и IBLOCK_ID)‚ требуется доработка.

Алгоритм кастомизации (Best Practice)

  1. Копирование компонента в свое пространство имен.

    Никогда не правьте стандартные компоненты в /bitrix/components/bitrix/. Скопируйте папку sale.basket.basket в /local/components/demo/sale.basket.basket/ (или ваш неймспейс).

  2. Редактирование class.php (или component.php в старых версиях).

    В методе executeComponent или при подготовке данных (обычно в обработчике OnBeforeBasketItemUpdate или прямо в классе компонента перед вызовом includeTemplate) нужно обогатить элементы корзины данными из инфоблока.

  3. Пример логики обогащения (псевдокод):
<?php
// Внутри executeComponent после получения $this->arResult['BASKET_ITEMS']
$productIds = array_column($this->arResult['BASKET_ITEMS']‚ 'PRODUCT_ID');
$iblockId = $this->arResult['BASKET_ITEMS'][0]['IBLOCK_ID'] ?? 0; // Предполагаем один инфоблок

if ($productIds && $iblockId) {
 // 1. Получаем нужные свойства элементов инфоблока
 $res = CIBlockElement::GetList(
 []‚
 ['ID' => $productIds‚ 'IBLOCK_ID' => $iblockId]‚
 false‚
 false‚
 ['ID'‚ 'PREVIEW_TEXT'‚ 'PREVIEW_PICTURE'‚ 'DETAIL_PICTURE'‚ 'PROPERTY_BRAND']
 );
 
 $propsMap = [];
 while ($item = $res->Fetch) {
 $propsMap[$item['ID']] = $item;
 }
 
 // 2. Мержим в массив корзины
 foreach ($this->arResult['BASKET_ITEMS'] as &$basketItem) {
 $pid = $basketItem['PRODUCT_ID'];
 if (isset($propsMap[$pid])) {
 $basketItem['PREVIEW_TEXT'] = $propsMap[$pid]['PREVIEW_TEXT'];
 $basketItem['PREVIEW_PICTURE'] = $propsMap[$pid]['PREVIEW_PICTURE'];
 // Добавляем кастомные ключи для шаблона
 $basketItem['CUSTOM_PREVIEW_TEXT'] = $propsMap[$pid]['PREVIEW_TEXT'];
 $basketItem['CUSTOM_PICTURE'] = CFile::GetFileArray($propsMap[$pid]['PREVIEW_PICTURE']);
 }
 }
 unset($basketItem);
}
?>
  1. Регистрация компонента в визуальном редакторе (Панель компонентов 2.0).

    Чтобы ваш кастомный компонент появлялся в панели отдельной строкой‚ отредактируйте файл .description.php в папке компонента:

<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die;

$arComponentDescription = array(
 "NAME" => "Демо: Корзина заказов (Кастом)"‚
 "DESCRIPTION" => "Корзина с выводом анонса и картинки из инфоблока"‚
 "ICON" => "/images/icon.gif"‚
 "PATH" => array(
 "ID" => "demo"‚ // Ваш неймспейс
 "NAME" => "Демо компоненты"‚
 "CHILD" => array(
 "ID" => "sale"‚
 "NAME" => "Магазин"‚
 )
 )‚
);
?>
  1. Правка шаблона (template.php).

    Теперь в шаблоне строки товара (обычно в templates/.default/js-templates/basket-item.php или в основном template.php при рендере на сервере) вы можете использовать $arItem['CUSTOM_PREVIEW_TEXT'] и $arItem['CUSTOM_PICTURE']['SRC'].

AJAX-обновление корзины и JS-события

Современная корзина работает в режиме SPA (Single Page Application) для действий: изменение количества‚ удаление‚ применение купона‚ смена доставки/оплаты.

  • JS-объект: BX.Sale.BasketComponent (экземпляр доступен как window['basket_'+componentId]).
  • События (BX.addCustomEvent):
    • OnBasketItemQuantityChange — изменение количества.
    • OnBasketItemRemove — удаление товара.
    • OnBasketRefresh — полная перерисовка (после купона‚ доставки).
    • OnBasketError, ошибки валидации/сервера.
  • Методы: updateQuantity(itemId‚ quantity)‚ removeItem(itemId)‚ refresh.

При кастомизации шаблонов обязательно сохраняйте атрибуты data-entity="basket-item"‚ data-id‚ data-quantity на контейнерах строк‚ иначе JS не сможет найти элементы для обновления.

Чек-лист проверки перед релизом

Проверка Описание
Многосайтовость Корзина корректно изолирована по сайтам? Параметр SITE_ID передан явно?
Анонимная / Авторизованная Работает ли перенос корзины при логине/регистрации (событие OnSaleUserAuthorize)?
Каталоговые скидки Пересчитывается ли цена в корзине при смене количества (правила работы с каталоговыми скидками)?
Купоны Применение/отмена купонов без перезагрузки страницы. Обработка ошибок (просрочен‚ не для этого товара).
Доставка/Оплата Активация шагов оформления. Пересчет итоговой суммы при смене способа доставки.
Мобильная верстка Адаптивность таблицы корзины (обычно на моб. превращается в карточки товаров).
Кэширование Компонент не должен кэшироваться для авторизованных пользователей (проверьте CACHE_TYPE = N или зависимость от USER_ID/BASKET_ID).

Работа с корзиной в «1С-Битрикс: Управление сайтом» требует понимания разделения ответственности между компонентами sale.basket.basket (логика/итоги) и sale.basket.basket.line (презентация строки). Главные источники багов — это настройки многосайтовости (неверный SITE_ID) и неправильное кэширование.

Для расширения функционала (вывод свойств инфоблока‚ кастомные поля‚ интеграция с CRM/1С) используйте практику копирования компонента в /local/components/ с последующим обогащением $arResult в классе компонента. Это гарантирует безопасность обновлений ядра Битрикса.


Статья подготовлена на основе материалов сообщества разработчиков 1С-Битрикс (dev.1c-bitrix.ru) и экспертизы студии Acrit Studio.

Контакты 1С-Битрикс: info@* | sales@* | partners@* | marketing@*

Офис Москва: 127287‚ Московская обл.‚ г. Москва‚ 2-я Хуторская ул.‚ д. 38А‚ стр. 9

Офис Калининград: 236001‚ Калининградская обл.‚ г. Калининград‚ Московский проспект‚ 261. Тел: *

© 2001-2026 «Битрикс»‚ «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом.