Highload-блоки в 1С-Битрикс: поддержка, индексы и скорость

Highload-блоки в 1С-Битрикс часто используют для справочников, цветов, брендов, городов, соответствий, дополнительных характеристик и связей с внешними системами. Это удобный инструмент, но при росте данных он требует дисциплины: понятные поля, индексы, аккуратные фильтры и кэш.

Если highload-блок начинался как маленький справочник, а через год содержит десятки тысяч строк, старый код может начать тормозить каталог, фильтр или импорт.

Понять назначение блока

Перед оптимизацией нужно понять, зачем highload-блок существует. Частая проблема — один блок начинает хранить всё подряд: справочник, настройки, связи, временные данные и результаты импорта.

  • какая сущность хранится в блоке;
  • какие поля обязательны;
  • по каким полям идёт фильтрация;
  • какие поля выводятся пользователю;
  • кто и как обновляет данные;
  • есть ли связь с 1С или внешним API.

Использовать ORM аккуратно

Для highload-блоков обычно получают entity и data class, затем выполняют запрос. Важно не выбирать все поля без необходимости.

use Bitrix\Highloadblock\HighloadBlockTable;

$hlblock = HighloadBlockTable::getById($hlblockId)->fetch();
$entity = HighloadBlockTable::compileEntity($hlblock);
$dataClass = $entity->getDataClass();

$rows = $dataClass::getList([
    'select' => ['ID', 'UF_NAME', 'UF_XML_ID'],
    'filter' => ['=UF_ACTIVE' => 1],
    'order' => ['UF_SORT' => 'ASC'],
    'limit' => 100,
])->fetchAll();

Если на странице нужен только ID и название, не нужно тянуть все UF_* поля.

Индексы

Если highload-блок фильтруется по UF_XML_ID, UF_ACTIVE, UF_CITY_ID или другому полю, для него может потребоваться индекс. Без индекса база будет просматривать много строк.

SELECT *
FROM b_hlbd_reference
WHERE UF_XML_ID = 'abc-123';

Индекс добавляют на фактическую таблицу highload-блока. Название таблицы можно посмотреть в настройках блока.

CREATE INDEX idx_hl_reference_xml_id
ON b_hlbd_reference (UF_XML_ID);

Перед добавлением индекса нужно проверить размер таблицы и реальные запросы. Индексы на все поля подряд не нужны.

Кэширование справочников

Если highload-блок используется как справочник и редко меняется, данные можно кэшировать. Это особенно полезно для меню, фильтров и повторяющихся списков.

$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheTime = 3600;
$cacheId = 'hl_reference_active';

if ($cache->initCache($cacheTime, $cacheId, '/hl/reference/')) {
    $items = $cache->getVars();
} elseif ($cache->startDataCache()) {
    $items = $dataClass::getList([
        'select' => ['ID', 'UF_NAME'],
        'filter' => ['=UF_ACTIVE' => 1],
    ])->fetchAll();

    $cache->endDataCache($items);
}

Если справочник меняется из админки или импорта, нужно предусмотреть сброс кэша.

Импорт и обновление

При регулярном импорте не стоит удалять весь highload-блок и создавать заново, если данные связаны с товарами или используются в URL. Лучше обновлять по стабильному ключу, например UF_XML_ID.

$existing = $dataClass::getList([
    'select' => ['ID'],
    'filter' => ['=UF_XML_ID' => $xmlId],
    'limit' => 1,
])->fetch();

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

Дубли и чистка

Перед чисткой нужно понять, есть ли связи с товарами, заказами или внешними данными. Удаление строки highload-блока может сломать вывод свойства или фильтр.

SELECT UF_XML_ID, COUNT(*)
FROM b_hlbd_reference
GROUP BY UF_XML_ID
HAVING COUNT(*) > 1;

Чистку дублей лучше делать через миграцию или отдельный скрипт с логом, а не руками в базе без плана отката.

Чек-лист

  1. Понять назначение highload-блока.
  2. Проверить количество строк.
  3. Проверить поля, по которым идёт фильтрация.
  4. Добавить индексы под реальные запросы.
  5. Не выбирать все поля без необходимости.
  6. Кэшировать редко меняющиеся справочники.
  7. Обновлять импорт по стабильному ключу.
  8. Чистить дубли только после проверки связей.

Highload-блоки хорошо работают, когда у них понятная роль и предсказуемые запросы. Если использовать их как бесформенную таблицу “для всего”, со временем проблемы появятся в скорости, импорте и поддержке.

Комментарии (0)

Пока нет комментариев. Будьте первым!