Работа с заказами в Bitrix D7: полное руководство

Обновлено: 23.08.2024 6041

Эффективная работа с заказами в Bitrix D7: раскроем все секреты API, помогут оптимизировать процессы и увеличить продажи вашего интернет-магазина.

Мастер-класс по работе с заказами в Bitrix D7: Превратите ваш магазин в суперзвезду продаж!

Время прочтения:

Добро пожаловать в исчерпывающее руководство по работе с заказами в Bitrix D7! Я, Алексей Солтык, SEO-специалист с 13-летним опытом, совместно с сертифицированным разработчиком Bitrix Василием Цветковым (12 лет опыта), подготовили для вас максимально полезный материал. Наша цель - помочь вам освоить все тонкости работы с заказами в современном API Bitrix.

Введение в работу с заказами в Bitrix D7

Ключевые отличия D7 API от старого API

D7 API представляет собой революционный подход к разработке на платформе Bitrix. Основные отличия от старого API включают:

  1. Объектно-ориентированный подход
  2. Строгая типизация
  3. Использование пространств имен
  4. Улучшенная производительность
  5. Более логичная и понятная структура кода

Преимущества использования D7 при работе с заказами

Переход на D7 при работе с заказами дает ряд существенных преимуществ:

  1. Ускорение разработки за счет более интуитивного API
  2. Повышение надежности кода благодаря строгой типизации
  3. Улучшение производительности, особенно при работе с большими объемами данных
  4. Упрощение поддержки и масштабирования проектов

Подключение модуля sale

Прежде чем начать работу с заказами, необходимо подключить модуль sale:

use Bitrix\Main\Loader;
if (!Loader::includeModule('sale')) {
    throw new \Exception('Не удалось подключить модуль sale');
}

Создание заказа в Bitrix D7

Пошаговая инструкция по созданию заказа

  1. Создание объекта заказа
  2. Добавление товаров в корзину
  3. Установка свойств заказа
  4. Выбор способа оплаты
  5. Выбор способа доставки
  6. Сохранение заказа

Пример кода:

$order = Order::create('s1', $userId);
$order->setPersonTypeId(1);
// Далее следуют шаги 2-6

Работа с корзиной заказа

Корзина - ключевой элемент заказа. Вот как с ней работать:

$basket = Basket::create('s1');
$item = $basket->createItem('catalog', $productId);
$item->setFields([
    'QUANTITY' => 2,
    'CURRENCY' => 'RUB',
    'LID' => 's1',
    'PRODUCT_PROVIDER_CLASS' => '\CCatalogProductProvider',
]);
$order->setBasket($basket);

Установка свойств заказа

Свойства заказа включают информацию о покупателе, адресе доставки и т.д.:

$propertyCollection = $order->getPropertyCollection();
$phoneProp = $propertyCollection->getPhone();
$phoneProp->setValue($phone);

Добавление оплаты и доставки

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

$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();
$payment->setFields([
    'PAY_SYSTEM_ID' => 1,
    'SUM' => $order->getPrice(),
]);
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$shipment->setFields([
    'DELIVERY_ID' => 1,
    'DELIVERY_NAME' => 'Курьер',
]);

Получение и загрузка заказа

Методы получения заказа по ID и номеру

Получение заказа по ID:

$order = Order::load($orderId);

Получение заказа по номеру:

$order = Order::loadByAccountNumber($accountNumber);

Загрузка списка заказов с фильтрацией

Для получения списка заказов с применением фильтров используйте метод getList:

$orders = Order::getList([
    'select' => ['ID', 'DATE_INSERT', 'PRICE'],
    'filter' => [
        '>=DATE_INSERT' => new \Bitrix\Main\Type\DateTime('2023-01-01'),
        'USER_ID' => $userId
    ],
    'order' => ['DATE_INSERT' => 'DESC']
]);

Оптимизация запросов при работе с большим количеством заказов

При работе с большим количеством заказов важно оптимизировать запросы:

  1. Используйте постраничную навигацию
  2. Выбирайте только необходимые поля
  3. Применяйте индексы к часто используемым полям фильтрации

Пример с постраничной навигацией:

$nav = new \Bitrix\Main\UI\PageNavigation("orders");
$nav->setPageSize(50);
$nav->initFromUri();
$orders = Order::getList([
    'select' => ['ID', 'DATE_INSERT', 'PRICE'],
    'filter' => ['USER_ID' => $userId],
    'order' => ['DATE_INSERT' => 'DESC'],
    'count_total' => true,
    'offset' => $nav->getOffset(),
    'limit' => $nav->getLimit(),
]);
$nav->setRecordCount($orders->getCount());

Управление свойствами заказа

Работа с коллекцией PropertyValueCollection

PropertyValueCollection предоставляет удобный интерфейс для работы со свойствами заказа:

$propertyCollection = $order->getPropertyCollection();

Получение и установка значений свойств

Получение значения свойства:

$property = $propertyCollection->getItemByOrderPropertyId($propertyId);
$value = $property->getValue();

Установка значения свойства:

$property->setValue($newValue);

Создание новых свойств заказа

Создание нового свойства:

$property = $propertyCollection->createItem([
    'NAME' => 'Новое свойство',
    'TYPE' => 'STRING',
    'CODE' => 'NEW_PROPERTY'
]);
$property->setValue('Значение нового свойства');

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

Добавление и изменение способов оплаты

Добавление нового способа оплаты:

$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem();
$payment->setFields([
    'PAY_SYSTEM_ID' => 2,
    'SUM' => 1000,
]);

Изменение способа оплаты:

$payment->setField('PAY_SYSTEM_ID', 3);

Проведение оплаты заказа

Отметка заказа как оплаченного:

$payment->setPaid('Y');
$order->save();

Отмена и возврат оплаты

Отмена оплаты:

$payment->setPaid('N');
$order->save();

Возврат оплаты:

$payment->setField('IS_RETURN', 'Y');
$payment->setField('PAY_RETURN_COMMENT', 'Причина возврата');
$order->save();

Управление доставкой заказа

Добавление способов доставки

Добавление нового способа доставки:

$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$shipment->setFields([
    'DELIVERY_ID' => 2,
    'DELIVERY_NAME' => 'Экспресс-доставка',
]);

Расчет стоимости доставки

Расчет стоимости доставки:

$shipment->calculateDelivery();
$deliveryCost = $shipment->getField('PRICE_DELIVERY');

Разрешение и запрет доставки

Разрешение доставки:

$shipment->allowDelivery();
$order->save();

Запрет доставки:

$shipment->disallowDelivery();
$order->save();

Изменение статуса и отмена заказа

Смена статуса заказа

Изменение статуса заказа:

$order->setField('STATUS_ID', 'N');
$order->save();

Процесс отмены заказа

Отмена заказа:

$order->setField('CANCELED', 'Y');
$order->setField('REASON_CANCELED', 'Причина отмены');
$order->save();

Удаление заказа из системы

Удаление заказа:

$order->delete();

Обработка ошибок при работе с заказами

Типичные ошибки и их решения

  1. Некорректные данные заказа
  2. Ошибки при сохранении
  3. Проблемы с доступом к модулю sale

Пример обработки ошибок:

try {
    $order->save();
} catch (\Bitrix\Main\ArgumentException $e) {
    // Обработка ошибки некорректных данных
} catch (\Bitrix\Main\SystemException $e) {
    // Обработка системных ошибок
}

Логирование операций с заказами

Использование встроенного механизма логирования Bitrix:

\Bitrix\Main\Diag\Debug::writeToFile([
    'Операция' => 'Создание заказа',
    'Заказ ID' => $order->getId(),
    'Сумма' => $order->getPrice(),
], 'order_operations.log');

Оптимизация производительности

Кеширование данных заказов

Использование кеширования для часто запрашиваемых данных:

$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(3600, 'order_'.$orderId)) {
    $order = $cache->getVars();
} elseif ($cache->startDataCache()) {
    $order = Order::load($orderId);
    $cache->endDataCache($order);
}

Асинхронная обработка заказов

Использование очередей для асинхронной обработки:

\Bitrix\Main\Application::getInstance()->addBackgroundJob(
    function($orderId) {
        $order = Order::load($orderId);
        // Асинхронная обработка заказа
    },
    [$orderId]
);

Интеграция с CRM и 1С

Передача данных заказа в CRM

Пример интеграции с Bitrix24 CRM:

$crmFields = [
    'TITLE' => 'Заказ №'.$order->getId(),
    'OPPORTUNITY' => $order->getPrice(),
    'CURRENCY_ID' => $order->getCurrency(),
];
\CCrmDeal::Add($crmFields);

Экспорт заказов в 1С

Использование стандартного механизма выгрузки:

\CSaleExport::ExportOrders($arFilter, 'commercial_info');

Кастомизация и расширение функционала заказов

Создание собственных обработчиков событий

Пример обработчика события создания заказа:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderSaved',
    function(\Bitrix\Main\Event $event) {
        $order = $event->getParameter("ENTITY");
        // Дополнительная логика при сохранении заказа
    }
);

Разработка дополнительных полей заказа

Добавление пользовательского поля к заказу:

$userField = new \CUserTypeEntity;
$userField->Add([
    'ENTITY_ID' => 'ORDER',
    'FIELD_NAME' => 'UF_CUSTOM_FIELD',
    'USER_TYPE_ID' => 'string',
    'XML_ID' => 'CUSTOM_FIELD',
    'SORT' => 500,
    'MULTIPLE' => 'N',
    'MANDATORY' => 'N',
    'SHOW_FILTER' => 'N',
    'SHOW_IN_LIST' => 'Y',
    'EDIT_IN_LIST' => 'Y',
    'IS_SEARCHABLE' => 'N',
    'SETTINGS' => [
        'DEFAULT_VALUE' => '',
        'SIZE' => '20',
        'ROWS' => '1',
        'MIN_LENGTH' => '0',
        'MAX_LENGTH' => '0',
        'REGEXP' => '',
    ],
    'EDIT_FORM_LABEL' => ['ru' => 'Пользовательское поле'],
    'LIST_COLUMN_LABEL' => ['ru' => 'Пользовательское поле'],
    'LIST_FILTER_LABEL' => ['ru' => 'Пользовательское поле'],
    'ERROR_MESSAGE' => ['ru' => ''],
    'HELP_MESSAGE' => ['ru' => ''],
]);

Примеры решения типовых задач

Массовое обновление заказов

Пример массового обновления статуса заказов:

$orders = Order::getList([
    'filter' => ['STATUS_ID' => 'N'],
    'select' => ['ID']
]);
while ($orderData = $orders->fetch()) {
    $order = Order::load($orderData['ID']);
    $order->setField('STATUS_ID', 'P');
    $order->save();
}

Формирование отчетов по заказам

Пример формирования отчета по продажам за месяц:

$result = \Bitrix\Sale\Internals\OrderTable::getList([
    'select' => [
        'DATE_INSERT', 
        'SUM' => 'PRICE',
        'COUNT' => 'ID'
    ],
    
'filter' => [
        '>=DATE_INSERT' => new \Bitrix\Main\Type\DateTime('first day of this month'),
        '<DATE_INSERT' => new \Bitrix\Main\Type\DateTime('first day of next month')
    ],
    'group' => ['DATE_INSERT'],
    'order' => ['DATE_INSERT' => 'ASC']
]);
$report = [];
while ($row = $result->fetch()) {
    $report[] = [
        'date' => $row['DATE_INSERT']->format('d.m.Y'),
        'sum' => $row['SUM'],
        'count' => $row['COUNT']
    ];
}

Автоматизация работы с заказами

Пример автоматического изменения статуса заказа при полной оплате:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSalePaymentPaid',
    function(\Bitrix\Main\Event $event) {
        $payment = $event->getParameter("ENTITY");
        $order = $payment->getOrder();
        
        if ($order->isPaid()) {
            $order->setField('STATUS_ID', 'P'); // Меняем статус на "Оплачен"
            $order->save();
        }
    }
);

Сравнение методов D7 и старого API

Для наглядности приведем сравнительную таблицу некоторых часто используемых методов:

Операция Старый API D7 API
Получение заказа CSaleOrder::GetByID($orderId) Order::load($orderId)
Создание заказа CSaleOrder::Add($arFields) $order = Order::create($siteId, $userId)
Изменение поля заказа CSaleOrder::Update($orderId, $arFields) $order->setField('FIELD_NAME', $value)
Получение свойств заказа CSaleOrderProps::GetOrderProps($orderId) $order->getPropertyCollection()
Отмена заказа CSaleOrder::CancelOrder($orderId, 'Y') $order->setField('CANCELED', 'Y')

Как видите, D7 API предоставляет более интуитивно понятный и объектно-ориентированный подход к работе с заказами.

Часто задаваемые вопросы (FAQ)

Как получить список товаров в заказе?

Используйте метод getBasket() объекта Order:

$basket = $order->getBasket();
foreach ($basket as $basketItem) {
    echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity();
}

Как изменить статус заказа?

Используйте метод setField():

$order->setField('STATUS_ID', 'N');
$order->save();

Как добавить комментарий к заказу?

Также используйте метод setField():

$order->setField('COMMENTS', 'Новый комментарий');
$order->save();

Как получить список заказов пользователя?

Используйте метод getList():

$orders = Order::getList([
    'filter' => ['USER_ID' => $userId],
    'order' => ['DATE_INSERT' => 'DESC']
]);

Как отменить оплату заказа?

Используйте метод setPaid():

$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment) {
    $payment->setPaid('N');
}
$order->save();

Заключение

В этом руководстве мы подробно рассмотрели работу с заказами в Bitrix D7. Новый API предоставляет мощные инструменты для эффективной работы с заказами, улучшая производительность и упрощая разработку.

Как эксперты с многолетним опытом работы с Bitrix, мы в компании Soltyk.ru рекомендуем переходить на использование D7 API в ваших проектах. Это не только упростит разработку, но и обеспечит лучшую производительность и масштабируемость вашего интернет-магазина.

Если у вас возникли вопросы или вам нужна помощь в оптимизации работы с заказами на вашем сайте, не стесняйтесь обращаться к нам. Наша команда сертифицированных специалистов готова помочь вам в решении любых задач, связанных с разработкой и оптимизацией на платформе Bitrix.

Заказать консультацию

Связаться в Telegram

Рейтинг: 5/5
2 голосов

Следующие страницы вас также могут заинтересовать:

Обновлено: 23.08.2024 6041