Как в 1С‑Битрикс получить и увеличить количество товара при добавлении в корзину — пошаговая инструкция с примерами

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

Как в Битрикс получить и увеличить количество товара при добавлении в корзину
  1. Узнать доступное количество товара в списке товаров или в детальной карточке.
  2. Отслеживать, когда товар уже добавлен в корзину.
  3. При клике по кнопке изменения количества добавлять нужное количество к уже имеющемуся в корзине товару (а не заменять его полностью).

Разберём всё пошагово, начиная от самых простых способов и заканчивая более продвинутыми. Материал будет полезен как начинающим, так и опытным разработчикам, работающим в 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. Кастомная логика добавления в корзину

Допустим, вы хотите при клике на плюсик или при вводе нового количества «наращивать» количество товара, уже лежащего в корзине. Можно сделать следующее:

  1. Получить текущее количество товара в корзине. Для этого используем класс `Bitrix\Sale\Basket` (D7) или устаревшие методы `CSaleBasket`. Пример на D7:
  2. 
    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;
    }
                        
  3. При добавлении увеличить количество. Если товар уже есть в корзине:
  4. 
    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();
                        
  5. Использовать AJAX для динамики. Чтобы при клике не перезагружать страницу, можно отправлять запрос на сервер через AJAX. Допустим, у нас есть HTML-код:
  6. 
    <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С-Битрикс позволяет при нулевом остатке, запрещать это, а также выполнять резервирование и другие операции со складом. Поэтому важно убедиться в корректном учёте настроек каталога:

  1. Разрешена ли покупка при нулевом количестве (`CAN_BUY_ZERO`).
  2. Отслеживается ли количество (`CATALOG_QUANTITY_TRACE`).
  3. Режим резервирования (моментальное резервирование, при оформлении заказа и т. д.).

Если товар на складе закончился и `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

  1. Показывать пользователю при повторном добавлении, что товар уже в корзине. Например, если пользователь уже добавлял товар, можно отобразить возле кнопки «Добавить в корзину» текст «У вас в корзине: 3 шт.». Это делается путём проверки наличия `$basketItem` и вывода нужного текста во фронтенде.
  2. Использовать уведомления или модальные окна. Вместо простого `alert` можно использовать более элегантные решения на вашем фреймворке (Bootstrap, UI-библиотеки, SweetAlert и т. д.), чтобы оповещение выглядело дружелюбнее к пользователю.
  3. Удобные кнопки «+» и «–». Вполне комфортно и наглядно, когда на карточке товара есть интерактивные кнопки для добавления/убавления количества товара. Это удобно и понятно для большинства посетителей сайта.
  4. 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С-Битрикс. Притом конкретных бизнес-требований и особенностей работы вашего интернет-магазина.

Теги:  количество товара, добавить в корзину, настройка корзины, изменение количества товаров, интернет-магазин

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.