PHP
#bitrix#catalog#price#php#minimal#price-types

Получить минимальную цену с учётом нескольких типов цен

Расчёт минимальной цены товара среди всех типов цен с учётом количества, скидок и доступности типов цен для пользователя.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Получение минимальной цены товара среди всех доступных типов цен. Используйте в списках товаров, фильтрах, компонентах каталога для отображения лучшей цены.

use Bitrix\Main\Loader;

/**
 * Получить минимальную цену среди всех типов цен
 * @param int $productId ID товара
 * @param int $userId ID пользователя (для проверки доступности типов цен)
 * @param int $quantity Количество для расчёта
 * @return array|false ['PRICE' => float, 'CURRENCY' => string, 'PRICE_TYPE_ID' => int] или false
 */
function getMinimalPriceFromAllTypes($productId, $userId = 0, $quantity = 1) {
    if (!Loader::includeModule('catalog')) {
        return false;
    }
    
    // Получаем все типы цен
    $priceTypes = CCatalogGroup::GetList([], ['BASE' => 'N']);
    $allPriceTypes = [];
    while ($type = $priceTypes->Fetch()) {
        $allPriceTypes[] = $type['ID'];
    }
    
    // Добавляем базовый тип цены
    $baseType = CCatalogGroup::GetBaseGroup();
    if ($baseType) {
        $allPriceTypes[] = $baseType['ID'];
    }
    
    $minimalPrice = null;
    $minimalPriceData = null;
    
    // Проверяем каждый тип цены
    foreach ($allPriceTypes as $priceTypeId) {
        // Проверяем доступность типа цены для пользователя
        if ($userId > 0) {
            $userGroups = CUser::GetUserGroup($userId);
            $priceType = CCatalogGroup::GetByID($priceTypeId);
            if ($priceType && !empty($priceType['USER_GROUP'])) {
                $allowedGroups = explode(',', $priceType['USER_GROUP']);
                if (empty(array_intersect($userGroups, $allowedGroups))) {
                    continue; // Тип цены недоступен для пользователя
                }
            }
        }
        
        // Получаем цену этого типа
        $price = CPrice::GetList(
            [],
            [
                'PRODUCT_ID' => $productId,
                'CATALOG_GROUP_ID' => $priceTypeId
            ],
            false,
            false,
            ['PRICE', 'CURRENCY']
        )->Fetch();
        
        if ($price) {
            $priceValue = (float)$price['PRICE'];
            
            // Получаем цену с учётом скидок
            $optimalPrice = CCatalogProduct::GetOptimalPrice(
                $productId,
                $quantity,
                $userId,
                'N',
                [],
                false,
                false,
                [$priceTypeId]
            );
            
            if ($optimalPrice && isset($optimalPrice['PRICE']['PRICE'])) {
                $priceValue = (float)$optimalPrice['PRICE']['PRICE'];
            }
            
            if ($minimalPrice === null || $priceValue < $minimalPrice) {
                $minimalPrice = $priceValue;
                $minimalPriceData = [
                    'PRICE' => $priceValue,
                    'CURRENCY' => $price['CURRENCY'],
                    'PRICE_TYPE_ID' => $priceTypeId
                ];
            }
        }
    }
    
    return $minimalPriceData ?: false;
}

Usage:

// Получить минимальную цену для текущего пользователя
$userId = $GLOBALS['USER']->GetID();
$minPrice = getMinimalPriceFromAllTypes(12345, $userId, 1);

if ($minPrice) {
    echo 'Минимальная цена: ' . $minPrice['PRICE'] . ' ' . $minPrice['CURRENCY'];
    echo 'Тип цены ID: ' . $minPrice['PRICE_TYPE_ID'];
}

// Для неавторизованного пользователя
$minPrice = getMinimalPriceFromAllTypes(12345, 0, 1);

Notes:

⚠️ Метод проверяет доступность типов цен через группы пользователя. Для неавторизованных пользователей доступны только публичные типы цен. GetOptimalPrice учитывает скидки и персональные цены. Если товар имеет несколько типов цен, возвращается минимальная среди доступных.