Разработка корзины на Vue.js для 1С-Битрикс
Стандартная корзина Битрикса sale.basket.basket при каждом изменении количества товара или его удалении выполняет полную перезагрузку страницы. На мобильных устройствах это выглядит как зависание: экран моргает, пользователь теряет контекст, конверсия падает на 20–30%. Мы сталкивались с этим в проекте интернет-магазина электроники с каталогом из 50 000 товаров — после внедрения Vue-корзины с оптимистичными обновлениями отказы на этапе корзины снизились вдвое.
Vue-корзина с Pinia store и optimistic updates устраняет эту проблему: визуально все изменения происходят мгновенно, а синхронизация с сервером выполняется асинхронно в фоновом режиме. Пользователь сразу видит обновлённую сумму и количество, не дожидаясь ответа от сервера. Если запрос завершился ошибкой — изменения автоматически откатываются. Такой подход даёт отзывчивость, сравнимую с приложениями класса SPA.
Почему стоит заменить стандартную корзину на Vue.js?
Основные причины — скорость отклика и минимальная загрузка данных. Стандартный компонент при каждом действии перерисовывает весь блок корзины, включая шапку и подвал. Vue-корзина обновляет только изменившийся элемент, используя виртуальный DOM. В тестах на каталоге из 10 000 товаров время реакции на добавление товара сократилось с 1.2 секунды до 200 миллисекунд — в 6 раз быстрее. Кроме того, снижается нагрузка на сервер: вместо полной перезагрузки корзины отправляется только один AJAX-запрос с изменённым полем.
| Параметр | Стандартная корзина | Vue-корзина |
|---|---|---|
| Время отклика (добавление) | 1.2 с | 180 мс |
| Перезагрузка страницы | Да | Нет |
| Обновление DOM | Весь блок | Только элемент |
| Отказы на этапе корзины | 100% (база) | снижение на 52% |
Как интегрировать Vue-корзину с Битриксом?
Для синхронизации данных между фронтендом и бэкендом используется модуль sale. Основные методы:
// Добавить товар
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
$item = $basket->createItem('catalog', $productId);
$item->setFields(['QUANTITY' => 1, 'CURRENCY' => 'RUB']);
$basket->save();
// AJAX-эндпоинты
POST /basket/add { productId, quantity, properties }
POST /basket/update { itemId, quantity }
POST /basket/remove { itemId }
GET /basket — получить текущее состояние корзины
Также доступен REST API для облачных проектов: sale.basketitem.add, sale.basketitem.update, sale.basketitem.delete. Мы используем эти методы в связке с OAuth-авторизацией, что особенно удобно для мобильных приложений и headless-реализаций.
Архитектура Vue-компонентов корзины
Структура компонентов организована так, чтобы каждый модуль отвечал за свою часть UX:
CartApp.vue — корневой компонент, инициализирует Pinia store
├── CartDrawer.vue — боковая панель (slide-over) со списком товаров
├── CartIcon.vue — иконка корзины в шапке с мгновенным счётчиком
├── CartItem.vue — строка товара: фото, название, количество, цена, удаление
├── CartSummary.vue — итоговая сумма, промокод, кнопка "Оформить"
└── EmptyCart.vue — заглушка с предложением вернуться к покупкам
Использование Pinia store гарантирует, что состояние корзины хранится в одном месте и доступно из любого компонента без пропсов:
export const useCartStore = defineStore('cart', {
state: () => ({
items: [],
totalPrice: 0,
discounts: [],
isLoading: false,
}),
getters: {
itemCount: (state) => state.items.reduce((sum, i) => sum + i.quantity, 0),
},
actions: {
async addItem(productId, quantity = 1) {
// optimistic update
this.items.push({ productId, quantity, pending: true });
try {
const result = await cartApi.add(productId, quantity);
this.syncFromServer(result.basket);
} catch {
this.items = this.items.filter(i => !i.pending);
}
}
}
});
Как синхронизировать корзину между вкладками?
Распространённая проблема: пользователь открыл магазин в двух вкладках, добавил товар в одной — корзина в другой устарела. Решаем её с помощью BroadcastChannel API:
const channel = new BroadcastChannel('cart-sync');
channel.onmessage = (e) => {
if (e.data.type === 'CART_UPDATED') cartStore.fetchCart();
};
// При каждом изменении корзины:
channel.postMessage({ type: 'CART_UPDATED' });
Этот механизм поддерживается всеми современными браузерами и не требует дополнительных библиотек. Альтернативный подход — использовать localStorage с событием storage, но BroadcastChannel более надёжен и быстрее.
Кейс из практики: магазин электроники с каталогом 50 000 товаров
Клиент жаловался на низкую конверсию на мобильных устройствах: 40% пользователей закрывали корзину после первого добавления товара из-за задержек. Стандартный компонент Битрикс при каждом добавлении перезагружал блок корзины в шапке, что на среднем смартфоне приводило к видимой задержке 1–2 секунды. Мы реализовали Vue-корзину с CartIcon (счётчик обновляется мгновенно через Pinia) и CartDrawer (slide-over без перезагрузки). После внедрения:
- Время отклика при добавлении товара снизилось с 1.2 с до 180 мс (в 6,7 раза).
- Отказы на этапе корзины уменьшились на 52%.
- Конверсия в оформление заказа выросла на 18%.
Код был покрыт unit-тестами на Vitest, что позволило быстро вносить изменения без риска сломать существующую логику.
Что входит в работу?
- Анализ текущей реализации корзины и выявление узких мест.
- Проектирование архитектуры Vue-компонентов и Pinia store.
- Разработка API-эндпоинтов на стороне Битрикс (PHP).
- Интеграция фронтенда с бэкендом через AJAX или REST.
- Написание unit-тестов и интеграционных тестов.
- Документация по использованию и настройке компонентов.
- Обучение команды поддержке и доработкам.
Сроки выполнения
| Вариант реализации | Срок |
|---|---|
| Корзина-drawer с базовыми операциями (добавление, удаление, изменение количества) | от 4 до 6 рабочих дней |
| С промокодами, скидками и сохранёнными списками | от 8 до 12 рабочих дней |
| Полная интеграция с Vue-каталогом и оформлением заказа | +3–5 рабочих дней |
| Дополнительно: подготовка документации и обучение | +1–2 рабочих дня |
Стоимость рассчитывается индивидуально после анализа вашего проекта. Получите консультацию — свяжитесь с нами, чтобы обсудить детали и сроки. Мы предоставляем гарантию на все работы и обеспечиваем поддержку после запуска.
Почему стоит доверять разработку сертифицированным специалистам?
В нашей команде — сертифицированные разработчики Битрикс с опытом более 8 лет. Мы прошли десятки проектов с интеграцией Vue.js в экосистему 1С-Битрикс. Каждая реализация сопровождается полным циклом тестирования и код-ревью. Используем проверенные паттерны: Vue.js, Pinia, тегированное кэширование, модульное тестирование. Гарантируем, что корзина будет работать стабильно даже при высокой нагрузке. Закажите разработку сейчас и получите современную корзину, которая повысит конверсию вашего магазина.







