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

Заказы

  • Создание заказа
  • Создание заказа без отгрузок и оплат
  • Получение заказа по его ID
  • Получение информации о заказах
  • Редактирование заказа
  • Оплата заказа
  • Разрешение доставки заказа
  • Добавление комментария к заказу
  • Смена статуса заказа
  • Отмена заказа
  • Удаление заказа
  • Получение публичной ссылки на заказ
  • Выборка заказов по значению свойства
  • Создание заказа

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


    © «Битрикс», 2001-2019, «1С-Битрикс», 2019
    Наверх