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

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
Наверх