• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/product/catalogprovider.php
  • Класс: BitrixCatalogProductCatalogProvider
  • Вызов: CatalogProvider::fillOfferXmlId
static function fillOfferXmlId(array $products, array $catalogProductDataList): array
	{
		$offerList = [];
		foreach ($catalogProductDataList as $entityData)
		{
			if ($entityData['TYPE'] != CatalogProductTable::TYPE_OFFER)
			{
				continue;
			}
			if (strpos($products[$entityData['ID']]['PRODUCT_DATA']['~XML_ID'], '#') !== false)
			{
				continue;
			}
			$offerList[] = $entityData['ID'];
		}
		unset($entityData);
		if (!empty($offerList))
		{
			$parentMap = [];
			$parentIdList = [];
			$parentList = CCatalogSku::getProductList($offerList, 0);
			foreach ($parentList as $offerId => $offerData)
			{
				$parentId = (int)$offerData['ID'];
				if (!isset($parentMap[$parentId]))
				{
					$parentMap[$parentId] = [];
				}
				$parentMap[$parentId][] = $offerId;
				$parentIdList[$parentId] = $parentId;
			}
			unset($offerId, $offerData, $parentList);
			if (!empty($parentMap))
			{
				sort($parentIdList);
				foreach (array_chunk($parentIdList, 500) as $pageIds)
				{
					$iterator = IblockElementTable::getList([
						'select' => [
							'ID',
							'XML_ID',
						],
						'filter' => ['@ID' => $pageIds],
					]);
					while ($row = $iterator->fetch())
					{
						$parentId = (int)$row['ID'];
						if (empty($parentMap[$parentId]))
						{
							continue;
						}
						foreach ($parentMap[$parentId] as $index)
						{
							$products[$index]['PRODUCT_DATA']['~XML_ID'] = $row['XML_ID'] . '#'
								. $products[$index]['PRODUCT_DATA']['~XML_ID']
							;
						}
					}
					unset($parentId, $index);
					unset($row, $iterator);
				}
				unset($pageIds);
			}
			unset($parentIdList, $parentMap);
		}
		unset($offerList);

		return $products;
	}