К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как переименовать файл программно в 1С

Как программно переименовать файл в 1С:Предприятие 8.3: методы ПереместитьФайл, КопироватьФайл, работа с объектом Файл, обработка ошибок и примеры кода.

Встроенный язык 1С:Предприятие не содержит отдельного метода «ПереименоватьФайл», но задача решается штатными средствами: переименование — это частный случай перемещения файла с новым именем в тот же каталог. Для этого используется метод ПереместитьФайл, а в некоторых сценариях удобнее связка КопироватьФайл и УдалитьФайлы.

Программное переименование часто требуется при выгрузке отчётов и печатных форм, обмене с банками и ЭДО, архивировании обработанных файлов, приведении имён к шаблону вида «Организация_Дата_НомерДокумента». Ниже разобраны рабочие примеры кода, отличия тонкого клиента от сервера, типичные ошибки и способы проверить результат.

Примеры приведены для платформы 1С:Предприятие 8.3 и работают одинаково в файловом и клиент-серверном варианте, если учитывать, на какой стороне выполняется код. Все пути в примерах условные — подставьте реальные каталоги вашей системы.

Какой метод использовать для переименования

Основной инструмент — глобальный метод ПереместитьФайл(ИмяИсточника, ИмяПриемника). Он перемещает файл или каталог в новое место. Если приёмник находится в том же каталоге, но с другим именем, фактически происходит переименование. Метод доступен и на клиенте, и на сервере, но работает с файловой системой той стороны, где выполняется код.

Альтернатива — КопироватьФайл с последующим УдалитьФайлы по исходному пути. Такой вариант безопаснее, когда важно не потерять данные при сбое: сначала создаётся копия с новым именем, и только после успешной проверки удаляется оригинал. Минус — двойной расход дискового пространства на время операции и чуть больше кода.

Сравнение вариантов

ПереместитьФайл

Одна атомарная операция в пределах одного диска. Не подходит, если нужно сохранить исходный файл

КопироватьФайл + УдалитьФайлы

Безопаснее при сбоях и обязателен при переносе между разными дисками с контролем результата, но требует больше места и кода

НачатьПеремещениеФайла

Асинхронный вариант для тонкого и веб-клиента, где синхронные вызовы ограничены

Базовый пример переименования через ПереместитьФайл

Минимальный рабочий код выглядит так: формируем полное старое и новое имя, вызываем метод. Если файл с новым именем уже существует, возникнет ошибка — её нужно обработать через попытку/исключение.

Процедура ПереименоватьФайлПример()

Каталог = "C:\Обмен\";

СтароеИмя = Каталог + "report_tmp.xml";

НовоеИмя = Каталог + "Отчет_Продажи.xml";

Попытка

ПереместитьФайл(СтароеИмя, НовоеИмя);

Исключение

Сообщить("Не удалось переименовать файл: "

+ ОписаниеОшибки());

КонецПопытки;

КонецПроцедуры

bsl
ПереместитьФайл("C:\Обмен\old.xml", "C:\Обмен\new.xml");

Обратите внимание: расширение файла — часть имени. Если в новом имени забыть расширение, файл будет переименован, но система и пользователи могут не распознать его тип. Всегда формируйте новое имя целиком, включая расширение.

Проверка файла перед переименованием

Прежде чем переименовывать, убедитесь, что исходный файл существует и не является каталогом. Для этого служит объект Файл: он позволяет проверить существование, получить имя без расширения, расширение, размер и время изменения.

Файл = Новый Файл(СтароеИмя);

Если Не Файл.Существует() Тогда

Сообщить("Файл не найден: " + СтароеИмя);

Возврат;

КонецЕсли;

Если Файл.ЭтоКаталог() Тогда

Сообщить("Указан каталог, а не файл");

Возврат;

КонецЕсли;

Полезно также проверить, не существует ли уже файл с новым именем. Если существует — решите прикладную задачу: пропустить операцию, добавить суффикс с датой или порядковым номером, либо перезаписать (предварительно удалив старый файл).

Если Новый Файл(НовоеИмя).Существует() Тогда

НовоеИмя = Каталог + Файл.ИмяБезРасширения

+ "_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss")

+ Файл.Расширение;

КонецЕсли;

Формирование нового имени по шаблону

На практике новое имя чаще всего строится из данных документа или справочника. Используйте свойства объекта Файл: Путь — каталог без имени, ИмяБезРасширения, Расширение (включает точку). Это надёжнее, чем разбор строки вручную.

Файл = Новый Файл(СтароеИмя);

НовоеИмя = Файл.Путь

+ "Реализация_" + НомерДокумента

+ "_от_" + Формат(ДатаДокумента, "ДФ=dd.MM.yyyy")

+ Файл.Расширение;

ПереместитьФайл(СтароеИмя, НовоеИмя);

Следите за недопустимыми символами. В Windows в имени файла запрещены \ / : * ? " < > |. Если в шаблон подставляются наименования контрагентов или номера документов, они почти наверняка содержат такие символы. Очистите строку заранее:

Функция ОчиститьИмяФайла(Знач Строка)

Запрещенные = "\/:*?""<>|";

Для Н = 1 По СтрДлина(Запрещенные) Цикл

Строка = СтрЗаменить(Строка, Сред(Запрещенные, Н, 1), "_");

КонецЦикла;

Возврат Строка;

КонецФункции

Типичные ошибки
01
Подстановка номера документа с дробью или наименования контрагента с кавычками без очистки — ошибка доступа к файлу
02
Потеря расширения при формировании нового имени — файл не открывается ассоциированной программой
03
Переименование без проверки существования приёмника — исключение или непреднамеренная перезапись
04
Выполнение кода на сервере с путём клиентского диска C:\ — файл ищется на сервере и не находится

Клиент и сервер: где выполнять переименование

Ключевой момент, на котором спотыкаются чаще всего: ПереместитьФайл работает с файловой системой того компьютера, где исполняется код. Если файл лежит на компьютере пользователя, а код выполняется на сервере (директива &НаСервере), сервер попытается найти файл на своих дисках и завершится ошибкой.

Для работы с файлами пользователя выполняйте переименование на клиенте (&НаКлиенте). Если файл нужно обработать на сервере, сначала передайте его через ПоместитьФайл / временное хранилище, а после обработки верните обратно. В тонком и веб-клиенте синхронные файловые методы могут требовать расширения работы с файлами — либо используйте асинхронные аналоги НачатьПеремещениеФайла с описанием оповещения.

Маршрут решения

Как выбрать действие

Файл находится на компьютере пользователяВыполняйте переименование в клиентской процедуре или используйте НачатьПеремещениеФайла
Файл в сетевом каталоге, доступном серверу 1СМожно переименовывать на сервере, проверив права учётной записи службы сервера 1С
Код работает в веб-клиентеИспользуйте только асинхронные методы с оповещениями, синхронные вызовы недоступны

Обработка ошибок и занятых файлов

Наиболее частая причина сбоя — файл открыт другим приложением. Например, Excel-файл занят, пока пользователь держит его открытым, и Windows не даст его переместить. В этом случае ПереместитьФайл вызовет исключение с описанием отказа в доступе.

Стратегии обработки: сообщить пользователю о необходимости закрыть файл и повторить; выполнить несколько попыток с паузой в фоновом задании; при массовой обработке — пропустить занятый файл, записав его в журнал ошибок, и продолжить с остальными. Не глушите исключение пустым блоком Исключение КонецПопытки — это скрывает реальные проблемы и усложняет сопровождение.

Массовое переименование файлов в каталоге

Для пакетной обработки получите список файлов через НайтиФайлы(Каталог, Маска) и пройдите по массиву в цикле. Пример: добавление префикса «арх_» всем XML-файлам каталога.

Найденные = НайтиФайлы("D:\Обмен\Входящие\", "*.xml");

Для Каждого ТекФайл Из Найденные Цикл

Если ТекФайл.ЭтоКаталог() Тогда

Продолжить;

КонецЕсли;

НовоеИмя = ТекФайл.Путь + "арх_" + ТекФайл.Имя;

Попытка

ПереместитьФайл(ТекФайл.ПолноеИмя, НовоеИмя);

Исключение

ЗаписьЖурналаРегистрации("Переименование файлов",

УровеньЖурналаРегистрации.Ошибка,,,

ТекФайл.ПолноеИмя + ": " + ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Порядок действий
  1. 1
    Получите список файлов через НайтиФайлы с нужной маской
  2. 2
    Для каждого файла проверьте, что это не каталог и файл существует
  3. 3
    Сформируйте новое имя, очистив его от запрещённых символов
  4. 4
    Проверьте, что файл с новым именем ещё не существует
  5. 5
    Выполните ПереместитьФайл внутри попытки/исключения
  6. 6
    Запишите ошибки в журнал регистрации и проверьте результат по количеству обработанных файлов

После массовой операции сверьте количество файлов до и после: оно должно совпадать, измениться должны только имена. Расхождение — признак того, что часть файлов не обработана или, хуже, перезаписана.

Контрольные точки

Как проверить результат

Количество файлов в каталоге
Норма

Совпадает с количеством до операции

Тревожный признак

Файлов стало меньше — возможна перезапись одноимённых

Новые имена
Норма

Соответствуют шаблону, расширения сохранены

Тревожный признак

Файлы без расширения или с символами подчёркивания вместо букв

Журнал регистрации
Норма

Нет ошибок за время операции

Тревожный признак

Записи об отказе в доступе — файлы заняты или нет прав

Ограничения и права доступа

Для успешного переименования у учётной записи, под которой выполняется код, должны быть права на изменение файла и запись в каталог. При серверном исполнении это учётная запись службы агента сервера 1С (по умолчанию — служебная учётная запись), у которой часто нет доступа к сетевым папкам пользователей. Настройте права на общий каталог или выполняйте операцию на клиенте.

Дополнительные ограничения: длина полного пути в Windows традиционно ограничена примерно 260 символами — глубокая вложенность плюс длинное новое имя может вызвать ошибку; файлы с атрибутом «только чтение» перед переименованием могут потребовать снятия атрибута через Файл.УстановитьТолькоЧтение(Ложь); в веб-клиенте прямой доступ к файловой системе ограничен браузером.

Итог

Что важно запомнить

Переименование в 1С — это ПереместитьФайл с новым именем в том же каталоге. Проверяйте существование исходника и приёмника, очищайте имя от запрещённых символов, выполняйте код на той стороне, где физически лежит файл, и обрабатывайте исключения с записью в журнал.

Частые вопросы

Есть ли в 1С метод «ПереименоватьФайл»?

Нет, отдельного метода нет. Переименование выполняется методом ПереместитьФайл, когда новый путь указывает на тот же каталог с другим именем файла. Тот же приём работает и для каталогов.

Как переименовать файл, если он занят другой программой?

Напрямую — никак: операционная система блокирует операцию. Закройте файл в стороннем приложении, повторите попытку позже или пропустите файл с записью ошибки в журнал. Программно «отнять» файл у другого процесса из 1С нельзя.

Как изменить только расширение файла?

Используйте тот же ПереместитьФайл: сформируйте новое имя из объекта Файл как Путь + ИмяБезРасширения + новое расширение с точкой. Учтите, что содержимое файла при этом не конвертируется — меняется только имя.

Работает ли ПереместитьФайл в веб-клиенте?

Синхронный вызов в веб-клиенте недоступен. Используйте асинхронный метод НачатьПеремещениеФайла с описанием оповещения о завершении, либо перенесите логику на сервер, если файл доступен с сервера.

Как переименовать файл на сетевом диске с сервера 1С?

Убедитесь, что учётная запись службы сервера 1С имеет права на этот сетевой ресурс, и используйте UNC-путь вида \\Сервер\ОбщаяПапка\файл. Подключённые у пользователя сетевые диски с буквами на сервере обычно недоступны.