Состав отгрузки
Внимание! Использовать метод \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());
}