Bitrix D7 — полное оформление заказа (покупатель, доставка, оплата)

Полный пример создания заказа в Bitrix D7: пользователь, корзина, свойства плательщика, отгрузка, служба доставки и платёж.
use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
use Bitrix\Sale\Basket;
use Bitrix\Sale\Delivery\Services\Manager as DeliveryManager;
use Bitrix\Sale\PaySystem\Manager as PaySystemManager;

Loader::includeModule('sale');
Loader::includeModule('catalog');

global $USER;
$siteId = \Bitrix\Main\Context::getCurrent()->getSite();

// 1) Создаём заказ
$userId = $USER && $USER->IsAuthorized() ? (int)$USER->GetID() : \CSaleUser::GetAnonymousUserID();
$order = Order::create($siteId, $userId);
$order->setPersonTypeId(1); // ID типа плательщика

// 2) Корзина
$basket = Basket::create($siteId);

// Добавляем позицию каталога (productId = 123)
$item = $basket->createItem('catalog', 123);
$item->setFields([
  'QUANTITY' => 2,
  'CURRENCY' => 'RUB',
  'LID'      => $siteId,
  'PRODUCT_PROVIDER_CLASS' => \Bitrix\Catalog\Product\Basket::getDefaultProviderName()
]);

$order->setBasket($basket);

// 3) Свойства плательщика (телефон, email и т.п.)
$propCollection = $order->getPropertyCollection();
if ($emailProp = $propCollection->getUserEmail()) {
  $emailProp->setValue('buyer@example.com');
}
if ($phoneProp = $propCollection->getPhone()) {
  $phoneProp->setValue('+7 900 000-00-00');
}
// По коду свойства:
if ($addressProp = $propCollection->getItemByOrderPropertyCode('ADDRESS')) {
  $addressProp->setValue('Москва, ул. Пример, д. 1');
}

// 4) Отгрузка (доставка)
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();

// Выбираем службу доставки (пример: самовывоз/курьер по ID)
$deliveryId = 1; // подставьте реальный ID службы
$service = DeliveryManager::getObjectById($deliveryId);
$shipment->setFields([
  'DELIVERY_ID'   => $deliveryId,
  'DELIVERY_NAME' => $service ? $service->getName() : 'Доставка',
]);

// Привязываем товары к отгрузке
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($basket as $basketItem) {
  $shipmentItem = $shipmentItemCollection->createItem($basketItem);
  $shipmentItem->setQuantity($basketItem->getQuantity());
}

// 5) Платёж
$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();

$paySystemId = 1; // подставьте реальный ID платёжной системы
$paySystem = PaySystemManager::getObjectById($paySystemId);

$payment->setFields([
  'SUM'           => $order->getPrice(),
  'CURRENCY'      => $order->getCurrency(),
  'PAY_SYSTEM_ID' => $paySystemId,
  'PAY_SYSTEM_NAME' => $paySystem ? $paySystem->getField('NAME') : 'Оплата'
]);

// 6) Финализация и сохранение
$order->doFinalAction(true);
$r = $order->save();

if (!$r->isSuccess()) {
  echo implode('<br>', $r->getErrorMessages());
} else {
  echo 'Заказ создан №' . $order->getId();
}