Хранение переводов UF разделов инфоблока

Переводы раздела инфоблока состоят из двух частей: стандартные поля раздела и пользовательские поля (UF_*). Они хранятся в разных таблицах.

Стандартные поля раздела

Поля NAME, DESCRIPTION, ACTIVE и другие переводимые атрибуты раздела записываются в таблицу fan_translator_iblock_section через ORM-класс Modulemarket\Translator\Iblock\SectionTable.

Ключ записи: ID раздела + LANGUAGE_ID + SITE_ID (при включённом разделении по сайтам).

Пользовательские поля раздела

Таблица переводов UFmm_ut_iblock_{ID}_section, где {ID} — числовой идентификатор инфоблока. Для сущности IBLOCK_7_SECTION таблица будет mm_ut_iblock_7_section.

Исходные значения UF по-прежнему лежат в системной таблице 1С-Битрикс: b_uts_iblock_{ID}_section (поле связи — VALUE_ID = ID раздела).

Структура таблицы mm_ut_*

Колонка Назначение
VALUE_ID ID раздела (связь с b_uts_*.VALUE_ID и b_iblock_section.ID)
SITE_ID Идентификатор сайта (2 символа)
LANGUAGE_ID Код языка перевода (2 символа)
UF_* Колонки только для переводимых строковых UF (создаются при добавлении поля)

Примечание. Имя таблицы возвращает метод CFanTranslator::getTrUtsTableName('IBLOCK_N_SECTION'). Колонки UF добавляются классом Modulemarket\Translator\UserField\Table::create() только если isTranslatableUserField() вернул true.

Сохранение в режиме перевода

При обновлении раздела в режиме перевода вызывается CFanTranslator::IblockSection_UpdateTranslations():

  1. Отбираются только поля с префиксом UF_ и строковым BASE_TYPE.
  2. Значения записываются в mm_ut_iblock_{ID}_section по ключу VALUE_ID + LANGUAGE_ID + SITE_ID (обновление или вставка строки).
  3. Стандартные поля раздела сохраняются в fan_translator_iblock_section.
  4. Основная запись в b_iblock_section и b_uts_* в этом режиме для переводимых данных не изменяется.

Множественные UF

Для множественных строковых полей (MULTIPLE = Y) отдельная UTM-таблица переводов не создаётся. Все значения хранятся в одной колонке таблицы mm_ut_* в виде сериализованного PHP-массива (функция serialize()).

Code Copy code Code copied!
1
2
3
4
5
// Упрощённая логика при сохранении (include.php, IblockSection_UpdateTranslations)
$val = is_array($ufValue)
    ? serialize($ufValue)
    : $ufValue;
// INSERT / UPDATE в mm_ut_iblock_N_section

При чтении массив восстанавливается через unserialize() в FCUserTypeManager::GetUserFieldsWithValues().

Примечание. Для типа customhtml с множественностью перед сериализацией значения могут подготавливаться классом FCustomTypeHtml.

Чтение данных (COALESCE)

При выборке UF раздела в режиме перевода выполняется объединение основной и переводческой таблиц:

Code Copy code Code copied!
1
2
3
4
5
6
7
8
SELECT
  COALESCE(FUTS.UF_NAME, BUTS.UF_NAME) AS UF_NAME
FROM b_uts_iblock_N_section BUTS
LEFT JOIN mm_ut_iblock_N_section FUTS
  ON BUTS.VALUE_ID = FUTS.VALUE_ID
  AND FUTS.LANGUAGE_ID = 'en'
  AND FUTS.SITE_ID = 'en'
WHERE BUTS.VALUE_ID = 123

Для непереводимых UF подстановка перевода не выполняется — в SELECT попадает только BUTS.UF_*.

Пример: добавление UF к инфоблоку

Code Copy code Code copied!
1
2
3
4
5
6
7
// ENTITY_ID в b_user_field
'IBLOCK_12_SECTION'

// После добавления строкового UF_АНОНС создаётся колонка в:
mm_ut_iblock_12_section.UF_ANONS

// Числовое UF_РЕЙТИНГ (integer) колонку в mm_ut_* не получит

Количество показов: 1
Дата изменения: 15.05.2026 21:40:30