Проектування структури Highload-блоків 1С-Бітрікс
HL-блок — це генератор користувацьких таблиць у MySQL/PostgreSQL поверх D7 ORM. Технічно HL-блок — це запис у b_highload_block, набір полів у b_user_field, і автоматично створювана таблиця hl_{XML_ID}. Нічого магічного — просто спосіб створити таблицю з типізованими полями через інтерфейс Бітрікс без написання SQL. Але саме від того, як ця структура спроектована, залежить, чи буде HL-блок працювати як швидкий довідник або перетвориться на вузьке місце.
Коли HL-блок, а коли інфоблок або власна таблиця
HL-блок замінює інфоблок там, де не потрібні розділи, SEO-поля (META_TITLE, META_KEYWORDS), preview/detail-зображення та вбудовані механізми публікації. Це довідники: бренди, країни, теги, одиниці виміру, характеристики для фасету.
HL-блок програє власній D7-таблиці (DataManager) коли:
- Потрібні складені індекси (HL підтримує лише індекси по окремих полях через
UF_*) - Потрібні зовнішні ключі та каскадні операції
- Схема таблиці часто змінюється та потребує міграцій
У цих випадках правильніше створити клас, що наслідує \Bitrix\Main\ORM\Data\DataManager, і керувати таблицею через нього.
Типи полів HL-блоку та їх особливості
HL-блоки використовують систему користувацьких полів (UF_*). Доступні типи:
-
string/string_formatted— VARCHAR. Для імен, назв. -
integer— INT. Для числових ідентифікаторів, сортування. -
double— DECIMAL/FLOAT. Для цін, коефіцієнтів. -
boolean— TINYINT(1). Прапори активності. -
file— зберігає ID файлу зb_file. Для зображень у довідниках. -
enumeration— прив'язка доb_user_field_enum. Для фіксованих статусів всередині HL-запису. -
datetime/date— DATETIME / DATE. -
iblock_element/iblock_section— прив'язка до елемента або розділу інфоблоку. Використовується з обережністю: створює неявний зв'язок між HL та інфоблоком.
Проблема поля типу iblock_element у HL-блоці: при видаленні елемента інфоблоку HL-запис не оновлюється автоматично — потрібен обробник події OnAfterIBlockElementDelete.
Індексування полів HL-блоку
За замовчуванням HL-блок створює таблицю лише з PRIMARY KEY по полю ID. Всі інші поля — без індексів. Якщо HL-блок використовується як довідник для фасетного індексу каталогу, додаткові індекси зазвичай не потрібні — фасет працює з b_iblock_{ID}_index, а не з HL-таблицею напряму.
Але якщо HL-блок використовується для зберігання операційних даних (історія дій, лог замовлень, записи бонусної програми) — індекси по полях вибірки критичні. Додаються вручну через SQL-міграцію:
ALTER TABLE hl_loyalty_history ADD INDEX idx_user_id (UF_USER_ID);
ALTER TABLE hl_loyalty_history ADD INDEX idx_date (UF_DATE);
Бітрікс не надає UI для управління індексами HL-таблиць — лише прямий SQL або скрипт міграції.
Кейс: HL-блок як заміна інфоблоку для B2B-каталогу
Дистриб'ютор електроніки. У каталозі 2 200 унікальних характеристик товарів (технічні параметри). Спочатку — властивості інфоблоку типу «Рядок», b_iblock_element_property містила 8 млн рядків.
Рішення: перевести довідникові характеристики на HL-блоки за доменами:
-
hl_tech_connectivity— інтерфейси підключення (USB-C, HDMI тощо) -
hl_tech_resolution— роздільні здатності екранів та матриць -
hl_tech_standard— стандарти (Wi-Fi 6, Bluetooth 5.2 тощо)
Кожен HL-блок: поля UF_NAME (VARCHAR 255), UF_XML_ID (VARCHAR 50, унікальний), UF_ACTIVE (boolean), UF_SORT (integer). Індекси по UF_XML_ID — додані вручну для швидкого пошуку при імпорті з 1С.
Результат: b_iblock_element_property скоротилася з 8 млн до 1.2 млн рядків (залишилися лише числові властивості). Фасетний індекс перестворюється за 8 хвилин замість 45.
Управління даними HL-блоку через D7
Робота з HL-блоком у коді — через \Bitrix\Highloadblock\HighloadBlockTable і динамічно створюваний клас:
$hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getById($id)->fetch();
$entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$dataClass = $entity->getDataClass();
$rows = $dataClass::getList(['filter' => ['UF_ACTIVE' => true]]);
Це стандартний патерн — його важливо закріпити в code style проєкту, щоб звернення до HL-блоків не розповзалися по шаблонах у вигляді SQL-запитів.
Склад роботи з проектування HL-блоків
- Аналіз властивостей інфоблоків: виявлення кандидатів для переведення на HL
- Проектування схеми полів кожного HL-блоку
- Визначення стратегії індексування
- Планування міграції даних з
b_iblock_element_property - Документування: схема таблиць, призначення полів, зв'язки
- Скрипти створення HL-блоків та первинного заповнення
Строк проектування: 2–5 робочих днів на кожні 10–15 HL-блоків залежно від складності предметної області.







