Документация для разработчиков
Темная тема

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