Роганов Игорь, лучше делать на событиях.
Можете воспользоваться моим примером (не самый лучший вариант, но для разбора сгодится):
[CODE]$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', 'addCustomProperty');
/**
* При сохранении заказа, найдем все товары
* у которых в названии есть слово "штаны" и
* добавим свойство TEST со значением Y
*
* @param \Bitrix\Main\Event $event
* @return void
*/
function addCustomProperty( \Bitrix\Main\Event $event )
{
$order = $event->getParameter("ENTITY");
if ( $event->getParameter("IS_NEW") )
{
$basket = $order->getBasket();
foreach ($basket as $item)
{
$name = $item->getField('NAME');
if ( stripos($name, 'штаны') === false )
{
continue;
}
$arProperty = [
"NAME" => "Обратное название",
"CODE" => "TEST",
"VALUE" => 'Y',
"SORT" => 100
];
$properties = $item->getPropertyCollection();
$existedPropertyCodes = array_keys($properties->getPropertyValues());
if ( !in_array($arProperty['CODE'], $existedPropertyCodes) )
{
$testProperty = $properties->createItem();
$testProperty->setFields($arProperty);
$testProperty->save();
}
}
}
$event->addResult(
new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::SUCCESS, $order
)
);
}[/CODE]