Документация для разработчиков
Темная тема

Заказы

Операции с заказами

Создание

$products = [
	[
		'PRODUCT_ID' => 135, 
		'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider',
		'NAME' => 'Товар 1', 
		'PRICE' => 500, 
		'CURRENCY' => 'RUB', 
		'QUANTITY' => 5, 
	]
];
$basket = Bitrix\Sale\Basket::create('s1');
foreach ($products as $product)
{
	$item = $basket->createItem("catalog", $product["PRODUCT_ID"]);
	unset($product["PRODUCT_ID"]); 
	$item->setFields($product);
}
$siteId = 's1'; // код сайта
$userId = 1; // ID пользователя
$order = \Bitrix\Sale\Order::create($siteId, $userId);
$order->setPersonTypeId(1); // 1 – ID типа плательщика
$order->setBasket($basket);
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem(
	Bitrix\Sale\Delivery\Services\Manager::getObjectById(1) // 1 – ID службы доставки
);
$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) // 1 – ID платежной системы
);
$payment->setField("SUM", $order->getPrice());
$payment->setField("CURRENCY", $order->getCurrency());
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Создание без отгрузок и оплат

$basket = \Bitrix\Sale\Basket::create('s1');
$item = $basket->createItem('catalog', 123);
$item->setField('QUANTITY', 1);
$item->setField('CURRENCY', 'RUB');
$item->setField('PRODUCT_PROVIDER_CLASS', '\Bitrix\Catalog\Product\CatalogProvider');
$item = $basket->createItem('catalog', 125);
$item->setField('QUANTITY', 1);
$item->setField('CURRENCY', 'RUB');
$item->setField('PRODUCT_PROVIDER_CLASS', '\Bitrix\Catalog\Product\CatalogProvider');
$basket->refresh();
$order = \Bitrix\Sale\Order::create('s1', 1, 'RUB');
$order->setPersonTypeId(1);
$order->setBasket($basket);
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Получение по ID

Заказ представляет собой объект, который можно получить несколькими способами:

  • по ID:
    $order = \Bitrix\Sale\Order::load($id);
  • по номеру заказа (ACCOUNT_NUMBER):
    $order = \Bitrix\Sale\Order::loadByAccountNumber($accountNumber);

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

Для получения информации используйте один из двух методов.

  • \Bitrix\Sale\Order::loadByFilter($parameters);

    Метод всегда возвращает либо массив объектов, либо null.

    Параметр Описание С версии
    $parameters Массив, структура:
    • filter – описание фильтра для WHERE и HAVING
    • order – параметры сортировки
    • limit – количество записей
    • offset – смещение для limit
    • runtime – динамически определенные поля

  • \Bitrix\Sale\Order::getList($parameters);

    Метод всегда возвращает объект DB\Result, из которого можно получить данные с помощью метода fetch();

    Параметр Описание С версии
    $parameters Массив, структура которого полностью соответствует структуре ORM'ного getList.
    Метод всегда возвращает объект DB\Result, из которого можно получить данные с помощью метода fetch().

    Примеры:

    Выведем даты всех заказов текущего пользователя за текущий месяц, отсортированные по дате заказа

    $myDate = new \Bitrix\Main\Type\Date();
    $myDate->add('-1M');
    $parameters = [
    	'filter' => [
    		"USER_ID" => $USER->GetID(),
    		"DATE_INSERT" => $myDate
    	],
    	'order' => ["DATE_INSERT" => "ASC"]
    ];
    $dbRes = \Bitrix\Sale\Order::getList($parameters);
    while ($order = $dbRes->fetch())
    {
    	var_dump($order);
    }

    Получить заказы с определенным товаром

    $dbRes = \Bitrix\Sale\Order::getList([
    	'filter' => [
    		'BASKET.PRODUCT_ID' => 174474
    	],
    	'order' => ['ID' => 'DESC']
    ]);
    	 
    while ($order = $dbRes->fetch())
    {
    	var_dump($order);
    }

    Фильтрация по нескольким вариантам статуса

    $dbRes = \Bitrix\Sale\Order::getList([
    	'filter' => [
    		"USER_ID" => $USER->GetID(), 
    		"@STATUS_ID" => ["N", "P"]
    	],
    	'order' => ['ID' => 'DESC']
    ]);
    	 
    while ($order = $dbRes->fetch())
    {
    	var_dump($order);
    }

    Получение списка заказов, у которых отсутствует какое-либо свойство

    $dbRes = \Bitrix\Sale\Order::getList([
    	'select' => ['ID'], 
    	'filter' => [
    		'PROPERTY_VAL.ID' => null
    	],
    	'runtime' => [
    		new \Bitrix\Main\Entity\ReferenceField(
    			'PROPERTY',
    			'\Bitrix\sale\Internals\OrderPropsTable',
    			array("=ref.PERSON_TYPE_ID" => "this.PERSON_TYPE_ID",),
    			array("join_type"=>"inner")
    		),
    		new \Bitrix\Main\Entity\ReferenceField(
    			'PROPERTY_VAL',
    			'\Bitrix\sale\Internals\OrderPropsValueTable',
    			array("=this.PROPERTY.ID" => "ref.ORDER_PROPS_ID", "=this.ID" => "ref.ORDER_ID",),
    			array("join_type"=>"left")
    		),
    	],
    	'group' => ['ID'],
    	'order' => ['ID' => 'DESC']
    ]);
    	
    while ($order = $dbRes->fetch())
    {
    	var_dump($order);
    }

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

    CModule::IncludeModule('sale'); 
    
    $dbRes = \Bitrix\Sale\Order::getList([
    	'select' => [
    		"ID", 
    		"PROPERTY_VAL.VALUE",
    		"PROPERTY_VAL_2.VALUE"
    	],
    	'filter' => [
    		'=PROPERTY_VAL.CODE' => 'EMAIL',
    		'=PROPERTY_VAL.VALUE' => 'example@example.com',
    		'=PROPERTY_VAL_2.CODE' => 'ZIP',
    		'=PROPERTY_VAL_2.VALUE' => 101000
    	],
    	'runtime' => [
    		new \Bitrix\Main\Entity\ReferenceField(
    			'PROPERTY_VAL',
    			'\Bitrix\sale\Internals\OrderPropsValueTable',
    			["=this.ID" => "ref.ORDER_ID"],
    			["join_type"=>"left"]
    		),
    		new \Bitrix\Main\Entity\ReferenceField(
    			'PROPERTY_VAL_2',
    			'\Bitrix\sale\Internals\OrderPropsValueTable',
    			["=this.ID" => "ref.ORDER_ID"],
    			["join_type"=>"left"]
    		),
    	]
    ]);
    
    while ($order = $dbRes->fetch())
    {
    	var_dump($order);
    }

Редактирование

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа
 
$order->setField('USER_DESCRIPTION', 'Мой первый заказ');
 
$r = $order->save();
if (!$r->isSuccess())
{ 
    var_dump($r->getErrorMessages());
}
 

Оплата

Оплата заказа подразумевает оплату всех частичных оплат, которые в него входят. Только в этом случае заказ считается полностью оплаченным.

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа
$paymentCollection = $order->getPaymentCollection();
foreach ($paymentCollection as $payment)
{
	$r = $payment->setPaid('Y');
	if (!$r->isSuccess())
	{
		var_dump($r->getErrorMessages());
	}
}
 

if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

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

Разрешение доставки подразумевает разрешение всех частичных отгрузок, которые в него входят. Только в этом случае заказ считается полностью оплаченным.

 
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа
$shipmentmentCollection = $order->getShipmentCollection();
foreach ($shipmentmentCollection as $shipment)
{
	$r = $shipment->allowDelivery();
	if (!$r->isSuccess())
	{
		var_dump($r->getErrorMessages());
	}
}

$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Если необходимо отменить разрешение отгрузки, тогда достаточно вместо $shipment->allowDelivery() вызвать $shipment->disallowDelivery():

 

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа
$shipmentCollection = $order->getShipmentCollection();
foreach ($shipmentCollection as $shipment)
{
	$r = $shipment->disallowDelivery();
	if (!$r->isSuccess())
	{
		var_dump($r->getErrorMessages());
	}
}
 
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Добавление комментария

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа
$r = $order->setField('COMMENTS', 'Комментарий');
if (!$r->isSuccess())
{
	var_dump($r->getErrorMessages());
}
 
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

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

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа

$r = $order->setField('STATUS_ID', 'P');
if (!$r->isSuccess())
{
	var_dump($r->getErrorMessages());
}
 
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Отмена и удаление

Отмена

Для отмены заказа необходимо, чтобы все оплаты были не оплачены, отгрузки не отгружены. В противном случае возникнет ошибка, которая будет возвращена. Поэтому, если это необходимо, перед отменой выполнить отмену отгрузки и отмену оплаты заказа.

$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа

$r = $order->setField('CANCELED', 'Y');
if (!$r->isSuccess())
{
	var_dump($r->getErrorMessages());
}
 
$r = $order->save();
if (!$r->isSuccess())
{ 
	var_dump($r->getErrorMessages());
}

Удаление

Есть 2 подхода к удалению заказа: "умное" и "в лоб".

  • При "умном" удалении заказ сначала отменяется, а затем удаляется. Это значит, что у удаляемого заказа не должно быть оплаченный оплат и отгруженных отгрузок.
    $r = \Bitrix\Sale\Order::delete(123); // 123 – ID заказа
    if (!$r->isSuccess())
    {
    	var_dump($r->getErrorMessages());
    }
  • При удалении "в лоб" не происходит отмены заказа. Идет прямое удаление информации о заказе из базы.
    $r = \Bitrix\Sale\OrderBase::deleteNoDemand(123); // 123 – ID заказа
    if (!$r->isSuccess())
    {
    	var_dump($r->getErrorMessages());
    }

Получение публичной ссылки

Необходимо, чтобы в настройках модуля Интернет-магазин (Настройки > Настройки продукта > Настройки модулей > Интернет-магазин) была отмечена опция "Разрешить просмотр заказа по ключу без авторизации".

if (\Bitrix\Sale\Helpers\Order::isAllowGuestView($order))
{
	$publicLink = \Bitrix\Sale\Helpers\Order::getPublicLink($order);
}

Выборка заказов по значению свойства

$dbRes = \Bitrix\Sale\Order::getList([
	'select' => ['ID'],
	'filter' => [
		'PROPERTY.ORDER_PROPS_ID' => 15,// 15 – ID свойства
		'PROPERTY.VALUE' => 'значение',
	],
	'order' => ['ID' => 'DESC']
]);

Добавление привязки

Пример добавления привязки существующего Контакта или Компании к Заказу:

$communication = $order->getContactCompanyCollection();
$contact = Contact::create($communication);
$contact->setField('ENTITY_ID', $contactId);
$contact->setField('IS_PRIMARY', 'Y'); // необязательно
$communication->addItem($contact);


© «Битрикс», 2001-2024, «1С-Битрикс», 2024