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;
Чистку дублей лучше делать через миграцию или отдельный скрипт с логом, а не руками в базе без плана отката.
Чек-лист
- Понять назначение highload-блока.
- Проверить количество строк.
- Проверить поля, по которым идёт фильтрация.
- Добавить индексы под реальные запросы.
- Не выбирать все поля без необходимости.
- Кэшировать редко меняющиеся справочники.
- Обновлять импорт по стабильному ключу.
- Чистить дубли только после проверки связей.
Highload-блоки хорошо работают, когда у них понятная роль и предсказуемые запросы. Если использовать их как бесформенную таблицу “для всего”, со временем проблемы появятся в скорости, импорте и поддержке.
Комментарии (0)
Пока нет комментариев. Будьте первым!