Как сохранить исходное имя загруженного файла

После обновления файл с русским именем сохранился на сервере с транслитерированным именем, а в карточке файла исчезло исходное название? В свежей теме форума Битрикс описан именно такой случай: до обновления 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 «на всякий случай».

Что проверить до и после

  1. Убедитесь, что проблема именно в названиях файлов инфоблока, а не в кодировке страницы или браузера.
  2. Сделайте копию init.php и загрузите в тестовый инфоблок один файл с кириллицей, например Договор октябрь.pdf.
  3. Проверьте в административной части имя прикреплённого файла и скачайте его. Ожидаемый результат: в интерфейсе видно исходное имя, а физический путь может остаться транслитерированным.
  4. Загрузите файл не из инфоблока, например в другой модуль, и убедитесь, что обработчик его не меняет.

Границы решения

Это исправление относится к симптому из темы: после обновления изменяется ORIGINAL_NAME у файлов инфоблока при включённой транслитерации. Оно не отменяет транслитерацию, не переименовывает уже сохранённые файлы и не восстанавливает старые записи в базе. Для уже загруженных документов нужен отдельный план миграции с резервной копией.

Если после установки сайт выдаёт ошибку, удалите только добавленный обработчик из локального init.php через безопасный доступ к файлам и проверьте синтаксис. Не редактируйте ядро и не запускайте массовые SQL-запросы.

Итог

Когда нужно сохранить пользователю русское название файла, оставьте служебное имя на диске как есть и заполните ORIGINAL_NAME в локальном обработчике OnFileSave. Решение узкое, его легко проверить на одном тестовом файле и при необходимости убрать без следов в ядре.

Проверено 4 октября 2026 года. Источники: тема форума, 13–21 августа 2026 года (сообщение передаёт ответ технической поддержки); официальный список событий Битрикс: OnFileSave.