Оказалось следующее:
У меня в файле который принимал по ajax id товара и количество для добавления в корзину была самописная функция:
function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());
}
В случаи если не используется стандартный компонент для добавления в корзину галочка "Значение добавляется в корзину" бесполезна, то есть если Вы пишите свой вариант добавления в корзину на API то добавление свойств необходимо производить самостоятельно, и возможно это сделать и в функции Add2BasketByProductID(не смотря на то что она устаревшая), для этого передавать свойства требуется в третьем параметре.
Моя ошибка была в том, что я не помещал свойства в ещё один массив, то есть 3-ий параметр должен выглядеть так: array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")) ну или несколько вложенных массивов внутри внешнего через запятую.
То есть в моём случаи я поправил строчку:
return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array());
на строчку:
return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение")));
То есть исправление потребовалось только в файле добавляющем товары в корзину. Файл же который из корзины формирует заказ я не трогал. В результате замены вышеуказанной строчки в админке получил следующее:
Методом о которым пишет Роман Грицук тоже возможно, например следующим кодом:
$fields = array("PRODUCT_ID"=>$PRODUCT_ID,"QUANTITY"=>2,"PROPS"=>
array(array("NAME"=>"Имя свойства","CODE"=>"test_code","VALUE"=>"Значение"))
);
$r = \Bitrix\Catalog\Product\Basket::addProduct($fields);
Зачем в массиве свойств передаётся CODE не совсем понятно, при этом
экспериментальным путём установлено что этот код не обязан совпадать с кодом указанным в свойствах инфоблока.
Возможно кому то потребуется метод для получения свойств инфоблока у которых отмечена галочка "Значение добавляется в корзину"(информацию по этому поводу нашёл тут
https://dev.1c-bitrix.ru/support/forum/forum48/top... )
$IBlockId = 2;//В данном случаи передаю Id инфоблока торговых предложений
$ee = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($IBlockId);
var_dump($ee);//возвращает:array(2) { [0]=> string(2) "11" [1]=> string(2) "42" } 11 и 42 это Id свойств торговых предложений отмеченных галочкой "Значение добавляется в корзину"
Итого я переписал исходную функцию следующим образом(только учитывайте что у меня в ней перебираются только свойства типа список(ENUM), поскольку мне другие были не нужны):
function productAddToBasket($PRODUCT_ID=0,$QUANTITY=0) {
$TPIBlockId = 2;//Инфоблок торговых предложений(в данной задаче требуется только он, возможно в другой потребуется выбирать свойства из обоих инфоблоков)
$propIds = \Bitrix\Catalog\Product\PropertyCatalogFeature::getBasketPropertyCodes($TPIBlockId);//Получаем Id свойств отмеченные галочкой "Значение добавляется в корзину"
$dbProps = CIBlockElement::GetProperty($TPIBlockId,$PRODUCT_ID,array(),Array("ID"=>$propIds));
$propsForBasketAr = array();
while($oneProp = $dbProps->Fetch()) {
//В следующей строчке условие которое выбирает значения только для ENUM свойств, если есть другие требуется дописать
if (isset($oneProp["VALUE_ENUM"]) and $oneProp["VALUE_ENUM"] and isset($oneProp["NAME"]) and $oneProp["NAME"] and isset($oneProp["CODE"]) and $oneProp["CODE"]) {
$propsForBasketAr[] = array("NAME"=>$oneProp["NAME"],"CODE"=>$oneProp["CODE"],"VALUE"=>$oneProp["VALUE_ENUM"]);
}
}
return Add2BasketByProductID($PRODUCT_ID,$QUANTITY,$propsForBasketAr);
}
Есть ещё одно решение, которое предложил PetrPo. Подробности находятся в комментариях под его ответом. Если сделать как он написал результат будет таким: