Bitrix D7: тегированный кеш HighloadBlock — авто-инвалидирование при изменении д

Сниппет показывает, как кэшировать выборку Highload-блока и автоматически очищать её с помощью тегов при добавлении или обновлении записей.

**Почему это полезно**
Выборка Heavy HL-блока хранится час, но как только администратор меняет данные, обработчик события сбрасывает только связанный тег — страницы моментально получают актуальную информацию без полного обнуления кеша.
<?php
use Bitrix\Main\Data\Cache;
use Bitrix\Main\Loader;
use Bitrix\Main\Application;

Loader::includeModule('highloadblock');

$hlId      = 12;
$ttl       = 3600;
$cacheId   = "hl_$hlId";
$cacheDir  = '/hl/tagged/';
$tag       = "hl_table_$hlId";

$cache = Cache::createInstance();

if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
    $rows = $cache->getVars();
} elseif ($cache->startDataCache()) {
    // Начинаем тег-кеш
    $taggedCache = Application::getInstance()->getTaggedCache();
    $taggedCache->startTagCache($cacheDir);
    $taggedCache->registerTag($tag);

    // «Тяжёлый» запрос
    $rows = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlId)
        ->getDataClass()::getList([
            'select' => ['ID', 'UF_NAME', 'UF_PRICE']
        ])->fetchAll();

    $taggedCache->endTagCache();
    $cache->endDataCache($rows);
}

// Выводим данные
foreach ($rows as $row) {
    echo $row['UF_NAME'].' — '.$row['UF_PRICE']."₽<br>";
}

/* ── В файле /local/php_interface/init.php ──
AddEventHandler('highloadblock', 'OnAfterHlBlockUpdate', function ($arFields) {
    \Bitrix\Main\Application::getInstance()->getTaggedCache()
        ->clearByTag("hl_table_".$arFields['ID']);
});
*/