Работа с заказами на D7

Просмотров: 147

Задача: изучить работу с заказами в новом API Битрикс D7, получение данных заказа, работа со свойствами, оплатами и отгрузками

Основы работы с заказами в D7

У заметки есть аналог:
Заказы с корзинами, свойствами, доставками и оплатами

В Bitrix D7 все операции с заказами выполняются через класс Bitrix\Sale\Order. Важно помнить: изменения сохраняются только после вызова метода save().

use Bitrix\Sale;

// Загружаем существующий заказ по ID
$orderId = 123;
$order = Sale\Order::load($orderId);

// Или по номеру заказа
$orderNumber = "ORDER-2024-001";
$order = Sale\Order::loadByAccountNumber($orderNumber);

if ($order) {
    // Основные методы получения данных заказа
    echo "ID заказа: " . $order->getId();
    echo "Сумма: " . $order->getPrice();
    echo "Валюта: " . $order->getCurrency();
    echo "ID пользователя: " . $order->getUserId();
    echo "Дата создания: " . $order->getDateInsert()->format('d.m.Y H:i:s');

    // Проверка статусов заказа
    if ($order->isPaid()) {
        echo "Заказ оплачен";
    }

    if ($order->isAllowDelivery()) {
        echo "Доставка разрешена";
    }

    if ($order->isShipped()) {
        echo "Заказ отправлен";
    }
}

Работа со свойствами заказа

Свойства заказа содержат контактную информацию покупателя и другие важные данные. Получить их можно через коллекцию свойств.

// Получаем коллекцию свойств заказа
$propertyCollection = $order->getPropertyCollection();

// Получение стандартных свойств по их типу
$email = $propertyCollection->getUserEmail();
$phone = $propertyCollection->getPhone();
$name = $propertyCollection->getPayerName();
$address = $propertyCollection->getAddress();

if ($email) {
    echo "Email покупателя: " . $email->getValue();
}

if ($phone) {
    echo "Телефон: " . $phone->getValue();
}

// Получение свойства по ID
$propertyId = 15;
$customProperty = $propertyCollection->getItemByOrderPropertyId($propertyId);
if ($customProperty) {
    echo "Значение: " . $customProperty->getValue();
    echo "Название свойства: " . $customProperty->getName();
    echo "Обязательное: " . ($customProperty->isRequired() ? 'Да' : 'Нет');
}

// Изменение значения свойства
$customProperty->setValue("Новое значение");
$order->save(); // Обязательно сохраняем изменения

Получение информации о корзине заказа

Корзина заказа содержит все товары. Через неё можно получить детальную информацию о каждом товаре в заказе.

// Получаем корзину заказа
$basket = $order->getBasket();

// Проходим по всем товарам в корзине
foreach ($basket as $basketItem) {
    echo "ID товара: " . $basketItem->getProductId();
    echo "Название: " . $basketItem->getField('NAME');
    echo "Цена за единицу: " . $basketItem->getPrice();
    echo "Количество: " . $basketItem->getQuantity();
    echo "Общая стоимость: " . $basketItem->getFinalPrice();

    // Получение дополнительных свойств товара
    $props = $basketItem->getPropertyCollection();
    foreach ($props as $prop) {
        echo $prop->getField('NAME') . ": " . $prop->getValue();
    }
}

Работа с оплатами и отгрузками

Каждый заказ может иметь несколько оплат и отгрузок. Для работы с ними используются соответствующие коллекции.

// Получение информации об оплатах
$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment) {
    echo "ID оплаты: " . $payment->getId();
    echo "Сумма к оплате: " . $payment->getSum();
    echo "Система оплаты: " . $payment->getPaymentSystemName();
    echo "Оплачено: " . ($payment->isPaid() ? 'Да' : 'Нет');

    if ($payment->isPaid()) {
        echo "Дата оплаты: " . $payment->getField('DATE_PAID')->format('d.m.Y H:i:s');
    }
}

// Получение информации об отгрузках
$shipmentCollection = $order->getShipmentCollection();
foreach ($shipmentCollection as $shipment) {
    if ($shipment->isSystem()) {
        continue; // Пропускаем системную отгрузку
    }

    echo "ID отгрузки: " . $shipment->getId();
    echo "Служба доставки: " . $shipment->getDeliveryName();
    echo "Стоимость доставки: " . $shipment->getPrice();
    echo "Отгружено: " . ($shipment->isShipped() ? 'Да' : 'Нет');

    // Получение товаров в отгрузке
    $shipmentItemCollection = $shipment->getShipmentItemCollection();
    foreach ($shipmentItemCollection as $shipmentItem) {
        if ($shipmentItem->isSystem()) {
            continue;
        }
        echo "Товар: " . $shipmentItem->getBasketItem()->getField('NAME');
        echo "Количество в отгрузке: " . $shipmentItem->getQuantity();
    }
}

// Получение скидок, примененных к заказу
$discountData = $order->getDiscount()->getApplyResult();
if (!empty($discountData['DISCOUNT_LIST'])) {
    foreach ($discountData['DISCOUNT_LIST'] as $discount) {
        if ($discount['APPLY'] == 'Y') {
            echo "Скидка: " . $discount['NAME'];
            echo "Размер скидки: " . $discount['DISCOUNT_VALUE'];
        }
    }
}

Полный пример, данные о заказе пользователя

Пример из cамописного компонента оформления заказа. Базовое содержимое файла component.php (или можно завернуть в методы class.php)

use Bitrix\Main\Engine\CurrentUser,
    Bitrix\Main\Loader,
    Bitrix\Sale\Order;

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

$arResult['USER_ID'] = CurrentUser::get()->getId();;
$arResult['ORDER_ID'] = $_GET['ORDER_ID'];

// Загружаем заказ ========================================================
$order = Order::load($arResult['ORDER_ID']);
//echo '
';
//print_r($order);
//echo '
'; // Проверяем существование заказа и принадлежность пользователю if (!$order || $order->getUserId() != $arResult['USER_ID']) { LocalRedirect('/'); } // Получаем все поля заказа $arResult['ORDER'] = [ 'ID' => $order->getId(), 'USER_ID' => $order->getUserId(), 'DATE_INSERT' => $order->getField('DATE_INSERT'), 'DATE_STATUS' => $order->getField('DATE_STATUS'), 'PAYED' => $order->getField('PAYED'), 'STATUS_ID' => $order->getField('STATUS_ID'), 'PRICE' => $order->getPrice(), 'CURRENCY' => $order->getCurrency(), 'DISCOUNT_VALUE' => $order->getDiscountPrice(), 'TAX_VALUE' => $order->getTaxValue(), 'DELIVERY_ID' => $order->getField('DELIVERY_ID'), 'PRICE_DELIVERY' => $order->getField('PRICE_DELIVERY'), 'PAY_SYSTEM_ID' => $order->getField('PAY_SYSTEM_ID'), 'CANCELED' => $order->getField('CANCELED'), 'DATE_CANCELED' => $order->getField('DATE_CANCELED'), 'REASON_CANCELED' => $order->getField('REASON_CANCELED'), 'COMMENTS' => $order->getField('COMMENTS'), ]; echo '
';
print_r($arResult['ORDER']);
echo '
'; // Получаем корзину заказа $basket = $order->getBasket(); $arResult['BASKET_ITEMS'] = []; if ($basket) { foreach ($basket as $basketItem) { $arResult['BASKET_ITEMS'][] = [ 'ID' => $basketItem->getId(), 'PRODUCT_ID' => $basketItem->getProductId(), 'NAME' => $basketItem->getField('NAME'), 'PRICE' => $basketItem->getPrice(), 'BASE_PRICE' => $basketItem->getBasePrice(), 'QUANTITY' => $basketItem->getQuantity(), 'CURRENCY' => $basketItem->getCurrency(), 'DISCOUNT_PRICE' => $basketItem->getDiscountPrice(), ]; } } // Получаем свойства заказа $propertyCollection = $order->getPropertyCollection(); $arResult['ORDER_PROPS'] = []; foreach ($propertyCollection as $property) { $arResult['ORDER_PROPS'][$property->getField('CODE')] = [ 'CODE' => $property->getField('CODE'), 'NAME' => $property->getField('NAME'), 'VALUE' => $property->getValue(), 'ORDER_PROPS_ID' => $property->getPropertyId(), ]; } //echo '
';
//print_r($arResult['ORDER_PROPS']);
//echo '
'; // Получаем информацию о доставке $shipmentCollection = $order->getShipmentCollection(); $arResult['DELIVERY'] = []; foreach ($shipmentCollection as $shipment) { // Пропускаем системную отгрузку if ($shipment->isSystem()) { continue; } $arResult['DELIVERY'] = [ 'ID' => $shipment->getId(), 'DELIVERY_ID' => $shipment->getDeliveryId(), 'DELIVERY_NAME' => $shipment->getDeliveryName(), 'PRICE_DELIVERY' => $shipment->getPrice(), 'CURRENCY' => $shipment->getCurrency(), 'ALLOW_DELIVERY' => $shipment->getField('ALLOW_DELIVERY'), 'DATE_ALLOW_DELIVERY' => $shipment->getField('DATE_ALLOW_DELIVERY'), 'DEDUCTED' => $shipment->getField('DEDUCTED'), 'DATE_DEDUCTED' => $shipment->getField('DATE_DEDUCTED'), 'STATUS_ID' => $shipment->getField('STATUS_ID'), 'TRACKING_NUMBER' => $shipment->getField('TRACKING_NUMBER'), 'COMMENTS' => $shipment->getField('COMMENTS'), ]; } //echo '
';
//print_r($arResult['DELIVERY']);
//echo '
'; // Получаем информацию о платежной системе $paymentCollection = $order->getPaymentCollection(); $arResult['PAYMENT'] = []; foreach ($paymentCollection as $payment) { $arResult['PAYMENT'] = [ 'ID' => $payment->getId(), 'PAY_SYSTEM_ID' => $payment->getPaymentSystemId(), 'PAY_SYSTEM_NAME' => $payment->getPaymentSystemName(), 'SUM' => $payment->getSum(), 'CURRENCY' => $payment->getField('CURRENCY'), 'PAID' => $payment->isPaid(), 'DATE_PAID' => $payment->getField('DATE_PAID'), 'DATE_BILL' => $payment->getField('DATE_BILL'), 'IS_RETURN' => $payment->getField('IS_RETURN'), 'DATE_RETURN' => $payment->getField('DATE_RETURN'), 'COMMENTS' => $payment->getField('COMMENTS'), ]; } //echo '
';
//print_r($arResult['PAYMENT']);
//echo '
';

Объяснение структуры работы

Система работы с заказами в D7 построена на нескольких ключевых принципах:

Объектно-ориентированный подход:

  • Заказ представлен объектом класса Sale\Order
  • Все связанные данные (свойства, корзина, оплаты) доступны через методы объекта
  • Изменения применяются только после явного вызова save()

Коллекции данных:

  • PropertyValueCollection — коллекция свойств заказа
  • Basket — коллекция товаров в заказе
  • PaymentCollection — коллекция платежей
  • ShipmentCollection — коллекция отгрузок

Преимущества нового API:

  • Типизированные методы для получения данных
  • Встроенная валидация данных
  • Удобная работа с датами через объекты DateTime
  • Централизованное управление транзакциями

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 150 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 5-ти недель

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 2-х недель

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфоресурс

от 300 000 руб. от 4-х недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

3D‑моделирование, визуализация

от 25 000 руб. от 3-х дней

По вашим фото, чертежам или описанию создадим 3D‑модели и отрендерим набор изображений для каталога товаров: общий вид, крупные планы и технические ракурсы или 360°‑обзор товара.