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

Заказы

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

Создание

 
$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().

    Примеры:

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

    	 
    $parameters = [
    	'filter' => [
    		"USER_ID" => $USER->GetID(),
    		">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), mktime(0, 0, 0, date("n"), 1, date("Y")))
    	],
    	'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']
]); 


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Александр Ковалев
Сообщение непромодерировано, возможны ошибки и неточности.
Создание заказа

тут есть одни нюанс при добавление цены доставки.

В заказе цена будет общая с учетом доставки, но вот в оплату нужно указывать цену не полную

$paymentCollection = $order->getPaymentCollection();
$payment = $paymentCollection->createItem(
   Bitrix\Sale\PaySystem\Manager::getObjectById(1) // 1 - ID платежной системы
);
$remainingSum = $order->getPrice() - $paymentCollection->getSum();

$payment->setField("SUM", $remainingSum);
$payment->setField("CURRENCY", $order->getCurrency());

Иначе в платежную систему уйдет двойная цена доставки.  
© «Битрикс», 2001-2020, «1С-Битрикс», 2020
Наверх