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

Заказы

  • Создание заказа
  • Создание заказа без отгрузок и оплат
  • Получение заказа по его 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
    Наверх