Разработка и Конфигурация · 11 мин
Как изменить имя файла в 1С
Как изменить имя файла в 1С: переименование через ПереместитьФайл, работа с присоединёнными файлами в справочниках, типовые ошибки и проверка результата.
В 1С задача переименования файла возникает в двух разных ситуациях. Первая — нужно изменить имя файла на диске из встроенного языка, например при обмене данными или формировании отчётов. Вторая — требуется переименовать файл, присоединённый к элементу справочника или документу внутри информационной базы. Подходы принципиально различаются, и путать их нельзя.
Во встроенном языке 1С нет отдельной команды «ПереименоватьФайл». Вместо неё используется метод ПереместитьФайл, который фактически выполняет переименование, если источник и приёмник находятся в одном каталоге. Для присоединённых файлов в типовых конфигурациях (БСП) имя хранится в реквизитах объекта и меняется либо через интерфейс, либо программно через объект справочника.
Ниже разобраны оба сценария: работа с файловой системой из кода, переименование присоединённых файлов в типовых конфигурациях, проверка результата и типичные ошибки, которые приводят к потере данных или неработающим ссылкам.
Как переименовать файл на диске из кода 1С
Основной инструмент — метод глобального контекста ПереместитьФайл(<ИмяИсточника>, <ИмяПриемника>). Если указать в качестве приёмника тот же каталог, но с другим именем файла, операционная система выполнит именно переименование, без физического копирования содержимого.
Пример простого переименования:
ИмяИсточника = "D:\Обмен\Выгрузка_старая.xml";
ИмяПриемника = "D:\Обмен\Выгрузка_новая.xml";
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
Метод работает синхронно и при ошибке (файл занят, нет прав, приёмник существует) вызывает исключение. Поэтому в рабочем коде вызов оборачивают в попытку:
Попытка
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
Исключение
Сообщить("Не удалось переименовать файл: " + ОписаниеОшибки());
КонецПопытки;
Важно понимать: если файл с именем приёмника уже существует, поведение зависит от платформы и операционной системы — чаще всего возникает ошибка, а не тихая перезапись. Перед переименованием имеет смысл проверить существование приёмника через объект Файл и метод Существует().
ФайлПриемник = Новый Файл(ИмяПриемника);
Если ФайлПриемник.Существует() Тогда
УдалитьФайлы(ИмяПриемника);
КонецЕсли;
ПереместитьФайл(ИмяИсточника, ИмяПриемника);Как собрать новое имя файла программно
Часто новое имя формируется из старого: меняется только расширение, добавляется дата или префикс. Для этого удобно использовать объект Файл, который раскладывает путь на составляющие: Путь, ИмяБезРасширения, Расширение, Имя.
Файл = Новый Файл("D:\Обмен\Выгрузка.xml");
НовоеИмя = Файл.Путь + Файл.ИмяБезРасширения + "_архив" + Файл.Расширение;
ПереместитьФайл(Файл.ПолноеИмя, НовоеИмя);
Обратите внимание на свойство Путь: оно уже содержит завершающий разделитель каталога, поэтому дополнительный слэш вставлять не нужно. Это частая причина ошибок «файл не найден» при ручной склейке строк.
Если новое имя должно включать дату или время, форматируйте её без запрещённых в файловых системах символов. Например, Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") даст безопасную строку без двоеточий и пробелов.
Как переименовать присоединённый файл в типовой конфигурации
В конфигурациях на Библиотеке стандартных подсистем (Управление торговлей, ERP, Бухгалтерия, ЗУП) файлы, прикреплённые к документам и справочникам, хранятся не как записи файловой системы, а как элементы справочника присоединённых файлов — например, «ПрисоединенныеФайлы» или специфичные для объекта, вроде «НоменклатураПрисоединенныеФайлы». Имя такого файла — это данные в базе, а не имя на диске.
Чтобы переименовать такой файл через интерфейс, откройте карточку объекта, к которому прикреплён файл, перейдите в список присоединённых файлов, откройте нужный файл и измените поле «Наименование» или «Имя файла» в его карточке. Сохраните изменения — физическое содержимое файла при этом не затрагивается, меняется только отображаемое имя.
Программный вариант — изменить реквизиты объекта справочника:
ФайлОбъект = СсылкаНаФайл.ПолучитьОбъект();
ФайлОбъект.Наименование = "Акт сверки январь";
ФайлОбъект.Записать();
При выгрузке такого файла на диск имя формируется из наименования и расширения, которые хранятся в отдельных реквизитах. Поэтому менять расширение следует через соответствующий реквизит, а не вписывая его в наименование вручную.
Переименование файла на сервере и в клиент-серверном режиме
В клиент-серверном варианте критично, где именно выполняется код. Если ПереместитьФайл вызывается в серверной процедуре, путь интерпретируется относительно сервера 1С — файл должен лежать на сервере или в доступной ему сетевой папке. Клиентский файл по локальному пути сервер не увидит.
Типовая схема работы с клиентским файлом такова: сначала файл помещается во временное хранилище (ПоместитьФайл / НачатьПомещениеФайла), на сервере записывается из хранилища во временный файл, обрабатывается, переименовывается при необходимости и возвращается клиенту. Пытаться переименовать клиентский файл напрямую из серверного кода — распространённая архитектурная ошибка.
Для файловых баз и тонкого клиента, работающего напрямую, такого разделения нет: код выполняется на машине пользователя, и пути локальные. Учитывайте это при переносе решения между режимами работы.
Как выбрать действие
Массовое переименование файлов из обработки
Для пакетного переименования сначала получите список файлов методом НайтиФайлы(Каталог, Маска), затем в цикле сформируйте новое имя и вызовите ПереместитьФайл для каждого элемента. Маска позволяет ограничить выборку, например только файлами *.xml.
НайденныеФайлы = НайтиФайлы("D:\Обмен\", "*.xml");
Счетчик = 1;
Для Каждого НайденныйФайл Из НайденныеФайлы Цикл
НовоеИмя = НайденныйФайл.Путь + "Партия_" + Счетчик + НайденныйФайл.Расширение;
ПереместитьФайл(НайденныйФайл.ПолноеИмя, НовоеИмя);
Счетчик = Счетчик + 1;
КонецЦикла;
При массовых операциях обязательно логируйте результат каждого переименования. Если цикл прервётся на середине из-за одного заблокированного файла, без журнала будет сложно понять, какие файлы уже обработаны, а какие нет.
Дополнительная защита — предварительный прогон без фактического переименования: сначала сформируйте и выведите таблицу «старое имя → новое имя», убедитесь в отсутствии дублей среди новых имён, и только потом выполняйте перемещение.
Как проверить результат переименования
После выполнения операции убедитесь, что файл действительно переименован, а не потерян. Минимальная проверка — создать объект Файл с новым именем и вызвать Существует(). Дополнительно стоит проверить, что по старому имени файла уже нет.
Для присоединённых файлов базы проверка проще: откройте карточку объекта и убедитесь, что файл отображается с новым именем и открывается без ошибок. Если файл при открытии сообщает о несоответствии формата — вероятно, при переименовании было повреждено или неправильно изменено расширение.
Как проверить результат
Файл.Существует() возвращает Истина
Метод возвращает Ложь — переименование не выполнилось
По старому пути файла нет
Файл остался — был выполнен не перенос, а копирование
Файл открывается, имя отображается новое
Ошибка «файл не найден» или неверный формат
Совпадает с фактическим форматом содержимого
Расширение изменено вручную — программы не открывают файл
Ограничения и когда переименование не сработает
Метод ПереместитьФайл не переименует файл, если тот занят другим процессом — открыт в Excel, заблокирован антивирусом или используется другим сеансом 1С. В этом случае единственное решение — дождаться освобождения файла или закрыть блокирующее приложение.
Не сработает переименование и при недостатке прав: у учётной записи, под которой работает сеанс (или сервер 1С), должны быть права на изменение в каталоге файла. Для сетевых папок проверяйте и сетевые, и NTFS-разрешения.
Наконец, переименование между разными дисками технически превращается в копирование с последующим удалением — на больших файлах это заметно дольше, чем переименование внутри одного тома. Учитывайте это при проектировании обменов.
Что важно запомнить
Файл на диске переименовывается методом ПереместитьФайл с тем же каталогом, но новым именем; присоединённый к объекту базы файл — через наименование в карточке или объекте справочника. Всегда проверяйте существование приёмника, права доступа и результат операции.
Частые вопросы
Есть ли в 1С отдельная команда «ПереименоватьФайл»?
Нет, во встроенном языке такой метод отсутствует. Переименование выполняется методом ПереместитьФайл: если источник и приёмник находятся в одном каталоге, файл фактически переименовывается без копирования содержимого.
Что произойдёт, если файл с новым именем уже существует?
Чаще всего ПереместитьФайл завершится ошибкой, исходный файл останется на месте. Чтобы гарантированно перезаписать приёмник, заранее проверьте его существование и удалите через УдалитьФайлы — но убедитесь, что старый файл действительно не нужен.
Как переименовать файл, прикреплённый к документу в 1С:Бухгалтерии?
Откройте документ, перейдите к списку присоединённых файлов, откройте карточку нужного файла и измените поле наименования. Содержимое файла при этом не меняется — меняется только имя, под которым он хранится и отображается в базе.
Почему ПереместитьФайл выдаёт ошибку «Файл не найден», хотя файл есть?
Типичные причины: код выполняется на сервере, а путь указан локальный с машины пользователя; путь склеен вручную с ошибкой в разделителе каталога; у учётной записи нет доступа к сетевой папке. Проверьте, где выполняется код, и существование файла через объект Файл перед операцией.
Можно ли изменить расширение файла переименованием?
Технически да — достаточно указать в приёмнике имя с другим расширением. Но содержимое файла при этом не конвертируется: переименованный из .xlsx в .xml файл не станет XML. Меняйте расширение, только если уверены в реальном формате содержимого.
Как безопасно переименовать много файлов сразу?
Получите список через НайтиФайлы, сформируйте таблицу соответствия старых и новых имён, проверьте её на дубли, затем выполняйте ПереместитьФайл в цикле с обработкой ошибок и журналированием каждой операции. Так при сбое будет видно, с какого места продолжить.