Есть несколько способов получить доступные службы доставки, с привязкой к заказу и без нее.
Первый способ предполагает получение способов заказа без учета настроек ограничения для заказов.
Выберем активные способы доставки:
$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);