Пока Битрикс не выпустил обновление, решающее эту задачу, опишу костыль для решения на коленке.
Проблема: товары родители в торговом каталоге c SKU не имеют цены и потому не попадают в выгрузку.
Решение: получить цену (в данном случае - минимальную) для торгового предложения (которое есть в наличии) данного товара
Примечание: данное решение подходит для случая, когда все торговые предложения данного товара выводятся на одной странице - мы берем только одно предложение, чтобы не дублировать URL. Для случая, когда предложения на разных страницах - надо генерировать отдельные offers со своими уникальными URL [spoiler]
По шагам:
1. копируем yandex_run.php и yandex_setup.php в yandex_sku_run.php и yandex_sku_setup.php в папках /bitrix/php_interface/include/catalog_export/ и /bitrix/modules/catalog/load/
В списке профилей экспорта интернет-магазина появится yandex_sku.
2. в /bitrix/modules/catalog/load/yandex_sku_run.php находим строку 409 и комментируем этот код -
- у товаров родителей нет цены
3. после закомментированного кода вставляем этот код:
где (подставьте свои значения):
Что делает этот код? Он вытаскивает из инфоблока торговых предложений предложения, привязанные к данному элементу. Причем, предложение будет с минимальной ценой и количеством на складе больше нуля.
PS код отлично работает на отдельной тестовой странице, а внутри yandex_sku_run.php - не хочет, зараза.. Кто знает, в чем дело?
PPS Евгений Жуков подсказал, что лучше использовать CIBlockElement::GetList() - не нужно указывать ID инфоблока. Вот альтернативный код:
он работает
Проблема: товары родители в торговом каталоге c SKU не имеют цены и потому не попадают в выгрузку.
Решение: получить цену (в данном случае - минимальную) для торгового предложения (которое есть в наличии) данного товара
Примечание: данное решение подходит для случая, когда все торговые предложения данного товара выводятся на одной странице - мы берем только одно предложение, чтобы не дублировать URL. Для случая, когда предложения на разных страницах - надо генерировать отдельные offers со своими уникальными URL [spoiler]
По шагам:
1. копируем yandex_run.php и yandex_setup.php в yandex_sku_run.php и yandex_sku_setup.php в папках /bitrix/php_interface/include/catalog_export/ и /bitrix/modules/catalog/load/
В списке профилей экспорта интернет-магазина появится yandex_sku.
2. в /bitrix/modules/catalog/load/yandex_sku_run.php находим строку 409 и комментируем этот код -
if ($XML_DATA['PRICE'] > 0) { $minPrice = $arAcc["CATALOG_PRICE_".$XML_DATA['PRICE']]; $minPriceGroup = $XML_DATA['PRICE']; $minPriceCurrency = $arAcc["CATALOG_CURRENCY_".$XML_DATA['PRICE']]; $minPriceRUR = CCurrencyRates::ConvertCurrency($arAcc["CATALOG_PRICE_".$XML_DATA['PRICE']], $arAcc["CATALOG_CURRENCY_".$XML_DATA['PRICE']], $RUR); } else { if ($arPrice = CCatalogProduct::GetOptimalPrice( $arAcc['ID'], 1, array(2), // anonymous 'N', array(), $ar_iblock['LID'] )) { $minPrice = $arPrice['DISCOUNT_PRICE']; $minPriceCurrency = $BASE_CURRENCY; $minPriceRUR = CCurrencyRates::ConvertCurrency($minPrice, $BASE_CURRENCY, $RUR); $minPriceGroup = $arPrice['PRICE']['CATALOG_GROUP_ID']; } |
3. после закомментированного кода вставляем этот код:
$SKU_IBLOCK_ID = 19; $sku_items = GetIBlockElementListEx("1c_catalog", $SKU_IBLOCK_ID, array(), array('CATALOG_PRICE_4' => 'ASC', '>CATALOG_QUANTITY' => 0), 1, array("=PROPERTY_CML2_LINK_VALUE" => $arAcc["ID"]), array("ID","CATALOG_GROUP_4_VALUE") X ); while($arItem = $sku_items->GetNext()) { $minPrice = $arItem['CATALOG_PRICE_4'] ; } |
$SKU_IBLOCK_ID - ИД инфоблока торгового предложения 1c_catalog - код типа инфоблока CATALOG_PRICE_4 - цена с ИД 4 |
PS код отлично работает на отдельной тестовой странице, а внутри yandex_sku_run.php - не хочет, зараза.. Кто знает, в чем дело?
PPS Евгений Жуков подсказал, что лучше использовать CIBlockElement::GetList() - не нужно указывать ID инфоблока. Вот альтернативный код:
$sku_items = CIBlockElement::GetList( array('CATALOG_PRICE_4' => 'ASC'), X array("=PROPERTY_CML2_LINK" => $arAcc["ID"]), false, false, array("ID", "CATALOG_GROUP_4") ); $i=0; while($arItem = $sku_items->GetNext()) { if($i == 0) $minPrice = (integer)$arItem['CATALOG_PRICE_4'] ; $i++; } |