Транслитерация символов – важная задача при создании URL-адресов, символьных кодов и других полей, где допускаются только латинские буквы и цифры. В 1С-Битрикс для этого предусмотрен статический метод CUtil::translit(), позволяющий преобразовывать строки из кириллицы (и не только) в транслит. Эта функция часто используется для формирования «человеко-понятных» ссылок, символьных кодов элементов инфоблоков, а также для других нужд в веб-разработке.

В данной статье мы детально рассмотрим:
- Формат метода и его параметры.
- Примеры использования при работе с инфоблоками.
- Рекомендации по настройкам и лучшие практики.
1. Что такое CUtil::translit()
    Метод CUtil::translit() — это статический метод класса CUtil, который принимает строку (например, «Текст для транслитерации»), язык (ru, en и т.п.) и набор параметров, описывающих правила транслитерации, и возвращает строку, преобразованную к требуемому формату.
Общий вид вызова:
CUtil::translit(
    string $str,
    string $lang,
    array $params = []
);Описание параметров
- strСтрока, которую нужно транслитерировать.
- langЯзык оригинальной строки (например,- "ru"). Чаще всего применяется русский, однако теоретически можно задать и другие поддерживаемые языки.
- paramsМассив дополнительных настроек:
| Параметр | Описание | 
|---|---|
| max_len | Максимальное количество символов в результирующей строке (по умолчанию 100). | 
| change_case | Приведение к определённому регистру: L– к нижнему,U– к верхнему,false– не изменять (по умолчаниюL). | 
| replace_space | Чем заменять пробелы (по умолчанию _). | 
| replace_other | Чем заменять «прочие» символы (по умолчанию _). | 
| delete_repeat_replace | Удалять ли повторяющиеся символы замены (по умолчанию true). Если два пробела подряд, то слипаются в один символ замены. | 
| safe_chars | Строка символов, которые не нужно заменять (по умолчанию – пустая строка). | 
2. Пример простого вызова
Допустим, нужно транслитерировать строку "Текст*89". По умолчанию пробелы и «непонятные» символы заменяются на _, но мы захотим вместо _ использовать -. Рассмотрим код:
<?php
$name = "Текст*89";
$arParams = array(
    "replace_space" => "-",
    "replace_other" => "-"
);
// Выполним транслитерацию
$trans = CUtil::translit($name, "ru", $arParams);
// Выведем результат
echo '<pre>';
var_dump($trans);
echo '</pre>';
?>Что происходит внутри:
- "Текст*89"посимвольно обрабатывается, кириллица переводится в латиницу (например,- "Т"→- T,- "е"→- e,- "к"→- k, и т.д.).
- Пробелы (если бы они были) заменились бы на -.
- Остальные «левые» символы (например, *) также заменяются на-.
- По умолчанию change_caseравноL, поэтому результат приводится к нижнему регистру.
Если выведете результат, то увидите, что Текст*89 превратился примерно в "tekst-89" (конечный вариант зависит ещё и от точных правил транслита, прописанных в языковых файлах Bitrix).
Важно: Символ
&(амперсанд) внутри Битрикс обычно заменяется какamp(например,"Hello & world"→hello-amp-world). Это заложено в файле локализации.
3. Использование в функциях для генерации символьных кодов
Пример 1. Упрощённый метод
Рассмотрим функцию, которая «на лету» возвращает транслитерацию для имени без сложных настроек:
function translitName(string $name, int $iblockId = 0): string
{
    // Удаляем пробелы в начале и конце
    $name = trim($name);
    // Если инфоблок не задан, просто вызовем транслит с настройками по умолчанию
    if (!$iblockId) {
        return \Cutil::translit($name, 'ru');
    }
    // ... некоторая логика, связанная с проверкой настроек
    // Но для наглядности оставим лишь минимальную реализацию:
    return \Cutil::translit($name, 'ru');
}Здесь если не задан ID инфоблока, мы применяем стандартную логику транслита. Функция вернёт, например, для строки "Пример Названия" что-то вроде "primer-nazvaniya", учитывая настройки по умолчанию.
Пример 2. С учётом реальных настроек инфоблока
Часто при работе с символьными кодами нужно ориентироваться на глобальные настройки инфоблока. В Bitrix у инфоблоков существует настройка полей, где в разделе «Символьный код» можно указать:
- длину (TRANS_LEN),
- регистр (TRANS_CASE),
- символ замены пробела (TRANS_SPACE),
- символ замены «прочих» символов (TRANS_OTHER),
- и т.п.
Приведём более «боевой» пример:
function translitName(string $name, int $iblockId = 0): string
{
    static $cachedIblockFields;
    $name = trim($name);
    // Если не передан ID инфоблока, просто вернём строку, транслитерованную по умолчанию
    if (!$iblockId) {
        return \Cutil::translit($name, 'ru');
    }
    // Кэшируем запрос к настройкам полей инфоблока
    if (!isset($cachedIblockFields[$iblockId])) {
        $cachedIblockFields[$iblockId] = \CIBlock::GetFields($iblockId);
    }
    $iblockFields = $cachedIblockFields[$iblockId];
    // Допустим, если поле 'CODE' не является обязательным — вернём пустую строку
    if (!$iblockFields || $iblockFields['CODE']['IS_REQUIRED'] != 'Y') {
        return '';
    }
    // Формируем массив настроек транслита на основе настроек поля
    $params = [
        'max_len'        => $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_LEN'],
        'change_case'    => $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_CASE'],
        'replace_space'  => $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_SPACE'],
        'replace_other'  => $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_OTHER']
    ];
    // Выполняем транслитерацию с учётом параметров
    $translitted = \Cutil::translit($name, 'ru', $params);
    // Удаляем повторяющиеся символы в конце, если нужно
    return rtrim(
        rtrim($translitted, $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_SPACE']),
        $iblockFields['CODE']['DEFAULT_VALUE']['TRANS_OTHER']
    );
}В данном примере функция подстраивается под настройки конкретного инфоблока. Если в админке у инфоблока задано, что пробелы заменяются на дефис, то итогом будет дефис. Если указано ограничение длины (например, 50 символов), то и транслит обрежется до 50 символов.
4. Практический пример при добавлении элемента инфоблока
Частый случай использования: мы создаём элемент инфоблока и хотим, чтобы его символьный код (CODE) генерировался автоматически, опираясь на поле NAME. Код может выглядеть так:
<?php
$el = new CIBlockElement;
$params = [
    "max_len"               => "100",   // обрезает символьный код до 100 символов
    "change_case"           => "L",     // приводим все буквы к нижнему регистру
    "replace_space"         => "-",     // меняем пробелы на дефис
    "replace_other"         => "-",     // «левые» символы на дефис
    "delete_repeat_replace" => "true",  // удаляем повторяющиеся символы замены
    "safe_chars"            => "false", // строка из символов, замена которых не производится
];
// Исходные данные
$data = [
    'name' => 'Пример названия элемента!',
];
// Формируем массив полей для добавления
$fields = [
    "NAME"               => $data['name'],
    "IBLOCK_SECTION_ID"  => $sectionID,
    "IBLOCK_ID"          => $iblockId,
    "ACTIVE"             => "Y",
    "CODE"               => CUtil::translit($data['name'], "ru", $params),
    "PROPERTY_VALUES"    => [
        // Заполнение свойств (при необходимости)
    ],
];
// Добавляем элемент
$elementId = $el->Add($fields);
if ($elementId) {
    echo "Элемент добавлен, ID: {$elementId}";
} else {
    echo "Ошибка: " . $el->LAST_ERROR;
}
?>Здесь значение поля CODE заранее формируется через CUtil::translit(). В процессе:
- Пробелы заменяются на дефис -.
- В итоге символы вроде !«схлопнутся» в дефис.
- Строка будет переведена в нижний регистр.
- Если встретятся несколько подряд пробелов или недопустимых символов, они превратятся в один дефис (благодаря delete_repeat_replace).
5. Дополнительные нюансы и рекомендации
- Нужно ли всегда указывать params? Не обязательно. Если параметры не заданы, то будут использоваться настройки «по умолчанию» из ядра Bitrix:
- safe_charsПараметр- safe_charsпозволяет указать набор символов, которые не будут тронуты во время транслитерации. Это может быть полезно, если нужно «уберечь» определённые символы от замены. Например:
- Обратите внимание на длину Параметр max_lenпо умолчанию равен 100, что часто подходит для SEO и форматов хранения (SIMCODE), но если нужно меньше или больше, следует менять это значение. Если требуется, к примеру, чтобы символьный код не превышал 50 символов, то можно передатьmax_len => 50.
- Символ &По умолчанию в таблице транслита, которая прописана в файлах локализации Bitrix, амперсанд заменяется последовательностьюamp. То есть"hello & world"превратится в"hello-amp-world", если использовать дефис как символ замены пробелов и «прочих» символов.
- Простота эксплуатации Часто удобнее всего настроить в админке автоматический транслит для символьных кодов в настройках инфоблока. Тогда при сохранении элемента в форме админки Bitrix сам выполнит транслитерацию поля NAME. Но если требуется делать это в собственном коде или автоматически в скриптах миграции/импорта, тоCUtil::translit()— идеальный инструмент.
[
    "max_len"               => 100,
    "change_case"           => "L",
    "replace_space"         => "_",
    "replace_other"         => "_",
    "delete_repeat_replace" => true,
    "safe_chars"            => '',
]Однако, для точного контроля над результатом рекомендуется передавать свои настройки или брать их из настроек инфоблока.
$params = [
    "safe_chars" => ".",
];Тогда точка не будет заменяться на _ или другой символ.
6. Взгляд «под капот» – как устроен метод
Если заглянуть в исходный файл modules/main/classes/general/util.php, то можно увидеть, что метод translit():
- Загружает файлы локализации с правилами (TRANS_FROM,TRANS_TO).
- В цикле обрабатывает строку посимвольно, проверяя каждый символ:
- Если символ — латиница, цифра или указанный в safe_chars, то он оставляется как есть.
- Если это пробел, то заменяется на replace_space(учитывая настройкуdelete_repeat_replace).
- Если встречен символ, для которого есть сопоставление в массиве search[$lang], подставляет соответствующую транслитерацию.
- Остальные символы заменяются на replace_other.
- Приводит всё к верхнему/нижнему регистру (если указано UилиL).
- Обрезает строку до max_len.
Метод CUtil::translit() написан таким образом, чтобы быть универсальным и гибким при разных настройках.
Заключение
Функция CUtil::translit() — один из ключевых инструментов при работе с 1С-Битрикс, обеспечивающий корректную транслитерацию строк. Она позволяет автоматически получать URL-friendly тексты, генерировать аккуратные символьные коды элементов инфоблока и другие поля, требующие латиницы без нежелательных символов.
Краткая памятка по использованию:
- Подключайте функцию в любом месте вашего проекта, где нужно транслитеровать строку (в компонентах, обработчиках, скриптах импорта).
- Настраивайте параметры (max_len,replace_space,delete_repeat_replaceи пр.) в соответствии с вашими SEO-требованиями и техническими ограничениями.
- Опирайтесь на настройки инфоблока, если вам нужна единообразная система формирования символьных кодов.
- Проверяйте итоговый результат транслитерации, особенно если используете специфические символы или нестандартные правила.
На этом всё! Надеемся, что данное руководство поможет вам эффективно использовать CUtil::translit() и сэкономит время при разработке. Если у вас остались вопросы или есть дополнительные примеры, которые стоит обсудить — пишите в комментариях к статье!
