Highload инфоблоки в 1С-Битрикс: создание, выборка и работа с записями

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 инфоблоки — правильный инструмент для больших таблиц данных в Битрикс. Главное: всегда добавлять индексы руками и выносить компиляцию класса в хелпер чтобы не дублировать код.