PHPackages                             maximaster/tools.finder - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. maximaster/tools.finder

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

maximaster/tools.finder
=======================

Библиотека, облегчающая поиск идентификаторов разных сущностей для 1С-Битрикс

v2.1.1(2mo ago)108.4k↓37.1%11PHPPHP ^5.6 || ^7.0 || ^8.0

Since Jul 15Pushed 2mo ago3 watchersCompare

[ Source](https://github.com/maximaster/tools.finder)[ Packagist](https://packagist.org/packages/maximaster/tools.finder)[ RSS](/packages/maximaster-toolsfinder/feed)WikiDiscussions master Synced yesterday

READMEChangelog (3)DependenciesVersions (11)Used By (0)

maximaster/tools.finder
=======================

[](#maximastertoolsfinder)

Библиотека предоставляет функционал для выборки из БД идентификаторов различных сущностей Битрикс. Это необходимо, чтобы отвязать свой код от хардкода идентификаторов.

Библиотека состоит глобально из 3х частей:

- Абстрактный класс для всех Finder'ов
- Реализация Finder'ов для следующих сущностей:
    - Инфоблок
    - Свойство инфоблока
    - Значение свойства типа "Список" инфоблока
    - Раздел инфоблока
    - Highload-блок
    - Группа пользователей
    - Тип цены
    - Свойство заказа
    - Смарт-процесс CRM
- Обработчики событий на CRUD-операции с сущностями для инвалидации кеша

Пример использования
--------------------

[](#пример-использования)

Основными входными точками являются методы `get()` и `getId()`. У каждой реализации Finder'а они имеют разный набор параметров (см. phpDoc).

Например, для инфоблока нужно передать тип и символьный код:

```
\Maximaster\Tools\Finder\Iblock::get('catalog', 'products');
```

Для раздела инфоблока — идентификатор инфоблока и символьный код раздела:

```
\Maximaster\Tools\Finder\IblockSection::get(
    \Maximaster\Tools\Finder\Iblock::getId('catalog', 'products'),
    'section_code'
);
```

`get()` возвращает массив с данными сущности, `getId()` — только числовой идентификатор.

### Все доступные Finder'ы

[](#все-доступные-finderы)

КлассСущностьПараметры `get()``Iblock`Инфоблок`(string $type, string $code)``IblockProperty`Свойство инфоблока`(int $iblockId, string $code)``IblockPropertyEnum`Значение свойства типа "Список"`(int $propertyId, string $enumCode)``IblockSection`Раздел инфоблока`(int $iblockId, string $sectionCode)``HlBlock`Highload-блок`(string $name)``UserGroup`Группа пользователей`(string $stringId)``PriceType`Тип цены`(string $name)``OrderProperty`Свойство заказа`(int $personTypeId, string $propertyCode)``SmartProcess`Смарт-процесс CRM`(string $name)`Для `SmartProcess` дополнительно доступен метод `getEntityId(string $name): int`, возвращающий `ENTITY_TYPE_ID`.

### Шорткаты

[](#шорткаты)

Для удобства имеет смысл создать собственные шорткаты, унаследовавшись от реализаций Finder'ов:

```
namespace Vendor\Finder;

class Iblock extends \Maximaster\Tools\Finder\Iblock
{
    public static function catalog(): array
    {
        return static::get('catalog', 'products');
    }
}
```

Кеширование
-----------

[](#кеширование)

Библиотека использует двухуровневый кеш:

1. **In-memory кеш** — хранит данные в статическом массиве в рамках текущего запроса (предотвращает повторное чтение диска)
2. **Файловый кеш** — стандартный кеш Битрикс, TTL 24 часа

Кеш инвалидируется автоматически через обработчики событий при изменении сущностей.

Реализация собственных Finder'ов
--------------------------------

[](#реализация-собственных-finderов)

Необходимо унаследоваться от `AbstractFinder` и реализовать:

### Обязательные абстрактные методы

[](#обязательные-абстрактные-методы)

```
protected function getAdditionalCachePath(): string
```

Возвращает строку-суффикс пути кеша. Например: `/iblock`, `/highloadblock`.

```
protected function requireModules(): array
```

Возвращает массив модулей Битрикс для загрузки. Например: `['iblock']`, `['sale']`. Можно вернуть пустой массив.

```
protected function query(...$args): \Bitrix\Main\ORM\Query\Query
```

Формирует ORM-запрос и вызывает `setQueryMetadata()`. Важно: запрос должен выбирать широкий набор сущностей (например, все инфоблоки одного типа), а не одну конкретную. Данные индексируются и кешируются целиком, нужный элемент извлекается из кеша.

### Мета-информация запроса

[](#мета-информация-запроса)

Внутри `query()` необходимо вызвать:

```
$this->setQueryMetadata(
    'CODE',        // поле, по которому индексируется кеш
    $code,         // значение для выборки из кеша
    [$iblockId]    // shard-параметры кеша (влияют на путь кеша)
);
```

### Дополнительные возможности

[](#дополнительные-возможности)

- Можно переопределить `getItems(Query $q, string $keyField): array` для кастомизации структуры кешируемых данных (пример: `PriceType` добавляет специальную запись для базовой цены)
- Рекомендуется переопределить `get()` и `getId()` с явными параметрами для корректной работы автодополнения в IDE

### Инвалидация кеша

[](#инвалидация-кеша)

Необходимо создать обработчики событий `OnAfterAdd`, `OnAfterUpdate`, `OnBeforeDelete` (или аналоги для конкретного модуля), которые вызывают `AbstractFinder::invalidateCache()`:

```
use Maximaster\Tools\Finder\Iblock;

class OnAfterIBlockUpdate
{
    public static function handle(array $fields): void
    {
        Iblock::getInstance()->invalidateCache([$fields['IBLOCK_TYPE_ID']]);
    }
}
```

Аргумент `$shards` в `invalidateCache()` должен совпадать с `$shards` в `setQueryMetadata()`. Все обработчики событий библиотеки подключаются через `bootstrap.php` с помощью `EventManager::addEventHandlerCompatible()`.

За примерами см. классы в `src/EventHandlers/`.

Обработчики событий в поставке
------------------------------

[](#обработчики-событий-в-поставке)

МодульСобытия`iblock``OnAfterIBlockAdd`, `OnAfterIBlockUpdate`, `OnBeforeIBlockDelete``iblock``OnAfterIBlockPropertyAdd`, `OnAfterIBlockPropertyUpdate`, `OnBeforeIBlockPropertyDelete``iblock``OnAfterIBlockSectionAdd`, `OnAfterIBlockSectionUpdate`, `OnAfterIBlockSectionDelete``main``OnAfterGroupAdd`, `OnAfterGroupUpdate`, `OnGroupDelete``catalog``OnGroupAdd`, `OnGroupUpdate`, `OnGroupDelete``sale``OnOrderPropsAdd`, `OnOrderPropsUpdate`, `OnOrderPropsDelete``highloadblock``OnAdd`, `OnUpdate`, `OnDelete``crm``OnAfterAdd`, `OnAfterUpdate`, `OnAfterDelete` (Dynamic Type)WTF. Почему статика?
--------------------

[](#wtf-почему-статика)

Потому что Битрикс — статический синглтоновый глобальный монстр. Как только он даст возможность работать хотя бы в режиме `ServiceLocator`, тогда и поговорим.

###  Health Score

56

—

FairBetter than 97% of packages

Maintenance83

Actively maintained with recent releases

Popularity33

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity74

Established project with proven stability

 Bus Factor1

Top contributor holds 59.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~394 days

Recently: every ~279 days

Total

10

Last Release

88d ago

Major Versions

v0.2.2 → v1.0.02023-03-14

v1.0.2 → v2.0.02025-10-23

PHP version history (3 changes)v0.1PHP ^5.6

v0.2PHP ^5.5 || ^7.0

v1.0.0PHP ^5.6 || ^7.0 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/063eabc66470fad298c3d9ff12eda282d784a068932a62cd48a4e5a261433c24?d=identicon)[mmjurov](/maintainers/mmjurov)

---

Top Contributors

[![mmjurov](https://avatars.githubusercontent.com/u/802208?v=4)](https://github.com/mmjurov "mmjurov (16 commits)")[![Mike-maximaster](https://avatars.githubusercontent.com/u/31412022?v=4)](https://github.com/Mike-maximaster "Mike-maximaster (4 commits)")[![mlavrinenko](https://avatars.githubusercontent.com/u/15840214?v=4)](https://github.com/mlavrinenko "mlavrinenko (2 commits)")[![dmnbars](https://avatars.githubusercontent.com/u/7151631?v=4)](https://github.com/dmnbars "dmnbars (2 commits)")[![KirillYarv](https://avatars.githubusercontent.com/u/67902106?v=4)](https://github.com/KirillYarv "KirillYarv (1 commits)")[![s-saranin](https://avatars.githubusercontent.com/u/742397?v=4)](https://github.com/s-saranin "s-saranin (1 commits)")[![v-luchko](https://avatars.githubusercontent.com/u/60873204?v=4)](https://github.com/v-luchko "v-luchko (1 commits)")

### Embed Badge

![Health badge](/badges/maximaster-toolsfinder/health.svg)

```
[![Health](https://phpackages.com/badges/maximaster-toolsfinder/health.svg)](https://phpackages.com/packages/maximaster-toolsfinder)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
