PHP
#bitrix#php#catalog#sku#cache#performance

Получить ID родительского товара по SKU (торговое предложение)

Быстрое получение ID родительского товара через CCatalogSku с кешированием результата для оптимизации.

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

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

Получаем ID родительского товара по торговому предложению (SKU) через CCatalogSku с кешированием. Используйте когда нужно получить базовый товар из SKU без лишних запросов к БД.

use Bitrix\Main\Application;
use Bitrix\Main\Loader;
use Bitrix\Catalog\SkuTable;

/**
 * Получить ID родительского товара по SKU с кешем
 * @param int $skuId ID торгового предложения
 * @return int|false ID родительского товара или false
 */
function getParentProductIdBySku($skuId) {
    if (!Loader::includeModule('catalog')) {
        return false;
    }
    
    $cache = Application::getInstance()->getCache();
    $cacheId = 'parent_product_' . $skuId;
    $cacheDir = '/catalog/parent_product/';
    $cacheTtl = 3600; // 1 час
    
    if ($cache->initCache($cacheTtl, $cacheId, $cacheDir)) {
        $parentId = $cache->getVars();
    } elseif ($cache->startDataCache()) {
        $sku = SkuTable::getList([
            'filter' => ['=ID' => $skuId],
            'select' => ['PRODUCT_ID'],
            'limit' => 1
        ])->fetch();
        
        $parentId = $sku && $sku['PRODUCT_ID'] ? (int)$sku['PRODUCT_ID'] : false;
        $cache->endDataCache($parentId);
    } else {
        $parentId = false;
    }
    
    return $parentId;
}

Usage:

$skuId = 12345;
$parentId = getParentProductIdBySku($skuId);
if ($parentId) {
    // Работаем с родительским товаром
    $product = CIBlockElement::GetByID($parentId)->GetNext();
}

Notes:

⚠️ Используется SkuTable (D7 API) с полем PRODUCT_ID для получения родительского товара. Для старых версий Bitrix можно использовать CCatalogSku::GetProductInfo($skuId), но D7 предпочтительнее. Модуль catalog должен быть подключен.