Корзина в 1С-Битрикс — это связка двух компонентов: полноценной страницы bitrix:sale.basket.basket и компактной «мини-корзины» в шапке bitrix:sale.basket.basket.line. Оба работают на модуле «Интернет-магазин» (sale) и обновляются по AJAX без перезагрузки страницы — разберём, как это настроить корректно и не сломать в режиме композита.
Два компонента: страница и строка корзины
За корзину в Битрикс отвечают два разных компонента модуля sale, и путать их не стоит:
bitrix:sale.basket.basket— большая страница корзины (обычно/personal/cart/): таблица товаров, изменение количества, купоны, кнопка оформления заказа;bitrix:sale.basket.basket.line— «мини-корзина», строка в шапке: иконка, число позиций и сумма, выпадающий список товаров.
Оба читают данные из одного и того же объекта корзины текущего пользователя (таблица b_sale_basket), поэтому изменения на странице моментально отражаются в шапке — при условии, что подписка на события настроена. В новых редакциях используется API \Bitrix\Sale\Basket, но на уровне вёрстки вы работаете именно с этими двумя компонентами.
sale.order.ajax, минуя отдельную страницу корзины.Как вставить мини-корзину в шапку
Мини-корзина размещается в шаблоне сайта — как правило, в header.php рядом с блоком авторизации и поиском. Вызов выглядит так:
$APPLICATION->IncludeComponent("bitrix:sale.basket.basket.line", "", array(...));
Ключевые параметры, которые задают поведение:
| Параметр | Назначение |
|---|---|
PATH_TO_BASKET | ссылка на страницу корзины |
PATH_TO_ORDER | ссылка на оформление заказа |
SHOW_NUM_PRODUCTS | показывать количество позиций |
SHOW_TOTAL_PRICE | показывать итоговую сумму |
SHOW_PRODUCTS | выводить список товаров в выпадашке |
SHOW_IMAGE | показывать миниатюры товаров |
POSITION_FIXED | «приклеивать» корзину при прокрутке |
Штатный шаблон уже содержит выпадающий блок и адаптивную вёрстку. Свою разметку удобнее делать копией шаблона в /local/templates/…/components/bitrix/sale.basket.basket.line/, а не правкой оригинала в bitrix/components.
AJAX-обновление при добавлении товара
Главная особенность мини-корзины — она обновляется без перезагрузки. Когда покупатель нажимает «В корзину» (компонент catalog.element, sale.add.to.basket.by.product или bitrix:catalog.product.subscribe через add2basket), срабатывает JS-событие, на которое подписана строка корзины.
- Компонент
sale.basket.basket.lineподписывается на кастомное событиеOnBasketChange; - класс
BX.Sale.BasketButtonотправляет AJAX-запрос и перерисовывает счётчик и сумму; - из своего кода можно инициировать обновление вручную:
BX.onCustomEvent('OnBasketChange').
Если после добавления товара цифра в шапке не меняется — почти всегда причина в том, что кнопка «В корзину» работает старым методом (полная перезагрузка или прямой POST), а не через AJAX-обёртку каталога. Проверьте, что у товарного компонента включён режим AJAX-корзины (USE_PRODUCT_QUANTITY, ADD_TO_BASKET_ACTION) и что на странице подключены sale-скрипты.
Композит, кэш и динамические области
Корзина персональна для каждого пользователя, поэтому она не должна кэшироваться как статика. В режиме Композитного сайта Битрикс отдаёт HTML-снимок страницы всем посетителям, а мини-корзину подгружает отдельным запросом уже после загрузки.
Штатный шаблон sale.basket.basket.line уже помечает свой блок как динамический (data-атрибуты композита), поэтому в кастомном шаблоне важно сохранить эту логику и не выносить вывод суммы за пределы компонента. Сам компонент кэшируется по пользователю, а не глобально — не отключайте кэш «на всякий случай», это лишняя нагрузка на каждый хит.
Страница корзины: параметры и оформление
Большая корзина bitrix:sale.basket.basket отвечает за таблицу товаров и переход к заказу. Наиболее востребованные настройки:
HIDE_COUPON— скрыть/показать поле промокода;PRICE_VAT_SHOW_VALUE— выводить НДС отдельной строкой;COLUMNS_LIST/TOTAL_BLOCK_DISPLAY— состав колонок и блока итогов;USE_DYNAMIC_SCROLL— динамическая подгрузка длинного списка;DEFERRED_REFRESH— отложенный пересчёт при изменении количества.
Современный шаблон корзины работает целиком на AJAX: изменение количества, удаление позиции и применение купона идут без перезагрузки, а итог пересчитывается на лету. При «глючащем» пересчёте первым делом смотрите консоль браузера и совместимость кастомного шаблона .default с текущей версией модуля sale — после обновлений структура ответа меняется.
Типичные ошибки и диагностика
Что чаще всего ломается на практике:
- Счётчик не обновляется — кнопка добавления не вызывает
OnBasketChangeили на странице нет JS-ядра корзины; - Разные суммы в шапке и на странице — включена скидка/валюта на уровне только одного компонента, либо кэш мини-корзины не сброшен;
- Мигание «чужой» суммы — мини-корзина попала в композитный HTML (см. раздел о композите);
- Корзина «слетает» у гостя — потеря фида/сессии: анонимная корзина живёт по
FUSER_IDв кукеBITRIX_SM_SALE_UID, при агрессивной чистке кук она обнуляется; - Пустой список товаров в дропдауне — в параметрах отключён
SHOW_PRODUCTSили превышен лимит выводимых позиций.
Отладку удобно вести через вкладку Network: запрос мини-корзины виден как отдельный AJAX-хит к /bitrix/components/bitrix/sale.basket.basket.line/. Если запрос не уходит — проблема на стороне кнопки «В корзину», а не строки в шапке.
Итог
Корзина в 1С-Битрикс — это пара компонентов sale.basket.basket и sale.basket.basket.line, связанных общим объектом корзины и событием OnBasketChange. Чтобы всё работало предсказуемо, держите мини-корзину динамической в композите, включайте AJAX-режим на кнопках каталога и правьте только копии шаблонов в /local. Тогда счётчик и сумма в шапке всегда совпадают с реальным содержимым корзины.
Если корзина тормозит, «мигает» на композите или сумма расходится между шапкой и страницей — мы в B2Bsite приводим её в порядок: настраиваем компоненты и AJAX, ускоряем каталог и корзину, сопровождаем магазин после запуска.
Частые вопросы
Какой компонент отвечает за мини-корзину в шапке?
Компонент bitrix:sale.basket.basket.line из модуля «Интернет-магазин». Он выводит счётчик, сумму и выпадающий список товаров.
Чем отличается sale.basket.basket от sale.basket.basket.line?
Первый — это полная страница корзины с таблицей и оформлением, второй — компактная строка корзины для шапки сайта. Данные у них общие.
Почему число товаров в шапке не обновляется после добавления?
Обычно кнопка «В корзину» работает не через AJAX и не вызывает событие OnBasketChange. Включите AJAX-режим на товарном компоненте и проверьте подключение скриптов корзины.
Как обновить мини-корзину из своего JavaScript?
Вызовите BX.onCustomEvent('OnBasketChange'). Строка корзины подписана на это событие и перерисует счётчик и сумму по AJAX.
Почему в композитном режиме показывается чужая сумма?
Мини-корзина попала в кэшируемый композитный HTML. Она должна оставаться динамической областью и догружаться отдельным запросом после загрузки страницы.
Можно ли обойтись без отдельной страницы корзины?
Да, оформление можно вести напрямую через sale.order.ajax, оставив в шапке только мини-корзину с переходом к заказу. Всё зависит от сценария покупки.
Где хранится корзина неавторизованного покупателя?
В таблице b_sale_basket по идентификатору FUSER_ID, который привязан к сессии через куку BITRIX_SM_SALE_UID. При очистке кук гостевая корзина обнуляется.
Как поправить внешний вид мини-корзины?
Скопируйте шаблон компонента в /local/templates/…/components/bitrix/sale.basket.basket.line/ и правьте копию, сохранив разметку динамической области для композита.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.