Изменение количества товара в корзине при добавлении в 1С-Битрикс

Внимание! Работает режим премодерации. Все сообщения публикуются после проверки!
Страницы: 1
Ответить
RSS
Изменение количества товара в корзине при добавлении в 1С-Битрикс
Как в 1С‑Битрикс получить и увеличить количество товара при добавлении в корзину — пошаговая инструкция с примерами

Как получить и изменить количество товара на сайте 1С-Битрикс с учетом  добавления в корзину и реализацией динамического изменения этого  количества – одна из задач при создании интернет-магазина на базе  1С-Битрикс. В этой статье рассмотрим несколько практических примеров,  как:
Изменено: Валерий Макеев - 29.09.2025 15:14:29
Этот код добавляет торговое предложение в корзину 1С-Битрикс с увеличением количества при повторном добавлении, корректно обрабатывая цены и валидацию, чтобы избежать ошибок при отсутствии данных.
Код
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Main\Loader;
use Bitrix\Sale;
use Bitrix\Catalog;

header('Content-Type: application/json');

// :f09f94b4: ВАЖНО: теперь $productId — это ID торгового предложения, например 25
$productId = 125;
$newQuantity = 2;

if ($productId <= 0 || $newQuantity <= 0) {
    echo json_encode(["success" => false, "message" => "Некорректные данные"]);
    die();
}

if (!Loader::includeModule('sale') || !Loader::includeModule('catalog')) {
    echo json_encode(["success" => false, "message" => "Не загружены модули sale или catalog"]);
    die();
}

try {
    $fUserId = Sale\Fuser::getId();
    $siteId = SITE_ID;

    $basket = Sale\Basket::loadItemsForFUser($fUserId, $siteId)->getBasket();

    // Проверяем, есть ли уже такой товар в корзине
    $item = null;
    foreach ($basket as $basketItem) {
        if ($basketItem->getProductId() == $productId) {
            $item = $basketItem;
            break;
        }
    }

    // Получаем данные товара
    $product = \CIBlockElement::GetByID($productId)->Fetch();
    if (!$product) {
        echo json_encode(["success" => false, "message" => "Товар не найден"]);
        die();
    }

    // :f09f94b9: Получаем цену по ID торгового предложения
    $priceRow = Catalog\PriceTable::getList([
        'select' => ['PRICE', 'CURRENCY'],
        'filter' => [
            '=PRODUCT_ID' => $productId,
            'CATALOG_GROUP_ID' => 1  // Основная цена
        ]
    ])->fetch();

    $price = $priceRow['PRICE'] ?? null;
    $currency = $priceRow['CURRENCY'] ?? \Bitrix\Currency\CurrencyManager::getBaseCurrency();

    if ($price === null || $price <= 0) {
        $price = 1; // Фолбэк для теста
    }

    if ($item) {
        // Увеличиваем количество
        $currentQty = $item->getQuantity();
        $newQty = $currentQty + $newQuantity;

        if ($newQty <= 0) {
            throw new Exception("Итоговое количество не может быть <= 0");
        }

        $item->setField('QUANTITY', $newQty);
    } else {
        // Создаём новую позицию
        $item = $basket->createItem('catalog', $productId);
        $item->setFields([
            'QUANTITY' => $newQuantity,
            'CURRENCY' => $currency,
            'LID' => $siteId,
            'NAME' => $product['NAME'],
            'BASE_PRICE' => $price,
            'PRICE' => $price,
            'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
        ]);
    }

    // :f09f94a5: Критическая проверка: количество > 0
    if ($item->getQuantity() <= 0) {
        throw new Exception("Количество товара не может быть <= 0. Текущее: " . $item->getQuantity());
    }

    // Сохраняем
    $result = $basket->save();

    if (!$result->isSuccess()) {
        throw new Exception("Ошибка сохранения корзины: " . implode(", ", $result->getErrorMessages()));
    }

    echo json_encode([
        "success" => true,
        "totalQuantity" => $item->getQuantity(),
        "message" => "Товар добавлен в корзину"
    ]);

} catch (Exception $e) {
    echo json_encode([
        "success" => false,
        "message" => "Ошибка: " . $e->getMessage()
    ]);
}

require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");
die();
[/SIZE][/FONT][/COLOR]
Изменено: Валерий Макеев - 05.09.2025 17:33:47
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

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

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Аутсорсинг

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

договорная

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

* на основе готовой верстки

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

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