Понятно конечно, что сообщение от 2016 года, но так как я это искал, может кто то еще ищет.
Написал такой класс. Очень помогла эта статья
https://dev.1c-bitrix.ru/community/webdev/user/227946/blog/18513/?commentId=82973 , ну и конечно компонент sale.order.ajax.
Код class ArtfactorOrder{
protected $basket = false;
protected $order = false;
protected $profile = false;
protected $arDeliveryServiceAll = false;
public function __construct(){
$this->$siteID = \Bitrix\Main\Context::getCurrent()->getSite();
$this->order = Bitrix\Sale\Order::create($this->$siteID, $this->getUserId());
$this->order->setField('STATUS_ID', Bitrix\Sale\OrderStatus::getInitialStatus());
}
protected function getUserId(){
global $USER;
$userId = $USER->GetID();
if (!$userId)
{
$userId = CSaleUser::GetAnonymousUserID();
}
return $userId;
}
function getProfileID(){
$dbUserProfiles = CSaleOrderUserProps::GetList(
array('DATE_UPDATE' => 'DESC'),
array(
'USER_ID' => $this->order->getUserId()
)
);
if ($arUserProfiles = $dbUserProfiles->GetNext())
{
return $arUserProfiles['ID']; // Возвращаем ID первого профиля. Мне нужен именно первый, но можно переписать так, чтобы брал все
}
return null;
}
function getProfile(){
if(!$this->profile){
$profileID = $this->getProfileID();
$this->profile = Bitrix\Sale\OrderUserProperties::getProfileValues($profileID); // Получаем значения профиля
}
return $this->profile;
}
protected function setBasketToOrder(){
if(!$this->basket){
$this->basket = Bitrix\Sale\Basket::loadItemsForFUser(\CSaleBasket::GetBasketUserID(), $this->$siteID)->getOrderableItems();
$this->order->setBasket($this->basket);
}
}
protected function setProfileToOrder(){
$profile = $this->getProfile();
$propertyCollection = $this->order->getPropertyCollection();
$propertyCollection->setValuesFromPost(array('PROPERTIES' => $profile), array()); //Устанавливает значения данного профиля в заказ
}
protected function setShipmentToOrder(){
$shipmentCollection = $this->order->getShipmentCollection();
$this->initShipment($this->order);
}
function getDeliveries(){
if(!$this->arDeliveryServiceAll){
$this->setProfileToOrder();
$this->setBasketToOrder();
$this->setShipmentToOrder();
$currentShipment = $this->getCurrentShipment($this->order);
$this->arDeliveryServiceAll = Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($currentShipment);
}
return $this->arDeliveryServiceAll;
}
/**
* Initialization of shipment object. Filling with basket items.
*
* @param Order $order
* @return Shipment
* @throws Main\ArgumentTypeException
* @throws Main\NotSupportedException
*/
public function initShipment(Bitrix\Sale\Order $order)
{
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$shipmentItemCollection = $shipment->getShipmentItemCollection();
$shipment->setField('CURRENCY', $order->getCurrency());
/** @var Sale\BasketItem $item */
foreach ($order->getBasket() as $item)
{
/** @var Sale\ShipmentItem $shipmentItem */
$shipmentItem = $shipmentItemCollection->createItem($item);
$shipmentItem->setQuantity($item->getQuantity());
}
return $shipment;
}
public function getCurrentShipment(Bitrix\Sale\Order $order)
{
foreach ($order->getShipmentCollection() as $shipment)
{
if (!$shipment->isSystem())
return $shipment;
}
return null;
}
}
$order = new ArtfactorOrder();
$deliveries = $order->getDeliveries();