Хранение переводов Highload-блока

Записи Highload-блока и их пользовательские поля в режиме перевода разделяются на основную таблицу HL и таблицу переводов модуля.

Таблица переводов HLmm_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 в режиме перевода:

  1. Из полей события отбираются только строковые переводимые UF.
  2. В таблицу mm_hl_* выполняется add или update по фильтру VALUE_ID + LANGUAGE_ID + SITE_ID.
  3. Поля основной записи 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 подставляет выражение:

Code Copy code Code copied!
1
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).

Пример

Code Copy code Code copied!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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