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

Состав отгрузки

Внимание! Использовать метод \Bitrix\Sale\ShipmentItemCollection::save() для сохранения категорически запрещается. При изменении состава отгрузки может произойти изменение связанных сущностей, которые не будут сохранены. Необходимо выполнять сохранение через заказ: \Bitrix\Sale\Order::save(). Помимо всего этого в одной из ближайших версий вызов \Bitrix\Sale\ShipmentItemCollection::save() будет генерировать ошибку уровня E_WARNING.


Получение отгрузок

  • Работа с коллекцией
    $collection = $shipment->getShipmentItemCollection();
    foreach ($collection as $shipmentItem)
    {
    	// ...
    }

    Комплекты в коллекции хранятся в "развернутой" форме: там присутствует и сам комплект(родитель), и его состав. Это необходимо учитывать при работе с данной коллекцией. Для облегчения решения данной задачи есть специальные методы, которые позволяют не задумываться над этим:

    $collection = $shipment->getShipmentItemCollection();
    $collection->getShippableItems(); 
    
    /*
     * Возвращает коллекцию товаров для отгрузки. 
     * В этой коллекции присутствуют все элементы, кроме родителей комплекта, 
     * т.к. при отгрузке они не учитываются
     */
    
    $collection = $shipment->getShipmentItemCollection();
    $collection->getSellableItems(); 
    
    /*
     * Возвращает коллекцию товаров которая фактически продается. 
     * В этой коллекции присутствуют все элементы, кроме состава комплекта
     */

    Более подробную информацию по работе с комплектами вы найдете в разделе Корзина.


  • Работа с массивом

    Помимо объектов есть возможность напрямую обращаться к базе через метод \Bitrix\Sale\ShipmentItemCollection::getList($parameters), либо \Bitrix\Sale\ShipmentItem::getList($parameters). Оба этих метода работают аналогично.

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

    Параметр Описание С версии
    $parameters Массив, структура которого полностью соответствует структуре ORM'ного getList.
    // получение состава для отгрузки 123
    $dbRes = \Bitrix\Sale\ShipmentItemCollection::getList(
    	[
    		'select' => ['*'],
    		'filter' => [
    			'=ORDER_DELIVERY_ID' => 123, 
    		]
    	]
    );
    
    while ($item = $dbRes->fetch())
    {
    	var_dump($item);
    }

Получение конкретной отгрузки

$collection = $shipment->getShipmentItemCollection();
  • по ID
    $shipment = $collection->getItemById($id);
  • по внутреннему индексу
    $shipment = $collection->getItemByIndex($index);
  • по коду элемента корзины
    $shipment = $collection->getItemByBasketCode($basketCode);
  • по ID элемента корзины
    $shipment = $collection->getItemByBasketId($basketId);

Добавление товара

$collection = $shipment->getShipmentItemCollection();
$collection->createItem($basketItem);

или

$collection = $shipment->getShipmentItemCollection();
		
$item = \Bitrix\Sale\ShipmentItem::create($collection, $basketItem);
$collection->addItem($item);

Изменение товара

  • Изменение отдельного поля:
    $shipmentItem->setField('FIELD_NAME', $value);
  • Изменение группы полей:
    $shipmentItem->setFields(
    	[
    		'FIELD_NAME_1' => $value,
    		...
    		'FIELD_NAME_2' => $value,
    	]
    );
    
    "QUANTITY", // количество товара в отгрузке
    "RESERVED_QUANTITY", // количество зарезервированного товара в отгрузке
    "XML_ID" // XML_ID

Удаление товара

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

Получение стоимости товаров

$collection = $shipment->getShipmentItemCollection();
$price = $collection->getPrice();

Установка склада отгрузки

$order = \Bitrix\Sale\Order::load(123)
    
$shipmentCollection = $order->getShipmentCollection();    
$shipment = $shipmentCollection->getItemById(123);
    
$itemCollection = $shipment->getShipmentItemCollection();    
$shipmentItem = $itemCollection->getItemById(1);
    
$collection = $shipmentItem->getShipmentItemStoreCollection();    
/*
 * Считаем, что склад для отгрузки не указан. 
 * В противном случае нужно воспользоваться методом getItemById 
 */
$itemStore = $collection->createItem($shipmentItem->getBasketItem());
    
$itemStore->setFields(
	[
		'QUANTITY' => 1,
		'STORE_ID' => 1
	]
);

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


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