Как получить выбранную систему доставки из заказа?

Как из объекта заказа (Bitrix\Sale\Order) получить выбранную для него систему доставки? Хоть в каком-нибудь виде.

Во всех мануалах что гуглятся авторы стыдливо обходят этот вопрос. Только здесь https://verstaem.com/lessons/making-sale-order-aja... нашел:
$shipment = false;
/** @var \Bitrix\Sale\Shipment $shipmentItem */
foreach ($component->order->getShipmentCollection() as $shipmentItem) {
	if (!$shipmentItem->isSystem()) {
		$shipment = $shipmentItem;
		break;
	}
}

Но это похоже не так, потому что у меня isSystem == true всегда только для системной доставки "без доставки" , вне зависимости от того, какая из служб доставки выбрана. Т.е. этот код всегда возвращает отгрузку у которой система доставки Bitrix\Sale\Delivery\Services\EmptyDeliveryService

При этом, что интересно, некоторые службы доставки вообще не находятся в ShipmentCollection, причем даже когда они выбраны. Например службы доставки модуля boxberry.

На случай, если у меня проблема молотка: задача в том, чтобы определить что выбрана служба доставки на основе моего модуля. Для этого я хочу найти выбранную службу (или отгрузку, а потом получить из нее службу) и проверить имя класса службы.
  • Вопрос задан
  • 668 просмотров
Решения вопроса 1
Suntechnic
@Suntechnic Автор вопроса
Эх... как обычно. Сам спросил - сам отвечаю:
Я не верно понимал как службы доставки назначаются заказу. Точнее я думал что заказу так или иначе назначается какая-то одна конкретная служба. Однако это не так - к заказу добавляются отгрузки. Причем их может быть сколько угодно. Отгрузкам уже соответствую службы доставки.

Т.е. если мы хотим понять есть ли у заказа наша служба доставки, мы должны проверить есть ли у заказа хотя бы одна отгрузка основанная на нашей службе:
foreach($order->getShipmentCollection() as $shipment) { // перебираем отгрузки
            $delivery = $shipment->getDelivery(); // получаем систему доставки
            if (get_class($delivery) == 'Класс\Хендлера') { // эта наша система?
                // тут какой-то код, который нам нужно выполнить если есть наша СД
            }
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы