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

Заказы

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

Создание

$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);


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

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

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

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

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Георгий Иванов
Сообщение не промодерировано, возможны ошибки и неточности.
Цитата
Код
$communication = $order->getContactCompanyCollection();
$contact = Contact::create($communication);
$contact->setField('ENTITY_ID', $contactId);
$contact->setField('IS_PRIMARY', 'Y'); // необязательно
$communication->addItem($contact);Я так понял надо через $communication->createContact() использовать. А не Contact::create($communication);
А для чего оно нужно не понятно. Понятно, что таблицу заполняет b_crm_order_contact_company,\Bitrix\Main\Loader::includeModule('sale');
Код
$order = \Bitrix\Sale\Order::load($orderId);
$communication = $order->getContactCompanyCollection();
$contact = $communication->createContact();
$contact->setField('ENTITY_ID', $contactId);
$contact->setField('IS_PRIMARY', 'Y'); // необязательно по умолчанию N
0
Алексей Сенин
Сообщение не промодерировано, возможны ошибки и неточности.
Дайте пример получение заказов по множественному свойству!
1
Михаил
Установить значение пользовательского поля заказа в CRM
Код
$userFields = array("UF_1223243434","1");
$GLOBALS['USER_FIELD_MANAGER']->Update(\Bitrix\Crm\Order\Manager::getUfId(), $order->getField('ACCOUNT_NUMBER'), $userFields);
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх