Хороший пример создания (добавления) торгового предложения в Bitrix через API:
use \Bitrix\Main\Loader;
if (!Loader::includeModule('iblock') || !Loader::includeModule('catalog'))
{
die('Error loading module iblock or catalog');
}
$IBlockOffersCatalogId = 3; // ID инфоблока предложений (должен быть торговым каталогом)
$productName = "Товар"; // наименование товара
$offerName = "Торговое предложение"; // наименование торгового предложения
$offerPrice = 100.50; // Цена торгового предложения
$arCatalog = CCatalog::GetByID($IBlockOffersCatalogId);
$IBlockCatalogId = $arCatalog['PRODUCT_IBLOCK_ID']; // ID инфоблока товаров
$SKUPropertyId = $arCatalog['SKU_PROPERTY_ID']; // ID свойства в инфоблоке предложений типа "Привязка к товарам (SKU)"
$obElement = new CIBlockElement();
$arFields = array(
'NAME' => $productName,
'IBLOCK_ID' => $IBlockCatalogId,
'ACTIVE' => 'Y'
);
$productId = $obElement->Add($arFields); // добавили товар, получили ID
if ($productId)
{
$obElement = new CIBlockElement();
// свойства торгвоого предложения
$arOfferProps = array(
$SKUPropertyId => $productId,
);
$arOfferFields = array(
'NAME' => $offerName,
'IBLOCK_ID' => $IBlockOffersCatalogId,
'ACTIVE' => 'Y',
'PROPERTY_VALUES' => $arOfferProps
);
$offerId = $obElement->Add($arOfferFields); // ID торгового предложения
if ($offerId)
{
// добавляем как товар и указываем цену
$catalogProductAddResult = CCatalogProduct::Add(array(
"ID" => $offersId,
"VAT_INCLUDED" => "Y", //НДС входит в стоимость
));
if ($catalogProductAddResult && !CPrice::SetBasePrice($offerId, $offerPrice, "RUB"))
throw new Exception("Ошибка установки цены торгового предложения \"{$offerId}\"");
else
throw new Exception("Ошибка добавления параметров торгового предложения \"{$offerId}\" в каталог товаров");
}
else
{
throw new Exception("Ошибка добавления торгового предложения: " . $obElement->LAST_ERROR);
}
}
else
{
throw new Exception("Ошибка добавления товара: " . $obElement->LAST_ERROR);
}
Что проверить после создания предложения
После добавления торгового предложения проверьте три связи: привязку к товару, цены и остатки. В Bitrix предложение может успешно создаться, но не появиться в публичной части, если не заполнены обязательные свойства SKU, не сохранён товарный каталог или не обновлены кеши.
- Убедитесь, что модуль iblock подключён перед созданием элемента.
- Если задаются цена и складской остаток, подключите модуль catalog.
- Проверьте свойство связи с товаром, чаще всего это CML2_LINK или настроенное в конкретном каталоге свойство SKU.
- После записи цены и остатков очистите кеш компонента каталога.
Минимальная последовательность такая: создать элемент торгового предложения в инфоблоке SKU, записать связь с товаром, сохранить параметры товара, установить цену, установить количество. Если хотя бы один шаг пропущен, предложение может быть видно в админке, но не попадёт в публичный каталог.
CModule::IncludeModule('iblock');
CModule::IncludeModule('catalog');
$offerId = $el->Add($fields);
CCatalogProduct::Add([
'ID' => $offerId,
'QUANTITY' => 10,
]);
CPrice::SetBasePrice($offerId, 990, 'RUB');
На боевом проекте обязательно логируйте результат Add и текст ошибки LAST_ERROR. Bitrix часто молча возвращает false, а настоящая причина находится именно там: обязательное поле, неправильный инфоблок, неверный код свойства или недостаточные права.