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

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

Внимание! Использовать метод \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
Наверх