• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/integration/report/handler/basehandler.php
  • Класс: BitrixCatalogIntegrationReportHandlerBaseHandler
  • Вызов: BaseHandler::getStoreProductData
private function getStoreProductData(): array
{
	$accessController = AccessController::getCurrent();
	if (!$accessController->check(ActionDictionary::ACTION_STORE_VIEW))
	{
		return [];
	}

	// adding a new runtime reference field with right join
	// in order to select all the stores and not just the
	// ones that have corresponding entries in b_catalog_store_product
	$queryParams = [
		'select' => [
			'TITLE' => 'STORE_TMP.TITLE',
			'TMP_STORE_ID' => 'STORE_TMP.ID',
			'SORT' => 'STORE_TMP.SORT',
			'AMOUNT_SUM',
			'QUANTITY_RESERVED_SUM',
			'MEASURE_ID' => 'PRODUCT.MEASURE',
		],
		'filter' => [
			'=STORE_TMP.ACTIVE' => 'Y',
		],
		'group' => ['TMP_STORE_ID', 'MEASURE_ID'],
		'order' => ['SORT'],
		'runtime' => [
			new ExpressionField('AMOUNT_SUM', 'SUM(AMOUNT)'),
			new ExpressionField('QUANTITY_RESERVED_SUM', 'SUM(%s)', ['QUANTITY_RESERVED']),
			(new Reference(
				'STORE_TMP',
				StoreTable::class,
				Join::on('this.STORE_ID', 'ref.ID')
			))->configureJoinType(Join::TYPE_RIGHT),
		],
	];

	$userFilterParameters = $this->getFilterParameters();

	if (isset($userFilterParameters['STORES']) && is_array($userFilterParameters['STORES']))
	{
		$storesList = $userFilterParameters['STORES'];
	}
	else
	{
		$storesList = null;
	}

	$filteredStoresList = self::getFilteredByRightsStoreList($storesList);

	if (is_array($filteredStoresList))
	{
		$queryParams['filter']['=TMP_STORE_ID'] = $filteredStoresList;
	}

	if (!empty($userFilterParameters['PRODUCTS']) && is_array($userFilterParameters['PRODUCTS']))
	{
		$queryParams['filter']['=PRODUCT_ID'] = StoreStockFilter::prepareProductFilter($userFilterParameters['PRODUCTS']);
		$queryParams['filter'][] = [
			'LOGIC' => 'OR',
			'!=AMOUNT' => 0,
			'!=QUANTITY_RESERVED' => 0,
		];
	}

	return StoreProductTable::getList($queryParams)->fetchAll();
}