• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/entity/entitybase.php
  • Класс: Bitrix\Crm\Entity\EntityBase
  • Вызов: EntityBase::getTopIDs
public function getTopIDs(array $params)
{
	$order = isset($params['order']) && is_array($params['order']) ? $params['order'] : ['ID' => 'ASC'];
	$filter = isset($params['filter']) && is_array($params['filter']) ? $params['filter'] : [];
	$limit = isset($params['limit']) ? (int)$params['limit'] : 0;
	$enablePermissionCheck = isset($params['enablePermissionCheck']) ? (bool)$params['enablePermissionCheck'] : true;

	if (
		!$this->areFieldsCompatibleWithOrm(array_keys($order))
		|| !$this->areFieldsCompatibleWithOrm(array_keys($filter))
	)
	{
		if (!$enablePermissionCheck)
		{
			$filter['CHECK_PERMISSIONS'] = 'N';
		}

		return $this->getTopIdsInCompatibilityMode($limit, $order, $filter);
	}

	static $cache;
	$cacheKey = md5(serialize($params) . $this->getEntityTypeID());
	if (isset($cache[$cacheKey]))
	{
		return $cache[$cacheKey];
	}
	$cache[$cacheKey] = [];

	$categories = $filter['=CATEGORY_ID'] ?? $filter['@CATEGORY_ID'] ?? $filter['CATEGORY_ID'] ?? null;
	if (!is_null($categories))
	{
		$categories = array_unique(array_map('intval',  (array)$categories));
		if (empty($categories))
		{
			$categories = null;
		}
	}

	if ($enablePermissionCheck)
	{
		$userPermissions = $params['userPermissions'] ?? \CCrmPerms::GetCurrentUserPermissions();
		$builderOptions = (new Options())
			->setNeedReturnRawQuery(true)
		;
		if ($categories)
		{
			$builderOptions->setSkipCheckOtherEntityTypes(true);
		}
		$builderResult = $this->buildPermissionSqlForCategories(
			$userPermissions->GetUserID(),
			$builderOptions,
			$categories ?? [0]
		);
	}

	$isOnlyCategoryFilter = (count($filter) === 1) && is_array($categories);

	if ($enablePermissionCheck && !$builderResult->hasAccess()) // Access denied
	{
		return $cache[$cacheKey];
	}
	elseif (
		$enablePermissionCheck
		&& $builderResult->hasRestrictions() // need to check permissions
		&& (empty($filter) || $isOnlyCategoryFilter)  // filter is suitable
		&& count($order) === 1 // and ordered only by ID
		&& isset($order['ID'])
	)
	{
		$cache[$cacheKey] = $this->getTopIdsFromPermissions(
			$userPermissions,
			$limit,
			$order['ID'],
			$categories ?? [0]  // for backward compatibility, use categoryId = 0 if not defined
		);

		return $cache[$cacheKey];
	}

	$query = new \Bitrix\Main\Entity\Query($this->getDbEntity());
	$query->addSelect('ID');
	$query->setOrder($order);
	$query->setFilter($filter);
	$query->setLimit($limit);

	if ($enablePermissionCheck && $builderResult->hasRestrictions())
	{
		$query->addFilter('@ID', $builderResult->getSqlExpression());
	}

	$dbResult = $query->exec();
	while ($fields = $dbResult->fetch())
	{
		$cache[$cacheKey][] = (int)$fields['ID'];
	}
	return $cache[$cacheKey];
}