• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/InventoryManagement/Helpers/Doctor.php
  • Класс: BitrixCatalogInventoryManagementHelpersDoctor
  • Вызов: Doctor::fixReservesFromStores
public function fixReservesFromStores(int ...$productIds): void
{
	if (empty($productIds))
	{
		throw new ArgumentNullException('productIds');
	}

	$result = [];

	$productIdsSql = join(',', $productIds);
	$sql = "
		SELECT
			PRODUCT_ID,
			SUM(QUANTITY_RESERVED) as QUANTITY_RESERVED
		FROM
			b_catalog_store_product
			INNER JOIN b_catalog_store ON b_catalog_store.ID = b_catalog_store_product.STORE_ID AND b_catalog_store.ACTIVE = 'Y'
		WHERE
			PRODUCT_ID IN ({$productIdsSql})
		GROUP BY
			PRODUCT_ID
	";
	$rows = Application::getConnection()->query($sql);
	foreach ($rows as $row)
	{
		$productId = (int)$row['PRODUCT_ID'];

		$result[$productId] = [
			'PRODUCT_ID' => $productId,
			'NEW_QUANTITY_RESERVED' => (float)$row['QUANTITY_RESERVED'],
		];
	}

	// fill products without store quantities
	foreach ($productIds as $productId)
	{
		$result[$productId] ??= [
			'PRODUCT_ID' => $productId,
			'NEW_QUANTITY_RESERVED' => 0.0,
		];
	}

	// update products
	foreach ($result as $productId => &$item)
	{
		// or BitrixCatalogModelProduct::update ?
		$saveResult = ProductTable::update($productId, [
			'QUANTITY_RESERVED' => $item['NEW_QUANTITY_RESERVED'],
		]);
		$item['SAVE_RESULT'] =
			$saveResult->isSuccess()
				? 'ok'
				: join(', ', $saveResult->getErrorMessages())
		;
	}

	$this->printTable($result);
}