Highload инфоблоки — это таблицы MySQL, которыми управляет Битрикс. Они не связаны с обычными инфоблоками и нужны для хранения больших объёмов данных: лог действий, история заказов, пользовательские данные.
Когда использовать Highload инфоблок
- Таблица будет содержать больше 50 000 записей
- Нужна быстрая выборка без overhead’а инфоблоков
- Данные не нужно редактировать через стандартный интерфейс Битрикс
- Нужна кастомная структура таблицы
Создание Highload инфоблока
Через административную панель: Контент → Highload-блоки → Добавить. Или программно:
Bitrix\Main\Loader::includeModule('highloadblock');
use Bitrix\Highloadblock\HighloadBlockTable;
$result = HighloadBlockTable::add([
'NAME' => 'UserActions',
'TABLE_NAME' => 'b_hl_user_actions',
]);
if ($result->isSuccess()) {
$hlId = $result->getId();
echo 'Highload блок создан: ' . $hlId;
}
Добавление полей
use Bitrix\Main\UserFieldTable;
UserFieldTable::add([
'ENTITY_ID' => 'HLBLOCK_' . $hlId,
'FIELD_NAME' => 'UF_ACTION',
'USER_TYPE_ID' => 'string',
'SORT' => 100,
'MULTIPLE' => 'N',
'MANDATORY' => 'Y',
'SETTINGS' => ['SIZE' => 255],
'EDIT_FORM_LABEL' => ['ru' => 'Действие'],
'LIST_COLUMN_LABEL'=> ['ru' => 'Действие'],
]);
Получение класса для работы
Bitrix\Main\Loader::includeModule('highloadblock');
use Bitrix\Highloadblock\HighloadBlockTable;
// Получаем объект HL-блока по имени
$hlblock = HighloadBlockTable::getList([
'filter' => ['=NAME' => 'UserActions'],
])->fetch();
// Компилируем класс
$entity = HighloadBlockTable::compileEntity($hlblock);
$class = $entity->getDataClass(); // полное имя класса
CRUD операции
// Добавление записи
$result = $class::add([
'UF_USER_ID' => 42,
'UF_ACTION' => 'login',
'UF_DATE' => new \Bitrix\Main\Type\DateTime(),
'UF_IP' => $_SERVER['REMOTE_ADDR'],
]);
// Выборка
$result = $class::getList([
'select' => ['ID', 'UF_USER_ID', 'UF_ACTION', 'UF_DATE'],
'filter' => ['=UF_USER_ID' => 42],
'order' => ['UF_DATE' => 'DESC'],
'limit' => 100,
]);
while ($row = $result->fetch()) {
echo $row['UF_ACTION'] . ' — ' . $row['UF_DATE'] . PHP_EOL;
}
// Обновление
$class::update(15, ['UF_ACTION' => 'updated']);
// Удаление
$class::delete(15);
Оптимизация: добавляем индексы
Битрикс не создаёт индексы автоматически. Добавляем через SQL после создания блока:
ALTER TABLE b_hl_user_actions
ADD INDEX idx_user_id (UF_USER_ID),
ADD INDEX idx_date (UF_DATE);
Вынести компиляцию класса в хелпер
function getHLClass(string $name): string {
$hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getList([
'filter' => ['=NAME' => $name],
])->fetch();
if (!$hlblock) {
throw new \RuntimeException("HL block {$name} not found");
}
$entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
return $entity->getDataClass();
}
// Использование
$class = getHLClass('UserActions');
$rows = $class::getList([...])->fetchAll();
Итог
Highload инфоблоки — правильный инструмент для больших таблиц данных в Битрикс. Главное: всегда добавлять индексы руками и выносить компиляцию класса в хелпер чтобы не дублировать код.
