Как исправить проблему — обновление данных корзины сбрасывает цену товара на минимальную?

<b>$basket->refreshData(['PRICE']);</b>
            
            $discounts = Sale\Discount::buildFromBasket($basket, new Sale\Discount\Context\Fuser($fuserId));
            $discounts->calculate();
            $showPrices = $discounts->getShowPrices();
            
            $arItems = [];
            $obBasket = Sale\Basket::getList([
                'filter' => [
                    'FUSER_ID' => $fuserId, 
                    "ORDER_ID" => null, 
                    'LID' => \Bitrix\Main\Context::getCurrent()->getSite(), 
                    'CAN_BUY' => 'Y',
                    'DELAY' => 'N'
                ],
                'select' => [
                    "ID", "NAME", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY",
                    "CURRENCY", "SUBSCRIBE", "PRODUCT_PROVIDER_CLASS", "PRODUCT_PRICE_ID"
                ]
            ]);
            while($bItem = $obBasket->Fetch()){
                $bItem['PRICE'] = Sale\PriceMaths::roundPrecision($showPrices['BASKET'][$bItem['ID']]['SHOW_PRICE']);
                $bItem['BASE_PRICE'] = Sale\PriceMaths::roundPrecision($showPrices['BASKET'][$bItem['ID']]['SHOW_BASE_PRICE']);
                $bItem['DISCOUNT_PRICE'] = Sale\PriceMaths::roundPrecision($showPrices['BASKET'][$bItem['ID']]['SHOW_DISCOUNT']);
                
                $bItem['SUM'] = $bItem['PRICE'] * (float)$bItem['QUANTITY'];
                
                $bItem['PRINT_SUM'] = \CCurrencyLang::CurrencyFormat($bItem['SUM'], $bItem['CURRENCY'], true);
                $bItem['PRINT_BASE_PRICE'] = \CCurrencyLang::CurrencyFormat($bItem['BASE_PRICE'], $bItem['CURRENCY'], true);
                $bItem['PRINT_PRICE'] = \CCurrencyLang::CurrencyFormat($bItem['PRICE'], $bItem['CURRENCY'], true);

                $arItems[$bItem['ID']] = $bItem;
            }

В функции происходит расчет скидок на товар добавленный в корзину. Но при выполнении $basket->refreshData(['PRICE']); ранее сохраненная цена на товар сбрасывается на минимальную из типа цен и скидки уже рассчитываются на эту цену. Как исправить эту проблему?
Когда добавляю товар в корзину я строго указываю какой тип цен использовать (см. ниже).
Функция добавления товара в корзину:
$item = $basket->createItem('catalog', $productId);
                    
                $propertyCollection = $item->getPropertyCollection();
                if ($propertyCollection)
                    $propertyCollection->setProperty($arProps);

                $PRICE = \CPrice::GetList(false, ['PRODUCT_ID' => $productId, 'CATALOG_GROUP_NAME' => $PRICE_CODE])->fetch();
                $item->setFields([
                    'QUANTITY' => $quantity,
                    'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
                    'LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
                    'PRODUCT_PROVIDER_CLASS' => \Bitrix\Catalog\Product\Basket::getDefaultProviderName(),
                    'PRICE' => $PRICE['PRICE'],
                    "BASE_PRICE" => $PRICE['PRICE'],
                    "PRICE_TYPE_ID" => $PRICE["CATALOG_GROUP_ID"],
                    "PRODUCT_PRICE_ID" => $PRICE["ID"],
                ]);
                
                $item->save();
  • Вопрос задан
  • 2480 просмотров
Пригласить эксперта
Ответы на вопрос 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
это нормальное поведение. При каждом заходе на страницу корзины, выполняется обновление цен на товар. При это цена на товар берется минимальная из доступных.

Доступность типа цены для групп пользователей настраивается на странице цены в админке.

Чтобы изменить это поведение, надо поменять PRODUCT_PROVIDER_CLASS на свой. Можно вот так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы