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