Записи Highload-блока и их пользовательские поля в режиме перевода разделяются на основную таблицу HL и таблицу переводов модуля.
Таблица переводов HL — mm_hl_{table_name}, где {table_name} —
имя физической таблицы Highload-блока в нижнем регистре. Для HL с таблицей b_hlbd_brands
переводы хранятся в mm_hl_b_hlbd_brands.
Имя формирует метод CFanTranslator::getTrHlTableName($tableName).
Таблицы вида mm_ut_hlblock_{id} для Highload-блоков не создаются —
у HL нет системной b_uts_hlblock_*, данные лежат в собственной таблице блока.
Основная и переводческая таблица
| Таблица | Содержимое |
|---|---|
{TABLE_NAME} HL-блока |
Оригинальные значения всех UF и служебных полей записи (язык по умолчанию) |
mm_hl_{table_name} |
Переводы только строковых UF + служебные поля привязки к записи и языку |
Структура таблицы mm_hl_*
| Колонка | Назначение |
|---|---|
ID |
Первичный ключ строки перевода (autoincrement), не путать с ID записи HL |
VALUE_ID |
ID записи в основной таблице Highload-блока |
SITE_ID |
Идентификатор сайта |
LANGUAGE_ID |
Код языка перевода |
UF_* |
Колонки только для переводимых строковых UF |
Примечание. Таблица и ORM-сущность перевода создаются при
Modulemarket\Translator\Highloadblock\HighLoadBlockTable::compileEntity().
Для перевода генерируется класс Translate{Name}Table с таблицей mm_hl_*.
Сохранение в режиме перевода
Обработчик HighLoadBlockTable::HighLoadOnBeforeUpdate() срабатывает при обновлении
записи HL в режиме перевода:
- Из полей события отбираются только строковые переводимые UF.
- В таблицу
mm_hl_*выполняетсяaddилиupdateпо фильтруVALUE_ID + LANGUAGE_ID + SITE_ID. - Поля основной записи HL из события снимаются (
unsetFields) — оригинал не меняется.
Важно! Поля типа hlblock, file, integer и другие
с BASE_TYPE !== 'string' в mm_hl_* не сохраняются. Их значение всегда
берётся из основной таблицы HL.
Множественные UF
В основной таблице HL множественные значения могут храниться в отдельной таблице
{TABLE_NAME}_{uf_field} (стандартный механизм 1С-Битрикс).
В таблице переводов mm_hl_* для множественных строковых полей отдельная
UTM-таблица не создаётся: значения сериализуются и хранятся в одной колонке UF
(поле типа ArrayField в ORM-сущности перевода, аналогично кэш-полю в основной сущности).
Чтение данных (COALESCE)
DataManager Highload-блока в режиме перевода для строковых UF подставляет выражение:
COALESCE(TR.UF_NAME, main.UF_NAME) AS UF_NAME
Связь с таблицей переводов: main.ID = TR.VALUE_ID и
TR.LANGUAGE_ID = текущий язык.
Нестроковые UF читаются только из основной таблицы HL.
Удаление записи
При удалении записи HL в режиме перевода удаляются строки перевода из mm_hl_*
с соответствующим VALUE_ID (обработчики HighLoadOnBeforeDelete /
HighLoadOnAfterDelete).
Пример
// Highload-блок: TABLE_NAME = b_hlbd_products
// ENTITY_ID UF: HLBLOCK_3
// Оригинал записи ID=50:
b_hlbd_products
// Перевод на английский (строковые UF):
mm_hl_b_hlbd_products
ID = 17 // PK строки перевода
VALUE_ID = 50 // ID записи в b_hlbd_products
LANGUAGE_ID = en
SITE_ID = en
UF_TITLE = 'Product name'
UF_TAGS = 'a:2:{...}' // множественное string — serialize
Количество показов: 2
Дата изменения: 15.05.2026 21:41:57