Выбор способов доставки

Есть несколько способов получить доступные службы доставки, с привязкой к заказу и без нее.

Первый способ предполагает получение способов заказа без учета настроек ограничения для заказов.

Выберем активные способы доставки:

$dbDelvery = \Bitrix\Sale\Delivery\Services\Table::getList([
    'filter' => ['ACTIVE'=>'Y'],
]);
while($rsDelivery=$dbDelvery->fetch())
{
    print_r($rsDelivery);
}

/*
Array
(
    [ID] => 1
    [CODE] => 
    [PARENT_ID] => 0
    [NAME] => Без доставки
    [ACTIVE] => Y
    [DESCRIPTION] => 
    [SORT] => 100
    [LOGOTIP] => 
    [CONFIG] => Array
        (
            [MAIN] => Array
                (
                    [CURRENCY] => RUB
                    [PRICE] => 0
                    [PERIOD] => Array
                        (
                            [FROM] => 0
                            [TO] => 0
                            [TYPE] => D
                        )
                )
        )

    [CLASS_NAME] => \Bitrix\Sale\Delivery\Services\EmptyDeliveryService
    [CURRENCY] => RUB
    [TRACKING_PARAMS] => 
    [ALLOW_EDIT_SHIPMENT] => Y
    [VAT_ID] => 
)
Array
(
    [ID] => 3
    [CODE] => 3
    [PARENT_ID] => 0
    [NAME] => Самовывоз
    [ACTIVE] => Y
    [DESCRIPTION] => 
    [SORT] => 100
    [LOGOTIP] => 
    [CONFIG] => Array
        (
            [MAIN] => Array
                (
                    [CURRENCY] => RUB
                    [PRICE] => 0
                    [PERIOD] => Array
                        (
                            [FROM] => 0
                            [TO] => 0
                            [TYPE] => D
                        )
                )
        )
    [CLASS_NAME] => \Bitrix\Sale\Delivery\Services\Configurable
    [CURRENCY] => RUB
    [TRACKING_PARAMS] => Array
        (
        )
    [ALLOW_EDIT_SHIPMENT] => Y
    [VAT_ID] => 0
)
*/

Теперь выберем доставки с учетом ограничений. Для этого нам надо сделать виртуальный заказ, добавить отгрузку и в отгрузку добавить товары из корзины. В этом случае мы получить доставки с ограничениями и корректно будет отрабатывать ограничение по стоимости товаров в заказе:

$order = \Bitrix\Sale\Order::create(\Bitrix\Main\Context::getCurrent()->getSite());
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$shipmentItemCollection = $shipment->getShipmentItemCollection();
/*Добавляем в отгрузку товары из корзины, иначе не сработает ограничение по цене товаров в корзине*/
foreach ($order->getBasket()->getOrderableItems() as $item) {
    $shipmentItem = $shipmentItemCollection->createItem($item);
    $shipmentItem->setQuantity($item->getQuantity());
}

$shipmentCollection->calculateDelivery();
$deliveryServicesAll = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedList($shipment,\Bitrix\Sale\Services\Base\RestrictionManager::MODE_MANAGER);
foreach($deliveryServicesAll as $deliveryService){
    $arDelivery[$deliveryService["ID"]] = $deliveryService;
}

Для получения доступных способов доставки используется метод getRestrictedList, где первый параметр это объект отгрузки, а второй может принимать два значения:

\Bitrix\Sale\Services\Base\RestrictionManager::MODE_CLIENT(по умолчанию) - Выводит все доставки, которые попадают под ограничения.

\Bitrix\Sale\Services\Base\RestrictionManager::MODE_MANAGER - Выводит все доставки, те которые не подают под ограничения, имеют ключ RESTRICTED.

Так же, вместо getRestrictedList можно использовать getRestrictedObjectsList. Отличие только в том, как выводится информация. В первом случае - это массив, а во втором - это объект доставки.

$deliveryServices = \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList($shipment,\Bitrix\Sale\Services\Base\RestrictionManager::MODE_MANAGER);