Добро пожаловать в исчерпывающее руководство по работе с заказами в Bitrix D7! Я, Алексей Солтык, SEO-специалист с 13-летним опытом, совместно с сертифицированным разработчиком Bitrix Василием Цветковым (12 лет опыта), подготовили для вас максимально полезный материал. Наша цель - помочь вам освоить все тонкости работы с заказами в современном API Bitrix.
Введение в работу с заказами в Bitrix D7
Ключевые отличия D7 API от старого API
D7 API представляет собой революционный подход к разработке на платформе Bitrix. Основные отличия от старого API включают:
- Объектно-ориентированный подход
- Строгая типизация
- Использование пространств имен
- Улучшенная производительность
- Более логичная и понятная структура кода
Преимущества использования D7 при работе с заказами
Переход на D7 при работе с заказами дает ряд существенных преимуществ:
- Ускорение разработки за счет более интуитивного API
- Повышение надежности кода благодаря строгой типизации
- Улучшение производительности, особенно при работе с большими объемами данных
- Упрощение поддержки и масштабирования проектов
Подключение модуля sale
Прежде чем начать работу с заказами, необходимо подключить модуль sale:
use Bitrix\Main\Loader;
if (!Loader::includeModule('sale')) {
throw new \Exception('Не удалось подключить модуль sale');
}
Создание заказа в Bitrix D7
Пошаговая инструкция по созданию заказа
- Создание объекта заказа
- Добавление товаров в корзину
- Установка свойств заказа
- Выбор способа оплаты
- Выбор способа доставки
- Сохранение заказа
Пример кода:
$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']
]);
Оптимизация запросов при работе с большим количеством заказов
При работе с большим количеством заказов важно оптимизировать запросы:
- Используйте постраничную навигацию
- Выбирайте только необходимые поля
- Применяйте индексы к часто используемым полям фильтрации
Пример с постраничной навигацией:
$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();
Обработка ошибок при работе с заказами
Типичные ошибки и их решения
- Некорректные данные заказа
- Ошибки при сохранении
- Проблемы с доступом к модулю 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.
Заказать консультацию
голосов
Следующие страницы вас также могут заинтересовать:
- Настройка Cloudflare для защиты и оптимизации сайта
- SEO умного фильтра Bitrix
- Калькулятор конверсии онлайн | Расчет конверсии сайта
- Робототехника
- Обзор книги «SEO-искусство раскрутки сайтов» Эрика Энжа
Обновлено: 23.08.2024 6041