
Данная тема не описана в документации Битрикс и на форумах освещена никак. Но я думаю, что для многих актуальна. Допустим нам приходят коды маркировки честного знака с удалённого сервиса. Чтобы выполнить отгрузку и напечатать закрывающий чек, нам необходимо эти коды добавить к товарам в отгрузке.

Эти маркировочные коды хранятся в объекте ShipmentItemStore
Допустим товары пришли к нам в виде
1 2 3 4 5 6 7 8 9 10 |
$goods = [ 0 => [ 'guid' => '3b909855-d040-11eb-85e3-e4434b752200', 'mcode' => '(01)04620086330875(21)je:vF6bPkSIaK' ], 1 => [ 'guid' => '3b909855-d040-11eb-85e3-e4434b752200', 'mcode' => '(01)04620086330875(21)j2.TZYXGcKpFR' ] ]; |
Напишем функцию для добавления их в отгрузки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
public static function addMark($orderId, $goods) { $add_mark_result = []; //Получаем заказ $order = Order::load($orderId); //Получаем коллекцию отгрузок $shipmentCollection = $order->getShipmentCollection()->getNotSystemItems(); foreach ($shipmentCollection as $shipment) { $shipmentItemCollection = $shipment->getShipmentItemCollection(); $sellableItems = $shipmentItemCollection->getSellableItems(); foreach ($sellableItems as $shipmentItem) { $basketItem = $shipmentItem->getBasketItem(); $product_xml_id = $basketItem->getField('PRODUCT_XML_ID'); //Внешний код товара $is_support_marking_code = $basketItem->isSupportedMarkingCode(); //Проверяем что данный товар должен быть промаркирован $quantity = $shipmentItem->getQuantity(); //Количество экземпляров данного товара в отгрузке if ($is_support_marking_code) { $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); //Коллекция экземпляров товара в отгрузке $store_items_count = count($shipmentItemStoreCollection); $diff = $quantity - $store_items_count; if ($diff > 0) { for ($i = 0; $i < $diff; $i++) { //Если экземпляр товара не создан, создадим его $shipmentItemStoreCollection->createItem($basketItem); } } foreach ($shipmentItemStoreCollection as $shipmentItemStore) { foreach ($goods as $key => $good) { //Проверяем что это наш товар и он ещё не промаркирован if ( (strripos($product_xml_id, $good['guid']) !== false) && (!$shipmentItemStore->getMarkingCode() && $shipmentItemStore->getMarkingCode() != $good['mcode']) ) { $shipmentItemStore->setField('MARKING_CODE', $good['mcode']); //Если не указать количество - 1, выдаст ошибку $shipmentItemStore->setField('QUANTITY', 1); $shipmentItemStore->save(); unset($goods[$key]); array_push($add_mark_result, $shipmentItemStore->getMarkingCode()); break; } } } } } } $order->save(); return $add_mark_result; } |
Вы великолепны! Напишем ещё пару полезных функций. Получить коды маркировки в заказе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public static function getOrderMarkingCodes($orderId) { $result = []; $order = Order::load($orderId); $shipmentCollection = $order->getShipmentCollection()->getNotSystemItems(); foreach ($shipmentCollection as $shipment) { $shipmentItemCollection = $shipment->getShipmentItemCollection(); foreach ($shipmentItemCollection as $shipmentItem) { $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); foreach ($shipmentItemStoreCollection as $shipmentItemStore) { array_push($result, $shipmentItemStore->getMarkingCode()); } } } return $result; } |
Проверим что все товары, подлежащие маркировке в отгрузке, промаркированы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public static function checkProductsMarkedByShipment(Shipment $shipment) { $shipmentItemCollection = $shipment->getShipmentItemCollection(); foreach ($shipmentItemCollection as $shipmentItem) { $basketItem = $shipmentItem->getBasketItem(); $is_support_marking_code = $basketItem->isSupportedMarkingCode(); if ($is_support_marking_code) { $shipmentItemStoreCollection = $shipmentItem->getShipmentItemStoreCollection(); if (count($shipmentItemStoreCollection) != $shipmentItem->getQuantity()) { return false; } foreach ($shipmentItemStoreCollection as $shipmentItemStore) { if (!$shipmentItemStore->getMarkingCode()) { return false; } } } } return true; } |