Как получить и изменить количество товара на сайте 1С-Битрикс с учетом добавления в корзину и реализацией динамического изменения этого количества – одна из задач при создании интернет-магазина на базе 1С-Битрикс. В этой статье рассмотрим несколько практических примеров, как:

- Узнать доступное количество товара в списке товаров или в детальной карточке.
- Отслеживать, когда товар уже добавлен в корзину.
- При клике по кнопке изменения количества добавлять нужное количество к уже имеющемуся в корзине товару (а не заменять его полностью).
Разберём всё пошагово, начиная от самых простых способов и заканчивая более продвинутыми. Материал будет полезен как начинающим, так и опытным разработчикам, работающим в 1С-Битрикс.
1. Получение количества товара на сайте
1.1. В списке товаров (component `bitrix:catalog.section`)
Чаще всего список товаров формируется стандартным компонентом `bitrix:catalog.section`. В файле шаблона компонента (например, `/local/templates/Ваш_шаблон/components/bitrix/catalog.section/Ваш_шаблон/`) в цикле по элементам массива `$arResult["ITEMS"]` у каждого товара доступны поля, содержащие информацию о количестве. Например:
<?php foreach ($arResult["ITEMS"] as $arItem): ?>
<?php
// $arItem['CATALOG_QUANTITY'] — доступное количество товара
// $arItem['CATALOG_QUANTITY_TRACE'] — режим отслеживания количества
// $arItem['CATALOG_CAN_BUY_ZERO'] — разрешена ли покупка при нулевом остатке
?>
<div class="catalog-item">
<div class="catalog-item__title"><?= $arItem['NAME']; ?></div>
<div class="catalog-item__quantity">
Доступное количество: <?= $arItem['CATALOG_QUANTITY']; ?>
</div>
<?php endforeach; ?>
Таким образом, мы можем выводить остаток прямо в списке товаров.
Если необходимо скрыть количество, когда его нет, или показать другое сообщение, можно добавить логику:
<?php if ($arItem['CATALOG_QUANTITY'] > 0): ?>
<span>В наличии: <?= $arItem['CATALOG_QUANTITY']; ?></span>
<?php else: ?>
<span>Нет в наличии</span>
<?php endif; ?>
1.2. В карточке товара (component `bitrix:catalog.element`)
В детальной карточке товара, чаще всего подключаемой стандартным компонентом `bitrix:catalog.element`, внутри `$arResult` также содержится информация о количестве:
<div class="product-detail">
<h1><?= $arResult['NAME']; ?></h1>
<p>Количество на складе: <?= $arResult['CATALOG_QUANTITY']; ?></p>
</div>
Если требуется выводить складские данные более детально (например, по конкретным складам), нужно использовать расширенный функционал складского учёта в 1С-Битрикс и обращаться к ним через API, такой как `CCatalogStoreProduct::GetList()`. Но базовая информация о количестве доступна напрямую через `$arResult['CATALOG_QUANTITY']`.
2. Добавление товара в корзину с учётом уже имеющегося количества
Одно из типичных требований интернет-магазина: при повторном добавлении товара в корзину не заменять количество, а добавлять к уже существующему. Рассмотрим, как это можно сделать.
2.1. Стандартный механизм добавления в корзину
Стандартные компоненты каталога в Битриксе обычно имеют кнопку «Купить» или «В корзину», которая отправляет запрос на `add2basket.php` (ал). В шаблоне может использоваться специальный атрибут:
<form action="<?= POST_FORM_ACTION_URI ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="<?= $arParams["ACTION_VARIABLE"] ?>" value="ADD2BASKET" />
<input type="hidden" name="<?= $arParams["PRODUCT_ID_VARIABLE"] ?>" value="<?= $arItem['ID'] ?>" />
<input type="submit" name="<?= $arParams["ACTION_VARIABLE"]."ADD2BASKET" ?>" value="В корзину" />
</form>
При этом обычно количество для добавления может задаваться в отдельном поле:
<input type="number" name="<?= $arParams["PRODUCT_QUANTITY_VARIABLE"] ?>" value="1" min="1" />
Однако стандартное поведение Битрикса при повторном добавлении — это установка нового количества (если не настроено иное). Нам же нужно добавить к уже существующему количеству в корзине.
2.2. Кастомная логика добавления в корзину
Допустим, вы хотите при клике на плюсик или при вводе нового количества «наращивать» количество товара, уже лежащего в корзине. Можно сделать следующее:
- Получить текущее количество товара в корзине. Для этого используем класс `Bitrix\Sale\Basket` (D7) или устаревшие методы `CSaleBasket`. Пример на D7:
- При добавлении увеличить количество. Если товар уже есть в корзине:
- Использовать AJAX для динамики. Чтобы при клике не перезагружать страницу, можно отправлять запрос на сервер через AJAX. Допустим, у нас есть HTML-код:
use Bitrix\Main\Loader;
use Bitrix\Sale;
Loader::includeModule('sale');
Loader::includeModule('catalog');
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID);
$basketItem = $basket->getExistsItem('catalog', $productId);
if ($basketItem) {
// Товар уже есть в корзине
$currentQuantity = $basketItem->getQuantity();
} else {
$currentQuantity = 0;
}
if ($basketItem) {
$basketItem->setField('QUANTITY', $currentQuantity + $newQuantity);
} else {
$basketItem = $basket->createItem('catalog', $productId);
$basketItem->setFields([
'QUANTITY' => $newQuantity,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => SITE_ID,
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
'NAME' => 'Название товара',
]);
}
$basket->save();
<div class="product-block" data-product-id="123">
<div class="product-title">Мой товар</div>
<div class="product-quantity">
<input type="number" class="js-product-quantity" value="1" min="1">
</div>
<button class="js-add-to-cart">Добавить в корзину</button>
</div>
JavaScript-обработчик:
document.addEventListener('DOMContentLoaded', function() {
const addToCartButtons = document.querySelectorAll('.js-add-to-cart');
addToCartButtons.forEach(function(button) {
button.addEventListener('click', function() {
const productBlock = this.closest('.product-block');
const productId = productBlock.dataset.productId;
const quantityInput = productBlock.querySelector('.js-product-quantity');
const quantity = parseFloat(quantityInput.value) || 1;
// Отправляем AJAX-запрос на сервер
fetch('/local/ajax/add_to_cart.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({
productId: productId,
quantity: quantity
})
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert('Товар добавлен в корзину! Текущее количество: ' + data.totalQuantity);
// По желанию, обновить интерфейс
} else {
alert('Ошибка при добавлении в корзину');
}
});
});
});
});
PHP-обработчик (`/local/ajax/add_to_cart.php`):
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Loader;
use Bitrix\Sale;
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
$input = json_decode(file_get_contents('php://input'), true);
$productId = intval($input['productId']);
$newQuantity = floatval($input['quantity']);
if(!Loader::includeModule("sale") || !Loader::includeModule("catalog")) {
echo json_encode(["success" => false, "message" => "Modules not included"]);
die();
}
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID);
$basketItem = $basket->getExistsItem('catalog', $productId);
if ($basketItem) {
// увеличиваем количество
$currentQuantity = $basketItem->getQuantity();
$basketItem->setField('QUANTITY', $currentQuantity + $newQuantity);
} else {
// создаем новую позицию
$basketItem = $basket->createItem('catalog', $productId);
$basketItem->setFields([
'QUANTITY' => $newQuantity,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => SITE_ID,
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
'NAME' => 'Название товара', // Можно получить из самого товара через CIBlockElement::GetByID
]);
}
$basket->save();
// Возвращаем новое общее количество в корзине для этого товара
echo json_encode([
"success" => true,
"totalQuantity" => $basketItem->getQuantity()
]);
die();
?>
После такой доработки при каждом нажатии на кнопку «Добавить в корзину» текущее количество в корзине будет увеличиваться на значение из поля ввода.
3. Учет особенностей складского учёта и отсутствия товара
1С-Битрикс позволяет при нулевом остатке, запрещать это, а также выполнять резервирование и другие операции со складом. Поэтому важно убедиться в корректном учёте настроек каталога:
- Разрешена ли покупка при нулевом количестве (`CAN_BUY_ZERO`).
- Отслеживается ли количество (`CATALOG_QUANTITY_TRACE`).
- Режим резервирования (моментальное резервирование, при оформлении заказа и т. д.).
Если товар на складе закончился и `CAN_BUY_ZERO` не включён, то Битрикс не даст положить товар в корзину (или отдаст ошибку). При кастомном AJAX-методе нужно обрабатывать эту ошибку и выводить соответствующее сообщение, например:
try {
$basket->save();
echo json_encode([
"success" => true,
"totalQuantity" => $basketItem->getQuantity()
]);
} catch (\Bitrix\Main\SystemException $e) {
echo json_encode([
"success" => false,
"message" => $e->getMessage()
]);
}
Такая обработка исключений позволит корректно сообщать пользователю о проблемах (например, если товара недостаточно).
4. Рекомендации по улучшению UX и SEO
- Показывать пользователю при повторном добавлении, что товар уже в корзине. Например, если пользователь уже добавлял товар, можно отобразить возле кнопки «Добавить в корзину» текст «У вас в корзине: 3 шт.». Это делается путём проверки наличия `$basketItem` и вывода нужного текста во фронтенде.
- Использовать уведомления или модальные окна. Вместо простого `alert` можно использовать более элегантные решения на вашем фреймворке (Bootstrap, UI-библиотеки, SweetAlert и т. д.), чтобы оповещение выглядело дружелюбнее к пользователю.
- Удобные кнопки «+» и «–». Вполне комфортно и наглядно, когда на карточке товара есть интерактивные кнопки для добавления/убавления количества товара. Это удобно и понятно для большинства посетителей сайта.
- SEO-оптимизация.
- Оставьте на странице уникальные описания товаров, акцентируйте внимание на характеристиках и преимуществах.
- В статье для блога (или в контентной части сайта) используйте ключевые слова («количество товара», «добавить в корзину в 1С-Битрикс», «настройка корзины в Bitrix», «изменение количества товаров в интернет-магазине» и т. д.) в соответствии с требованиями поисковых систем.
- Следите, чтобы теги заголовков (H1, H2 и т. п.) корректно отражали смысловое содержание страниц.
5. Итоги
Настройка логики изменения количества товара при добавлении в корзину на 1С-Битрикс даёт магазину большую гибкость, улучшает конверсию и повышает удобство пользователей. Ключевые моменты:
- Получение количества: используйте `$arItem['CATALOG_QUANTITY']` или `$arResult['CATALOG_QUANTITY']` в компонентах `catalog.section` и `catalog.element`.
- Проверка наличия товара в корзине: через класс `Bitrix\Sale\Basket` (D7) или `CSaleBasket`.
- Увеличение количества при повторном добавлении: вместо перезаписи старого значения складывайте текущее количество и количество, которое пользователь хочет добавить.
- Ajax-обработчики: позволяют обновлять корзину без перезагрузки страницы, что улучшает UX.
- Учет складского функционала: учитывайте настройки остатка, резервирования, разрешения/запрета добавления при нулевом количестве.
Приведённые примеры кода помогут вам быстро интегрировать логику «увеличения количества в корзине» в ваш проект на 1С-Битрикс. Притом конкретных бизнес-требований и особенностей работы вашего интернет-магазина.