• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/component/usestore.php
  • Класс: BitrixCatalogComponentUseStore
  • Вызов: UseStore::showEntityProductGridColumns
static function showEntityProductGridColumns(): void
{
	if (!Loader::includeModule('crm'))
	{
		return;
	}

	$headers = [
		'STORE_INFO',
		'STORE_AVAILABLE',
		'RESERVE_INFO',
		'ROW_RESERVED',
		'DEDUCTED_INFO',
	];

	$allHeaderMap = ProductList::getHeaderDefaultMap();
	$allHeaders = array_keys($allHeaderMap);

	$gridId = ProductList::DEFAULT_GRID_ID;
	$connection = Application::getConnection();
	$sqlHelper = $connection->getSqlHelper();
	$queryResult = $connection->query(/** @lang MySQL */
		"SELECT ID, VALUE FROM b_user_option WHERE CATEGORY = 'main.interface.grid' AND NAME = '{$sqlHelper->forSql($gridId)}'"
	);

	$resetCache = false;
	while ($gridSettings = $queryResult->fetch())
	{
		$optionID = (int)$gridSettings['ID'];
		$value = $gridSettings['VALUE'];
		if (!$value)
		{
			continue;
		}

		$options = unserialize($value, ['allowed_classes' => false]);
		if (
			!is_array($options)
			|| empty($options)
			|| !isset($options['views'])
			|| !is_array($options['views'])
		)
		{
			continue;
		}

		$changed = false;
		foreach ($options['views'] as &$view)
		{
			if (!isset($view['columns']) || $view['columns'] === '')
			{
				continue;
			}

			$allUsedColumns = explode(',', $view['columns']);
			$currentHeadersInDefaultPosition = array_values(
				array_intersect($allHeaders, array_merge($allUsedColumns, $headers))
			);
			$headers = array_values(array_intersect($allHeaders, $headers));

			foreach ($headers as $header)
			{
				if (in_array($header, $allUsedColumns, true))
				{
					continue;
				}

				$insertPosition = array_search($header, $currentHeadersInDefaultPosition, true);
				array_splice($allUsedColumns, $insertPosition, 0, $header);
				$changed = true;
			}

			if ($changed)
			{
				$view['columns'] = implode(',', $allUsedColumns);
			}
		}
		unset($view);

		if ($changed)
		{
			$sqlValue = $sqlHelper->forSql(serialize($options));
			$connection->queryExecute(/** @lang MySQL */
				"UPDATE b_user_option SET VALUE = '{$sqlValue}' WHERE ID ='{$optionID}'"
			);
			$resetCache = true;
		}
	}

	if ($resetCache)
	{
		Application::getInstance()->getManagedCache()->cleanDir('user_option');
	}

	if (Loader::includeModule('pull'))
	{
		CPullWatch::AddToStack(
			'CATALOG_INVENTORY_MANAGEMENT_CHANGED',
			[
				'module_id' => 'crm',
				'command' => 'onCatalogInventoryManagementEnabled',
			],
		);
	}
}