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