После обновления файл с русским именем сохранился на сервере с транслитерированным именем, а в карточке файла исчезло исходное название? В свежей теме форума Битрикс описан именно такой случай: до обновления ORIGINAL_NAME хранил кириллицу, после — и FILE_NAME, и ORIGINAL_NAME стали транслитом.
В сообщении от 21 августа 2026 года автор передал ответ технической поддержки: изменение произошло в SaveFile после транслитерации. Для этого конкретного поведения есть аккуратное решение без правки ядра: перед сохранением вернуть исходное имя в поле ORIGINAL_NAME.
Что меняет обработчик
FILE_NAME — имя файла, под которым он лежит на диске. ORIGINAL_NAME — исходное имя для показа пользователю. В этом решении путь хранения остаётся транслитерированным, а в ORIGINAL_NAME возвращается имя, которое пришло при загрузке.
Обработчик работает только для файлов инфоблоков: он проверяет поле MODULE_ID внутри массива файла. Официальная документация CFile::SaveFile описывает это поле как название модуля-владельца файла. Файлы других модулей обработчик не трогает.
Куда добавить код
Создайте или дополните файл /local/php_interface/init.php. Это место для локальной инициализации проекта. Не меняйте /bitrix/modules/: обновление перезапишет ядро и затруднит поддержку.
<?php
AddEventHandler('main', 'OnFileSave', 'bxguruKeepOriginalIblockName');
function bxguruKeepOriginalIblockName(&$arFile, $fileName, $savePath)
{
if (($arFile['MODULE_ID'] ?? '') !== 'iblock') {
return;
}
$originalName = basename((string) ($arFile['name'] ?? ''));
if ($originalName !== '') {
$arFile['ORIGINAL_NAME'] = $originalName;
}
}
Официальная документация Битрикс указывает, что событие OnFileSave вызывается при сохранении файла методом CFile::SaveFile, и показывает обработчик с массивом $arFile, переданным по ссылке. Поэтому изменённое поле останется в массиве, который сохраняет ядро. Модуль определяется только из документированного MODULE_ID в $arFile.
В проверенном исходнике main 26.150.0 обработка останавливается как «внешнее хранилище», только если обработчик вернул true. Наш обработчик ничего не возвращает, значит в этой версии обычное сохранение продолжается. Это вывод по исходнику конкретной версии; не добавляйте return false или другой return «на всякий случай».
Что проверить до и после
- Убедитесь, что проблема именно в названиях файлов инфоблока, а не в кодировке страницы или браузера.
- Сделайте копию
init.phpи загрузите в тестовый инфоблок один файл с кириллицей, напримерДоговор октябрь.pdf. - Проверьте в административной части имя прикреплённого файла и скачайте его. Ожидаемый результат: в интерфейсе видно исходное имя, а физический путь может остаться транслитерированным.
- Загрузите файл не из инфоблока, например в другой модуль, и убедитесь, что обработчик его не меняет.
Границы решения
Это исправление относится к симптому из темы: после обновления изменяется ORIGINAL_NAME у файлов инфоблока при включённой транслитерации. Оно не отменяет транслитерацию, не переименовывает уже сохранённые файлы и не восстанавливает старые записи в базе. Для уже загруженных документов нужен отдельный план миграции с резервной копией.
Если после установки сайт выдаёт ошибку, удалите только добавленный обработчик из локального init.php через безопасный доступ к файлам и проверьте синтаксис. Не редактируйте ядро и не запускайте массовые SQL-запросы.
Итог
Когда нужно сохранить пользователю русское название файла, оставьте служебное имя на диске как есть и заполните ORIGINAL_NAME в локальном обработчике OnFileSave. Решение узкое, его легко проверить на одном тестовом файле и при необходимости убрать без следов в ядре.
Проверено 4 октября 2026 года. Источники: тема форума, 13–21 августа 2026 года (сообщение передаёт ответ технической поддержки); официальный список событий Битрикс: OnFileSave.