Как посчитать стоимость товара или предложения со всеми скидками
/***Как посчитать стоимость товара или предложения со всеми скидками***/
function getFinalPriceInCurrency($item_id, $sale_currency = 'RUB') { CModule::IncludeModule("iblock"); CModule::IncludeModule("catalog"); CModule::IncludeModule("sale"); global $USER; $currency_code = 'RUB'; // Проверяем, имеет ли товар торговые предложения? if(CCatalogSku::IsExistOffers($item_id)) { // Пытаемся найти цену среди торговых предложений $res = CIBlockElement::GetByID($item_id); if($ar_res = $res->GetNext()) { if(isset($ar_res['IBLOCK_ID']) && $ar_res['IBLOCK_ID']) { // Ищем все тогровые предложения $offers = CIBlockPriceTools::GetOffersArray(array( 'IBLOCK_ID' => $ar_res['IBLOCK_ID'], 'HIDE_NOT_AVAILABLE' => 'Y', 'CHECK_PERMISSIONS' => 'Y' ), array($item_id), null, null, null, null, null, null, array('CURRENCY_ID' => $sale_currency), $USER->getId(), null); foreach($offers as $offer) { $price = CCatalogProduct::GetOptimalPrice($offer['ID'], 1, $USER->GetUserGroupArray(), 'N'); if(isset($price['PRICE'])) { $final_price = $price['PRICE']['PRICE']; $currency_code = $price['PRICE']['CURRENCY']; // Ищем скидки и высчитываем стоимость с учетом найденных $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), 1, SITE_ID); if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) { $final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts); } // Конец цикла, используем найденные значения break; } } } } } else { // Простой товар, без торговых предложений (для количества равному 1) $price = CCatalogProduct::GetOptimalPrice($item_id, 1, $USER->GetUserGroupArray(), 'N'); // Получили цену? if(!$price || !isset($price['PRICE'])) { return false; } // Меняем код валюты, если нашли if(isset($price['CURRENCY'])) { $currency_code = $price['CURRENCY']; } if(isset($price['PRICE']['CURRENCY'])) { $currency_code = $price['PRICE']['CURRENCY']; } // Получаем итоговую цену $final_price = $price['PRICE']['PRICE']; // Ищем скидки и пересчитываем цену товара с их учетом $arDiscounts = CCatalogDiscount::GetDiscountByProduct($item_id, $USER->GetUserGroupArray(), "N", 1, SITE_ID); if(is_array($arDiscounts) && sizeof($arDiscounts) > 0) { $final_price = CCatalogProduct::CountPriceWithDiscount($final_price, $currency_code, $arDiscounts); } } // Если необходимо, конвертируем в нужную валюту if($currency_code != $sale_currency) { $final_price = CCurrencyRates::ConvertCurrency($final_price, $currency_code, $sale_currency); } return $final_price; }
Ещё статьи:
02.04.2026
Разговоры о фрилансе
Предыстория - автор вопроса хочет войти в IT сферу, я человеку начал подсказывать в комментариях на форуме. На примере вопросов и ответов в разговоре можно увидеть типовые ошибки и непонимание начинающего, и в будущем избежать повторения ошибок.
21.03.2026
PHP файловый менеджер
Попался мне такой PHP файловый менеджер, вполне функциональный, выкладываю в копилку скриптов
21.03.2026
Ошибка CUser::IsAuthorized() cannot be called statically
Такая ошибка старых весрий битрикс давно известна. Нужно заменить CUser::IsAuthorized() на $USER->IsAuthorized(), но в моём случае я сначала не смог найти место, где же находится проблема.

