Корзина заказов — это сердце любого интернет-магазина на платформе 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‚ может возникнуть рассинхрон:
- Компонент
basket.basket.lineчасто работает в контексте текущей страницы и корректно определяетSITE_IDчерез ядро. - Компонент
sale.basket.basket(особенно если он вызывается вheader.phpилиfooter.phpвне основного контента‚ или черезbitrix:main.include) может выполняться в контексте «главного» сайта портала (обычноs1)‚ игнорируя текущий сайт (s2‚s3…).
В результате sale.basket.basket читает корзину сайта s1 (которая пуста)‚ а basket.basket.line — корзину сайта s2 (где лежат товары).
Решение проблемы
- Явная передача SITE_ID. В параметрах вызова компонента
sale.basket.basketобязательно укажите"SITE_ID" => SITE_ID(константа текущего сайта). - Проверка шаблонов. Даже если компоненты «немодифицированные»‚ проверьте‚ не скопированы ли их шаблоны в
/bitrix/templates/.default/components/...или в шаблон сайта с ошибками. Как отмечали эксперты на форуме: «Компонент sale.basket.basket не показывает нулевое количество [по умолчанию]. Значит‚ проблема где-то в другом месте». - Очистка кэша. Компоненты корзины активно кэшируются. После изменений в настройках многосайтовости обязательно сбросьте кэш компонента и управляемый кэш (
/bitrix/managed_cache/). - Настройки модуля 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)
- Копирование компонента в свое пространство имен.
Никогда не правьте стандартные компоненты в
/bitrix/components/bitrix/. Скопируйте папкуsale.basket.basketв/local/components/demo/sale.basket.basket/(или ваш неймспейс). - Редактирование
class.php(илиcomponent.phpв старых версиях).В методе
executeComponentили при подготовке данных (обычно в обработчикеOnBeforeBasketItemUpdateили прямо в классе компонента перед вызовомincludeTemplate) нужно обогатить элементы корзины данными из инфоблока. - Пример логики обогащения (псевдокод):
<?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);
}
?>
- Регистрация компонента в визуальном редакторе (Панель компонентов 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" => "Магазин"‚
)
)‚
);
?>
- Правка шаблона (
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С-Битрикс: Управление сайтом.