Получить ID родительского товара по SKU (торговое предложение)
Быстрое получение ID родительского товара через CCatalogSku с кешированием результата для оптимизации.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Получаем 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 должен быть подключен.