Документация для разработчиков

GetOptimalPrice

array
CCatalogProduct::GetOptimalPrice(
 int intProductID[,
 int quantity = 1[,
 array arUserGroups = array()[,
 string renewal = "N"[,
 array arPrices = array()[,
 string siteID = false[,
 array arDiscountCoupons = false]]]]]]
);

Метод возвращает параметры наименьшей цены товара productID с учетом скидок в количестве quantity для посетителя, входящего в группы пользователей arUserGroups. Метод статический.

Примечание: начиная с версии 16.6.3 модуля Торговый каталог, при включенном режиме объединенных скидок результат зависит от дополнительных условий:
  • перед вызовом метода CCatalogProduct::GetOptimalPrice либо не было вызова CCatalogProduct::setUseDiscount, либо он был вызван со значением true - будет возвращена цена с учетом правил корзины, которые можно показать в каталоге;
  • если был вызов метода CCatalogProduct::setUseDiscount(false), тогда:
    • если в системе отсутствуют скидки, зависящие от типа цен, то метод возвращает минимальную цену товара среди всех типов;
    • если же имеются скидки, зависящие от типа цен, то метод возвращает ту цену товара, которая будет наименьшей среди всех цен после применения всех тех скидок, которые могут быть показаны в контексте каталога товаров.

Параметры вызова

ПараметрОписаниеС версии
intProductID Код товара.

До версии 12.0.0 параметр назывался productID.
quantity Приобретаемое количество.
arUserGroups Массив групп пользователей. Если он пуст, то будут взяты группы текущего пользователя (при условии существования глобальной переменной $USER класса CUser, в случае отсутствия будет использована группа с кодом 2).

Если группы пользователей передаются в вызове, к ним будет принудительно добавлена группа с кодом 2 (Все пользователи) в случае ее отсутствия.
renewal "N" - для товара (в т.ч. продажи контента), "Y" - для продления подписки (только продажа контента). Значение "Y" - служебное и может быть использовано только при реализации собственных административных страниц работы с заказами.
arPrices Массив цен. Если он не пуст, то пересчет идет не по ценам из базы данных, а по ценам из этого массива. Представляет собой массив ассоциативных массивов с ключами:
  • ID - код цены;
  • PRICE - цена;
  • CURRENCY - валюта;
  • CATALOG_GROUP_ID - код типа цен.
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" => массив параметров цены, из которой была получена минимальная. Устарел, не используется с версии 15.0.2 (необходимо использовать ключ 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" => величина ставки НДС в процентах
   "VAT_INCLUDED" => включен ли НДС в цену (Y/N) (в магазин всегда отдаются цены с включенным НДС)
    )
)

Примечание. С версии 15.0.6 ключ RESULT_PRICE заполняется данными и в том случае, когда использованы обработчики события OnGetOptimalPrice. Параметры заданные методами CCatalogProduct::setUsedCurrency и CCatalogProduct::setPriceVatIncludeMode при этом учитываются, параметры заданные методом CCatalogProduct::setUseDiscount - нет.

Обратите внимание, что DISCOUNT_PRICE - это минимальная цена в валюте, заданной вызовом метода CCatalogProduct::setUsedCurrency, либо это минимальная цена (если CCatalogProduct::setUsedCurrency не использовался) в базовой валюте системы.

Пример использования

<?
$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-2019, «1С-Битрикс», 2019
Наверх