GetOptimalPrice
Описание и параметры
array CCatalogProduct::GetOptimalPrice( int intProductID[, int|float quantity = 1[, array arUserGroups = array()[, string renewal = "N"[, array arPrices = array()[, bool|string siteID = false[, bool|array arDiscountCoupons = false]]]]]] );
Метод возвращает параметры наименьшей цены товара productID с учетом скидок в количестве quantity для посетителя, входящего в группы пользователей arUserGroups. Метод статический.
Примечание: начиная с версии 16.6.3 модуля Торговый каталог, при включенном режиме объединенных скидок результат зависит от дополнительных условий:
- перед вызовом метода CCatalogProduct::GetOptimalPrice либо не было вызова CCatalogProduct::setUseDiscount, либо он был вызван со значением true - будет возвращена цена с учетом правил корзины, которые можно показать в каталоге;
- если был вызов метода CCatalogProduct::setUseDiscount(false), тогда:
- если в системе отсутствуют скидки, зависящие от типа цен, то метод возвращает минимальную цену товара среди всех типов;
- если же имеются скидки, зависящие от типа цен, то метод возвращает ту цену товара, которая будет наименьшей среди всех цен после применения всех тех скидок, которые могут быть показаны в контексте каталога товаров.
Параметры вызова
| Параметр | Описание | С версии |
|---|---|---|
| intProductID | Код товара. До версии 12.0.0 параметр назывался productID. | |
| quantity | Приобретаемое количество. | |
| arUserGroups | Массив групп пользователей. Если передан не массив, значение приводится к массиву (если это целочисленный ID группы), иначе используется пустой массив. Независимо от входных данных к массиву групп принудительно добавляется группа с кодом 2 (Все пользователи), если ее нет. | |
| renewal | "N" - для товара (в т.ч. продажи контента), "Y" - для продления подписки (только продажа контента). Значение "Y" - служебное и может быть использовано только при реализации собственных административных страниц работы с заказами. | |
| arPrices | Массив цен. Если он не пуст, то пересчет идет не по ценам из базы данных, а по ценам из этого массива. Представляет собой массив ассоциативных массивов с ключами:
| 4.0.5 |
| siteID | Сайт, для которого производится вычисление. Если параметр не указан либо равен false, то берется текущий сайт (константа SITE_ID). При вызове в агентах, обработчиках событий или вне контекста текущего сайта явное указание обязательно, в противном случае возвращаемый результат непредсказуем. | 4.0.6 |
| arDiscountCoupons | Массив купонов, которые влияют на выборку скидок. Если задано значение false, то массив купонов будет взят из CCatalogDiscountCoupon::GetCoupons (только если в расчете разрешено применение скидок). Если следует исключить использование купонов, необходимо явно передать пустой массив (array()).
Примечание: с версии 15.0.4 купоны берутся из менеджера купонов \Bitrix\Sale\DiscountCouponsManager модуля Интернет-магазин, а при его отсутствии — по-старому из CCatalogDiscountCoupon::GetCoupons.
| 5.1.0 |
Возвращаемые значения
Массив вида:
array( "PRICE" => массив параметров цены, из которой была получена минимальная. Ключ сохранен для обратной совместимости; для новых сценариев используйте RESULT_PRICE. Содержит ключи "ID" - ID ценового предложения, "CATALOG_GROUP_ID" - ID типа цены, "PRICE" - величина исходной цены, "CURRENCY" - валюта исходной цены, "ELEMENT_IBLOCK_ID" - ID инфоблока товара, которому принадлежит ценовое предложение, "VAT_INCLUDED" - включен ли НДС в цену (Y/N), "VAT_RATE" - величина ставки НДС в процентах, "DISCOUNT_PRICE" => минимальная цена в базовой_валюте, "DISCOUNT" => самая первая скидка из DISCOUNT_LIST. Устарел, не используется с версии 12.5.0, "DISCOUNT_LIST" => список скидок, примененных к товару. Инкрементный массив, скидки идут в порядке применения. Каждая запись описывает скидку, >array( "ID" => ID скидки "TYPE" => тип (накопительная или нет), "SITE_ID" => сайт, "ACTIVE" => активность, "ACTIVE_FROM", "ACTIVE_TO" => даты активности скидки, "RENEWAL" => применяется к товару или к продлению подписки, "NAME" =>название, "SORT" => сортировка, "MAX_DISCOUNT" => максимальная величина скидки в валюте, "VALUE_TYPE" => процентная, абсолютная скидка либо фиксированная цена, "VALUE" => величина скидки, "CURRENCY" => валюта скидки, "PRIORITY" => приоритет, "LAST_DISCOUNT" => прекратить или нет применения скидок, "COUPON" => купон (если есть), "COUPON_ONE_TIME" => тип купона, "COUPON_ACTIVE" => активность купона, "MODULE_ID" => модуль, к которому относится скидка "HANDLERS" => массив модулей, требуемых для условий скидки ) "PRODUCT_ID" => ID товара, "RESULT_PRICE" => array( "PRICE_TYPE_ID" => ID типа цены "BASE_PRICE" => исходная цена "DISCOUNT_PRICE" => цена со скидкой "CURRENCY" => валюта результата "DISCOUNT" => величина скидки "PERCENT" => процент скидки "VAT_RATE" => ставка НДС в виде доли (например, 0.2 для 20%) "VAT_INCLUDED" => включен ли НДС в цену (Y/N) "NO_VAT" => товар без НДС (Y/N) "UNROUND_BASE_PRICE" => базовая цена до округления "UNROUND_DISCOUNT_PRICE" => цена со скидкой до округления ) )
Примечание. С версии 15.0.6 ключ RESULT_PRICE заполняется данными и в том случае, когда использованы обработчики события OnGetOptimalPrice. Параметры заданные методами CCatalogProduct::setUsedCurrency и CCatalogProduct::setPriceVatIncludeMode при этом учитываются, параметры заданные методом CCatalogProduct::setUseDiscount - нет.
Обратите внимание, что DISCOUNT_PRICE - это минимальная цена в валюте, заданной вызовом метода CCatalogProduct::setUsedCurrency, либо это минимальная цена (если CCatalogProduct::setUsedCurrency не использовался) в базовой валюте системы.
Особенности применения скидок и купонов
- Метод рассчитывает минимальную цену товара для отображения в каталоге и не изменяет правила корзины или их состояние..
- Если перед вызовом указан CCatalogProduct::setUseDiscount(false), то каталоговые скидки в расчете
GetOptimalPriceне применяются. - Если
setUseDiscount(false)не вызывался или заданtrue, скидки учитываются, а купоны берутся из параметраarDiscountCoupons. - При
arDiscountCoupons = falseкупоны берутся из менеджера купонов. - Чтобы исключить купонные скидки из расчета
GetOptimalPrice, передайте пустой массив купонов:array(). - Расчет
GetOptimalPriceвыполняется в контексте каталога. Поэтому результат может отличаться от расчета скидок в корзине/заказе, особенно для правил, которые применяются именно на уровне корзины.
Примеры использования
<?
$arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal);
if (!$arPrice || count($arPrice) <= 0)
{
if ($nearestQuantity = CCatalogProduct::GetNearestQuantityPrice($productID, $quantity, $USER->GetUserGroupArray()))
{
$quantity = $nearestQuantity;
$arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal);
}
}
echo "<pre>";
print_r($arPrice);
echo "</pre>";
?>
Была ли эта страница полезна?
Что можно улучшить?
Пользовательские комментарии
Помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2026, «1С-Битрикс», 2026