Ждал красивого решения от битрикса? )) А вот и хрен. Чтобы получить твой \Bitrix\Sale\BasketItem $obItem придется передать все его $properties в 3-ий параметр getExistsItem, типа
$obItem = $obBasket->getExistsItem('catalog', $productId, [
0 => ['CODE' => 'PROP1', 'VALUE' => 'electron'],
//......
]);
вообще не понятно зачем этот метод public, если им хрен воспользуешься, надо знать все свойства товара в корзине, у меня это выглядело так
$obItem = $obBasket->getExistsItem('catalog', $productId, [
0 => ['CODE' => 'ARTNUMBER', 'VALUE' => '235-81-03'],
1 => ['CODE' => 'COLOR_REF', 'VALUE' => 'Черный'],
2 => ['CODE' => 'SIZES_CLOTHES', 'VALUE' => 'XS'],
3 => ['CODE' => 'CATALOG.XML_ID', 'VALUE' => 'clothes_offers_s1'],
4 => ['CODE' => 'PRODUCT.XML_ID', 'VALUE' => '332#337'],
]);
Вообщем решение конечно будет не таким красивым, как просто методом воспользоваться, но если метод getExistsItem посмотреть, там тоже самое делается, только еще кое-что
\Bitrix\Main\Loader::includeModule('sale');
$siteId = 's1';
$fUserId = \Bitrix\Sale\FUser::getId();
$productId = 139;
$productByBasketItem = null;
$bProductInBasket = false;
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fUserId, $siteId);
$basketItems = $basket->getBasketItems();
if($basketItems) {
foreach($basketItems as $basketItem) {
if($basketItem->getField('PRODUCT_ID') == $productId) {
$productByBasketItem = $basketItem;
$bProductInBasket = true;
break;
}
}
}
var_dump($bProductInBasket);
var_dump($productByBasketItem);
В примере написал булево $bProductInBasket и записал сам объект \Bitrix\Sale\BasketItem в $productByBasketItem, там сам по ситуации выбирай как надо