Для реализации возможностей интернет-магазина в системе битрикс используется модуль sale. С помощью данного модуля становятся доступными возможности работы с корзиной, оформления заказов, работа с покупателями, а также другой необходимый функционал. Для бизнеса, в большинстве случаев, стандартных компонентов оформления заказов иногда бывает достаточно. Однако это не исключает возможность реализации своего функционала для работы с заказами на уровне API. В данном посту мы рассмотрим простые примеры использования API битрикса ядра D7.
Перед использованием API для работы с заказами следует подключить модуль «sale»:
\Bitrix\Main\Loader::includeModule('sale');
use Bitrix\Sale\Order,
    Bitrix\Sale\Basket,
    Bitrix\Sale\Delivery,
    Bitrix\Sale\PaySystem;
Зная ID заказа, мы можем получить поля заказа, а также внести какие-либо изменения в них.
$order = \Bitrix\Sale\Order::load($orderId); // объект заказа
$order->getFields(); // получение полей заказа
$order->getField("DELIVERY_ID"); // ID службы доставки
$order->setField('PAYED', 'N'); // изменить любой параметр
$order->save(); // и сохраняем
Используя ID заказа мы инициализировали объект заказа, посредством метода load(), и присвоили переменной $order. Для получения полей заказа, мы выполнили метод getFields(). После этого нам становятся доступны поля для работы с ними. Так в примере через метод getField() мы получили значение DELIVERY_ID. Передавая таким образом символьный код этому методу мы можем получать значение этих полей в заказе. Далее используя метод setField() мы присвоили полю PAYED значение «N». Чтобы изменения записались в системе, следует так же выполнить метод save(). Использовать этот метод нужно лишь в том случае, когда мы вносим изменения в текущий заказ, и вызывается он в последнюю очередь. Таблица с описанием полей заказа опубликована в конце статьи.
Получать значение некоторых полей можно посредством специальных методов, которые так же удобно использовать в коде:
$order->getId(); // ID заказа $order->getSiteId(); // ID сайта $order->getDateInsert(); // объект Bitrix\Main\Type\DateTime $order->getPersonTypeId(); // ID типа покупателя $order->getUserId(); // ID пользователя $order->getPrice(); // Сумма заказа $order->getDiscountPrice(); // Размер скидки $order->getDeliveryPrice(); // Стоимость доставки $order->getSumPaid(); // Оплаченная сумма $order->getCurrency(); // Валюта заказа $order->isPaid(); // true, если оплачен $order->isAllowDelivery(); // true, если разрешена доставка $order->isShipped(); // true, если отправлен $order->isCanceled(); // true, если отменен
Для создания заказа нам следует выполнить цепочку последовательных действий: создать корзину, создать заказ и связать корзину с заказом, создать запись отгрузки, создать оплату.
 
// товары для добавления в корзину
$arItems = array(
	array(
		'PRODUCT_ID' => 150,
		'NAME' => 'Наименование товара', 
		'PRICE' => 25000,
		'CURRENCY' => 'KZT',
		'QUANTITY' => 1
	)
);
// создаём корзину, и добавляем в неё товары
$basket = \Bitrix\Sale\Basket::create(SITE_ID);
foreach ($arItems as $i => $arItem) {
	$basketItem = $basket->createItem("catalog", $arItem['PRODUCT_ID']);
	$basketItem->setFields($arItem);
}
// создаем заказ, связываем корзину с заказом (перерасчет происходит автоматически)
$order = \Bitrix\Sale\Order::create(SITE_ID, $userId);
$order->setPersonTypeId($personTypeId);
$order->setBasket($basket);
// создаём отгрузку заказа
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem(
	\Bitrix\Sale\Delivery\Services\Manager::getObjectById(1)
);
$shipmentItemCollection = $shipment->getShipmentItemCollection();
foreach ($basket as $basketItem) {
	$item = $shipmentItemCollection->createItem($basketItem);
	$item->setQuantity($basketItem->getQuantity());
}
// создаём оплату заказа
$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem(
	\Bitrix\Sale\PaySystem\Manager::getObjectById(1)
);
$payment->setField("SUM", $order->getPrice());
$payment->setField("CURRENCY", $order->getCurrency());
// сохраняем все параметры заказа
$result = $order->save();
if ($result->isSuccess()) {
	echo 'Заказ успешно создан!';
} else {
	echo $result->getError();
}
Аналогично как и в предыдущем примере все изменения заказа сохраняются посредством метода save(). В примере выше добавляется только один товар, однако на практике можно добавлять их целое множество, посредством массива $arItems.
В самом первом примере мы уже рассматривали возможность обновления полей заказа. Там, посредством использования метода setField() мы задавали значения поля заказа. При работе с заказом так же бывает требуется обновить другие данные заказа, которые обновляются немного иначе. Допустим нам требуется разрешить отгрузку заказа, для этого мы может выполнить такую операцию:
// получаем объект заказа
$order = \Bitrix\Sale\Order::load($orderId);
// добавляем комментарий от покупателя
$order->setField('USER_DESCRIPTION', 'Доставить до дому');
// получаем объекты отгрузки
$shipmentCollection = $order->getShipmentCollection();
foreach ($shipmentCollection as $shipment) {
	if (!$shipment->isSystem()) {
		$shipment->allowDelivery(); // разрешаем отгрузку
	}
}
// сoхраняем изменения заказа
$result = $order->save();
if ($result->isSuccess()) {
	echo 'Изменения сохранены успешно!';
} else {
	echo $result->getError();
}
В данном примере мы добавили к заказу комментарий от покупателя — поле USER_DESCRIPTION, а также разрешили отгрузку товаров. По умолчанию для каждого заказа существует системная отгрузка, она создаётся при создании заказа. В цикле так прописано условие, которое исключает системную отгрузку, которую затрагивать нет необходимости.
*Стоит обратить внимание на то, что поля актуальны на момент написания данной статьи.
| ID | Номер заказа. | 
| LID | Код сайта. | 
| ACCOUNT_NUMBER | Код заказа. | 
| TRACKING_NUMBER | Трек-номер заказа. | 
| PAY_SYSTEM_ID | Идентификатор платежной системы. | 
| DELIVERY_ID | Идентификатор службы доставки. | 
| DATE_INSERT | Дата добавления заказа в формате текущего сайта. | 
| DATE_UPDATE | Дата последнего изменения заказа в формате текущего сайта. | 
| PERSON_TYPE_ID | Идентификатор плательщика. | 
| USER_ID | Идентификатор пользователя, за кем закреплен заказ. | 
| PAYED | Фраг оплаченности заказа (Y/N). | 
| DATE_PAYED | Дата оплаты заказа. | 
| DATE_INSERT | Дата добавления заказа в формате текущего сайта. | 
| DATE_UPDATE | Дата последнего изменения заказа в формате текущего сайта. | 
| EMP_PAYED_ID | Идентификатор пользователя оплатившего заказ. | 
| DEDUCTED | Флаг отгруженности заказа (Y/N). | 
| DATE_DEDUCTED | Дата отгрузки заказа. | 
| EMP_DEDUCTED_ID | Идентификатор пользователя, отгрузившего заказ. | 
| REASON_UNDO_DEDUCTED | Комментарий причины отмены отгрузки заказа. | 
| STATUS_ID | Код статуса заказа. | 
| DATE_STATUS | Дата изменения статуса заказа. | 
| EMP_STATUS_ID | ID пользователя, изменивший статус заказа. | 
| MARKED | Флаг проблемности заказа (Y/N). | 
| DATE_MARKED | Дата выставления флага проблемности заказа. | 
| EMP_MARKED_ID | Идентификатор пользователя, установивший флаг проблемности заказа. | 
| REASON_MARKED | Комментарий причины проблемности заказа. | 
| PRICE_DELIVERY | Стоимость доставки. | 
| ALLOW_DELIVERY | Флаг разрешена ли отгрузка заказа (Y/N). | 
| DATE_ALLOW_DELIVERY | Дата выставления флага разрешения отгрузки заказа. | 
| EMP_ALLOW_DELIVERY_ID | Идентификатор пользователя, установивший флаг разрешение отгрузки заказа. | 
| RESERVED | Флаг зарезервированно ли всё кол-во товара в заказе (Y/N). | 
| PRICE | Стоимость заказа. | 
| CURRENCY | Валюта заказа. | 
| DISCOUNT_VALUE | Значение скидки заказа. | 
| TAX_VALUE | Размер налога на заказ. | 
| SUM_PAID | Сумма оплаченного заказа. | 
| USER_DESCRIPTION | Комментарий пользователя оформившего заказ. | 
| PAY_VOUCHER_NUM | Номер документа оплаты. | 
| PAY_VOUCHER_DATE | Дата оплаты документа. | 
| ADDITIONAL_INFO | Дополнительная информация заказа. | 
| COMMENTS | Комментарии к заказу. | 
| COMPANY_ID | Идентификатор компании, к которой привязан заказ. | 
| CREATED_BY | Идентификатор пользователя, кто создал заказ. | 
| RESPONSIBLE_ID | Идентификатор ответственного пользователя. | 
| STAT_GID | Код статистики. | 
| DATE_PAY_BEFORE | Дата предоплаты. | 
| DATE_BILL | Дата выставления счета. | 
| LOCKED_BY | Флаг, кто заблокировал заказ. | 
| DATE_LOCK | Дата, когда был заблокирован заказ. | 
| AFFILIATE_ID | Идентификатор аффилиата. | 
| DELIVERY_DOC_NUM | Номер документа отгрузки. | 
| DELIVERY_DOC_DATE | Дата документа отгрузки. | 
| UPDATED_1C | Флаг обновления данных в 1C. | 
| ORDER_TOPIC | Идентификатор темы на форуме, к которому привязан заказ. | 
| XML_ID | Внешний код заказа. | 
| ID_1C | Код в 1С. | 
| VERSION_1C | Версия обмена. | 
| EXTERNAL_ORDER | Флаг, определяющий является ли заказ внешним. | 
| STORE_ID | Код склада. | 
| CANCELED | Флаг отмены заказа. | 
| EMP_CANCELED_ID | Идентификатор пользователя, кто отменил заказ. | 
| DATE_CANCELED | Дата отмены заказа. | 
| REASON_CANCELED | Причина отмены заказа. | 
| DATE_INSERT_FORMAT | Дата добавления заказа в формате региональных настроек. | 
| DATE_UPDATE_SHORT | Дата обновления заказа в формате региональных настроек. | 
| DATE_STATUS_SHORT | Дата смены статуса заказа в формате региональных настроек. | 
| DATE_CANCELED_SHORT | Дата отмены заказа в формате региональных настроек. | 
| BY_RECOMMENDATION | Флаг оформлен ли заказ по рекомендации. | 
| LOCK_STATUS | Код блокировка(green/yelow/green). | 
| LOCK_USER_NAME | Имя пользователя, блокирующего заказ. | 
| RESPONSIBLE_LOGIN | Логин ответственного за заказ пользователя. | 
| RESPONSIBLE_NAME | Имя ответственного за заказ пользователя. | 
| RESPONSIBLE_LAST_NAME | Фамилия ответственного за заказ пользователя. | 
| RESPONSIBLE_SECOND_NAME | Отчество ответственного за заказ пользователя. | 
| RESPONSIBLE_EMAIL | Email ответственного за заказ пользователя. | 
| RESPONSIBLE_WORK_POSITION | Должность ответственного за заказ пользователя. | 
| RESPONSIBLE_PERSONAL_PHOTO | Фото ответственного за заказ пользователя. | 
| USER_LOGIN | Логин пользователя, за кем закреплен заказ. | 
| USER_NAME | Имя пользователя, за кем закреплен заказ. | 
| USER_LAST_NAME | Фамилия пользователя, за кем закреплен заказ. | 
| USER_EMAIL | Email пользователя, за кем закреплен заказ. |