• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/component/reportproductlist.php
  • Класс: BitrixCatalogComponentReportProductList
  • Вызов: ReportProductList::buildDataQuery
protected function buildDataQuery($order = null, $limit = null, $offset = null): Query
{
	$storeId = $this->storeId;

	$baseFilter = $this->getListFilter();
	unset($baseFilter['=STORE_ID']);
	$reportInterval = $baseFilter['REPORT_INTERVAL'] ?? [];
	unset($baseFilter['REPORT_INTERVAL']);

	$storeDocsFilter = $baseFilter + [
			'=STORE_ID' => $storeId,
			[
				'LOGIC' => 'OR',
				'=DOCS_ELEMENT.STORE_FROM' => $storeId,
				'=DOCS_ELEMENT.STORE_TO' => $storeId,
			],
			'=DOCUMENT.STATUS' => 'Y',
		];

	if (!empty($reportInterval))
	{
		$storeDocsFilter += [
			'<=DOCUMENT.DATE_STATUS' => new DateTime($reportInterval['TO']),
		];
	}

	$storeDocsQuery = StoreProductTable::query();
	$storeDocsQuery->setSelect(['ID' ,'PRODUCT_ID', 'AMOUNT', 'QUANTITY_RESERVED', 'MEASURE_ID' => 'PRODUCT.MEASURE']);
	$storeDocsQuery->registerRuntimeField(
		new Reference(
			'DOCS_ELEMENT',
			StoreDocumentElementTable::class,
			Join::on('this.PRODUCT_ID', 'ref.ELEMENT_ID')
		)
	);
	$storeDocsQuery->registerRuntimeField(
		new Reference(
			'DOCUMENT',
			StoreDocumentTable::class,
			Join::on('this.DOCS_ELEMENT.DOC_ID', 'ref.ID')
		)
	);
	$storeDocsQuery->setFilter($storeDocsFilter);

	$shipmentsFilter = $baseFilter + [
			'=STORE_ID' => $storeId,
			'=STORE_BARCODE.STORE_ID' => $storeId,
			'=ORDER_DELIVERY.DEDUCTED' => 'Y',
		];

	if (!empty($reportInterval))
	{
		$shipmentsFilter += [
			'<=ORDER_DELIVERY.DATE_DEDUCTED' => new DateTime($reportInterval['TO']),
		];
	}

	$shipmentsQuery = StoreProductTable::query();
	$shipmentsQuery->setSelect(['ID' ,'PRODUCT_ID', 'AMOUNT', 'QUANTITY_RESERVED', 'MEASURE_ID' => 'PRODUCT.MEASURE']);
	$shipmentsQuery->registerRuntimeField(
		new Reference(
			'BASKET',
			BasketTable::class,
			Join::on('this.PRODUCT_ID', 'ref.PRODUCT_ID')
		)
	);
	$shipmentsQuery->registerRuntimeField(
		new Reference(
			'SHIPMENT_ITEM',
			ShipmentItemTable::class,
			Join::on('this.BASKET.ID', 'ref.BASKET_ID')
		)
	);
	$shipmentsQuery->registerRuntimeField(
		new Reference(
			'STORE_BARCODE',
			ShipmentItemStoreTable::class,
			Join::on('this.SHIPMENT_ITEM.ID', 'ref.ORDER_DELIVERY_BASKET_ID')
		)
	);
	$shipmentsQuery->registerRuntimeField(
		new Reference(
			'ORDER_DELIVERY',
			ShipmentTable::class,
			Join::on('this.SHIPMENT_ITEM.ORDER_DELIVERY_ID', 'ref.ID')
		)
	);
	$shipmentsQuery->setFilter($shipmentsFilter);

	$storeDocsQuery->union($shipmentsQuery);

	if (isset($order))
	{
		$storeDocsQuery->setUnionOrder($order);
	}
	if (isset($limit))
	{
		$storeDocsQuery->setUnionLimit($limit);
	}
	if (isset($offset))
	{
		$storeDocsQuery->setUnionOffset($offset);
	}

	$storeDocsQuery->countTotal(true);

	return $storeDocsQuery;
}