DarkRiDDeR2 мин

Bitrix API. Создание (добавление) торгового предложения товара

BitrixPHP

Хороший пример создания (добавления) торгового предложения в 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, а настоящая причина находится именно там: обязательное поле, неправильный инфоблок, неверный код свойства или недостаточные права.