Как добавить в корзину выбранные значения множественного свойства с пересчетом цены?

Для добавления выбранных значений множественного свойства в корзину с пересчетом цены в системе 1C-Bitrix необходимо выполнить следующие шаги:

1. Получить выбранные значения множественного свойства.

Для этого можно использовать методы класса CIBlockElement или CIBlockPropertyEnum, в зависимости от того, где хранятся значения свойства (в элементе инфоблока или в отдельной таблице).

Пример получения выбранных значений множественного свойства с использованием CIBlockElement:

   $elementId = 123; // ID элемента инфоблока
   $propertyCode = "PROPERTY_CODE"; // символьный код свойства
   $selectedValues = array();
   
   $rsProp = CIBlockElement::GetPropertyValues(
      CIBlock::GetByID($elementId)->Fetch()['IBLOCK_ID'],
      array('ID' => $elementId),
      true,
      array('ID', $propertyCode)
   );
   
   while ($arProp = $rsProp->Fetch()) {
      if (isset($arProp[$propertyCode]) && is_array($arProp[$propertyCode])) {
         foreach ($arProp[$propertyCode] as $value) {
            $selectedValues[] = $value;
         }
      }
   }

2. Пересчитать цену, учитывая выбранные значения свойства.

Для этого можно использовать событие "OnSaleComponentOrderOneStepOrderProps" или "OnSaleComponentOrderProperties" и добавить в обработчик расчет стоимости дополнительных опций, основываясь на выбранных значениях множественного свойства.

Пример обработчика события "OnSaleComponentOrderOneStepOrderProps":

   AddEventHandler("sale", "OnSaleComponentOrderOneStepOrderProps", "calculatePropertyPrice");
   
   function calculatePropertyPrice(&$arUserResult, $arParams) {
      $propertyCode = "PROPERTY_CODE"; // символьный код свойства
      $selectedValues = $arUserResult['ORDER_PROP'][$propertyCode];
      $additionalPrice = 100; // дополнительная цена за каждое выбранное значение
      
      if (is_array($selectedValues)) {
         $additionalCost = count($selectedValues) * $additionalPrice;
         $arUserResult['ORDER_PRICE'] += $additionalCost;
         $arUserResult['ORDER_TOTAL_PRICE'] += $additionalCost;
      }
   }

В данном примере мы получаем выбранные значения свойства из массива $arUserResult['ORDER_PROP']. Затем, если значения являются массивом, мы считаем дополнительную стоимость, умножая количество выбранных значений на цену за каждое значение. После этого мы добавляем эту стоимость к общей цене заказа ($arUserResult['ORDER_PRICE'] и $arUserResult['ORDER_TOTAL_PRICE']).

3. Отобразить пересчитанную цену в корзине.

Для этого можно модифицировать шаблон компонента корзины или использовать событие "OnSaleBasketItemRefresh".

Пример модификации шаблона компонента корзины:

   $basketItems = CSaleBasket::GetList(
      array(),
      array('FUSER_ID' => CSaleBasket::GetBasketUserID(), 'LID' => SITE_ID, 'ORDER_ID' => 'NULL'),
      false,
      false,
      array('ID', 'PRODUCT_ID', 'NAME', 'PRICE', 'QUANTITY')
   );
   
   while ($item = $basketItems->Fetch()) {
      $basketProperty = CSaleBasket::GetPropsList(
         array('SORT' => 'ASC'),
         array('BASKET_ID' => $item['ID'])
      );
   
      while ($property = $basketProperty->Fetch()) {
         if ($property['CODE'] == 'PROPERTY_CODE') {
            $item['PRICE'] += $additionalPrice * count($property['VALUE']);
            break;
         }
      }
      
      // Вывод информации о товаре: $item['NAME'], $item['PRICE'], $item['QUANTITY']
   }

В данном примере мы получаем список товаров в корзине и проходим по каждому товару. Затем, используя метод CSaleBasket::GetPropsList, получаем значения свойств товара и находим нужное свойство по его коду. Если свойство найдено, мы изменяем цену товара, прибавляя к ней дополнительную стоимость, умноженную на количество выбранных значений свойства.

Приведенные примеры являются общими и должны быть адаптированы в зависимости от специфики вашего проекта и требований. Необходимо заменить "PROPERTY_CODE" на символьный код свойства, а также установить правильные значения дополнительной цены.