Задать вопрос
  • С помощью какого метода в битриксе можно получить стоимость заказа, до того как он оформлен, на основании списка товаров которые в него будут входить?

    @PaulTes Автор вопроса
    Решил проблему используя D7.

    //Формируем массив товаров корзины
            $cartArray = $this->parser->getCart();
    
            if (empty($cartArray)) {
                throw new Exception('MSHOP_ERROR_EMPTY_CART');
            }
    
            $basket = Basket::create(SITE_ID);
            foreach($cartArray as $item_id => $quantity) {
                $item = $basket->createItem('catalog', $item_id);
                $item->setFields([
                    'QUANTITY' => (int)$quantity,
                    'CURRENCY' => CurrencyManager::getBaseCurrency(),
                    'LID' => SITE_ID,
                    'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
                ]);
            }
    
            $order = Order::create(SITE_ID, $this->ownerId);
            $order->setBasket($basket);
            $order->setFields([
                "PERSON_TYPE_ID" => $this->payerType,
                "CURRENCY" => $this->getBaseCurrency(),
                "USER_DESCRIPTION" => $this->parser->getComment()
            ]);
    
            //Сохраняем информацию о методе оплаты
            $sum = $order->getPrice();
            $service = PaySystemManager::getObjectById($this->parser->getPaymentMethodId());
            /**@var Payment $payment*/
            $payment = $order->getPaymentCollection()->createItem($service);
            $payment->setFields(['SUM' => $sum]);
    
            //Сохраняем свойства заказа
            $collection = $order->getPropertyCollection();
            $parsedValues = $this->parser->getFields();
    
            /**@var PropertyValue $property*/
            foreach($collection as $property){
                if ($property->getPersonTypeId() == $this->payerType){
    
                    $fieldName = OrderPropertiesHelper::getField($property->getField('CODE'));
                    $value = $parsedValues[$fieldName];
    
                    if (!empty($value)) {
                        $property->setValue($value);
                    }
                }
            }
    
            //Выбираем способ доставки
            $delivery = DeliveryManager::getObjectById(20);
            $shipment = $order->getShipmentCollection()->createItem($delivery);
            $shipment->setFields(array(
                'DELIVERY_ID' => $delivery->getId(),
                'DELIVERY_NAME' => $delivery->getName(),
            ));
    
            $order->save();
    
            //Костыль для корректного отображения выбранного способа оплаты, связан с тем что в новом апи возможно множество платежных систем в одном заказе а в старом нет.
            if ($order->getId()){
                $orderStore = new CSaleOrder();
    
                $fields = $order->getFields()->getValues();
                $fields['PAY_SYSTEM_ID'] = $payment->getPaymentSystemId();
                $orderStore->Update($order->getId(), $fields);
            }
    Ответ написан