Блог Горошко Андрея 1C-Битрикс Оптимизация Highload-блоков: Кэширование скомпилированных сущностей

Оптимизация Highload-блоков: Кэширование скомпилированных сущностей

При работе с HL-блоками мы постоянно пишем:

$hlblock = HL\HighloadBlockTable::getById($id)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock); // <-- Здесь происходит магия
$entityClass = $entity->getDataClass();

Метод compileEntity «на лету» собирает класс сущности, анализируя пользовательские поля.

Это требует ресурсов. Если вы вызываете этот код в цикле или несколько раз в разных компонентах на одной странице, вы теряете производительность.

Паттерн: Singleton для сущностей

Лучшая практика — создать сервисный класс, который будет хранить скомпилированные классы в статическом свойстве.

namespace My\Project;

use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Loader;

class HLBlockFactory
{
    private static $classes = [];

    /**
     * Возвращает класс сущности HL-блока по его ID или NAME
     * @param int|string $identifier ID или Название (TABLE_NAME) HL-блока
     * @return string|null Имя класса или null
     */
    public static function getClass($identifier)
    {
        if (isset(self::$classes[$identifier])) {
            return self::$classes[$identifier];
        }

        Loader::includeModule('highloadblock');

        // Пытаемся найти HL-блок
        // Если передан ID (число)
        if (is_numeric($identifier)) {
            $hlblock = HighloadBlockTable::getById($identifier)->fetch();
        } else {
            // Если передано название таблицы
            $hlblock = HighloadBlockTable::getList([
                'filter' => ['=TABLE_NAME' => $identifier]
            ])->fetch();
        }

        if (!$hlblock) {
            return null;
        }

        // Компилируем
        $entity = HighloadBlockTable::compileEntity($hlblock);
        $dataClass = $entity->getDataClass();

        // Кэшируем результат в статику
        self::$classes[$identifier] = $dataClass;
        // Можно закэшировать и по ID, и по TABLE_NAME, чтобы не искать второй раз
        self::$classes[$hlblock['ID']] = $dataClass;
        self::$classes[$hlblock['TABLE_NAME']] = $dataClass;

        return $dataClass;
    }
}

Как использовать

use My\Project\HLBlockFactory;

// Первый вызов: будет запрос к БД и компиляция
$brandClass = HLBlockFactory::getClass('b_brands'); 
$brands = $brandClass::getList([])->fetchAll();

// ... где-то в другом компоненте ...

// Второй вызов: вернется мгновенно из статического массива
$brandClass = HLBlockFactory::getClass('b_brands');

Вывод:
Избегайте дублирования вызовов compileEntity в рамках одного хита.

Использование простой фабрики-обертки сделает ваш код чище и быстрее, особенно на страницах с большим количеством компонентов.

compileEntity кэширование, HighloadBlockTable::compileEntity, оптимизация HL-блоков, HLblock производительность, getTable.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Добавить комментарий

Related Post

Разработка интернет-магазина с автоматическим динамическим ценообразованиемРазработка интернет-магазина с автоматическим динамическим ценообразованием

Реализация проекта «Разработка интернет-магазина с автоматическим динамическим ценообразованием» направлена на создание технологического преимущества компании, масштабирование продаж и обеспечение бесперебойной работы под высокими нагрузками. автоматическая корректировка розничных цен в зависимости от

Получить значения полей склада catalog.store.getПолучить значения полей склада catalog.store.get

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Получить значения полей склада catalog.store.get», разберем архитектурные особенности

Как использовать D7LangSingle() в 1С-Битрикс: пример кодаКак использовать D7LangSingle() в 1С-Битрикс: пример кода

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Как использовать D7LangSingle() в 1С-Битрикс: пример кода». Вы узнаете экспертные методики работы с