writeOffProductBatches
\Bitrix\Sale\Result public \Bitrix\Catalog\Product\CatalogProvider::writeOffProductBatches( array $products );
Метод списывает партии товаров по складским позициям элементов отгрузки. Метод работает только при включенном складском учете и выбранном партионном методе учета. Нестатический метод.
Параметры
| Параметр | Описание |
|---|---|
$products | Массив товаров с идентификаторами товаров в ключах. Ключ SHIPMENT_ITEM_LIST должен содержать объекты \Bitrix\Sale\ShipmentItem со складскими позициями |
Возвращаемое значение
Метод возвращает объект \Bitrix\Sale\Result. При ошибках списания метод добавляет их в результат. Если складской или партионный учет выключен, метод возвращает успешный результат без данных.
Особенности
Метод изменяет остатки партий. Количество для списания он получает из объектов \Bitrix\Sale\ShipmentItemStore и пропускает нулевые и отрицательные значения.
Пример
<?php
use Bitrix\Catalog\Config\State;
use Bitrix\Catalog\Product\CatalogProvider;
use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
if (!Loader::includeModule('catalog') || !Loader::includeModule('sale'))
{
throw new RuntimeException('Не удалось подключить модули catalog и sale');
}
if (!State::isUsedInventoryManagement() || !State::isProductBatchMethodSelected())
{
echo 'Для примера нужны складской и партионный учет';
return;
}
// Вызов спишет партии по складским позициям существующей отгрузки
$orderId = 100;
// Идентификатор конкретной несистемной отгрузки этого заказа
$shipmentId = 200;
$order = Order::load($orderId);
if ($order === null)
{
echo 'Заказ не найден';
return;
}
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->getItemById($shipmentId);
if ($shipment === null || $shipment->isSystem())
{
echo 'Отгрузка не найдена или является системной';
return;
}
$products = [];
$hasStoreItems = false;
foreach ($shipment->getShipmentItemCollection() as $shipmentItem)
{
$storeCollection = $shipmentItem->getShipmentItemStoreCollection();
if ($storeCollection !== null && $storeCollection->count() > 0)
{
$hasStoreItems = true;
}
$productId = $shipmentItem->getProductId();
$products[$productId]['SHIPMENT_ITEM_LIST'][] = $shipmentItem;
}
if (!$hasStoreItems)
{
echo 'У отгрузки нет складских позиций';
return;
}
$provider = new CatalogProvider();
$result = $provider->writeOffProductBatches($products);
echo $result->isSuccess()
? 'Обработка складских позиций завершена без ошибок'
: implode(PHP_EOL, $result->getErrorMessages());
© «Битрикс», 2001-2026, «1С-Битрикс», 2026