Разработка и Конфигурация · 11 мин
Как переименовать файл программно в 1С
Как программно переименовать файл в 1С:Предприятие 8.3: методы ПереместитьФайл, КопироватьФайл, работа с объектом Файл, обработка ошибок и примеры кода.
Встроенный язык 1С:Предприятие не содержит отдельного метода «ПереименоватьФайл», но задача решается штатными средствами: переименование — это частный случай перемещения файла с новым именем в тот же каталог. Для этого используется метод ПереместитьФайл, а в некоторых сценариях удобнее связка КопироватьФайл и УдалитьФайлы.
Программное переименование часто требуется при выгрузке отчётов и печатных форм, обмене с банками и ЭДО, архивировании обработанных файлов, приведении имён к шаблону вида «Организация_Дата_НомерДокумента». Ниже разобраны рабочие примеры кода, отличия тонкого клиента от сервера, типичные ошибки и способы проверить результат.
Примеры приведены для платформы 1С:Предприятие 8.3 и работают одинаково в файловом и клиент-серверном варианте, если учитывать, на какой стороне выполняется код. Все пути в примерах условные — подставьте реальные каталоги вашей системы.
Какой метод использовать для переименования
Основной инструмент — глобальный метод ПереместитьФайл(ИмяИсточника, ИмяПриемника). Он перемещает файл или каталог в новое место. Если приёмник находится в том же каталоге, но с другим именем, фактически происходит переименование. Метод доступен и на клиенте, и на сервере, но работает с файловой системой той стороны, где выполняется код.
Альтернатива — КопироватьФайл с последующим УдалитьФайлы по исходному пути. Такой вариант безопаснее, когда важно не потерять данные при сбое: сначала создаётся копия с новым именем, и только после успешной проверки удаляется оригинал. Минус — двойной расход дискового пространства на время операции и чуть больше кода.
Сравнение вариантов
Одна атомарная операция в пределах одного диска. Не подходит, если нужно сохранить исходный файл
Безопаснее при сбоях и обязателен при переносе между разными дисками с контролем результата, но требует больше места и кода
Асинхронный вариант для тонкого и веб-клиента, где синхронные вызовы ограничены
Базовый пример переименования через ПереместитьФайл
Минимальный рабочий код выглядит так: формируем полное старое и новое имя, вызываем метод. Если файл с новым именем уже существует, возникнет ошибка — её нужно обработать через попытку/исключение.
Процедура ПереименоватьФайлПример()
Каталог = "C:\Обмен\";
СтароеИмя = Каталог + "report_tmp.xml";
НовоеИмя = Каталог + "Отчет_Продажи.xml";
Попытка
ПереместитьФайл(СтароеИмя, НовоеИмя);
Исключение
Сообщить("Не удалось переименовать файл: "
+ ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
ПереместитьФайл("C:\Обмен\old.xml", "C:\Обмен\new.xml");Обратите внимание: расширение файла — часть имени. Если в новом имени забыть расширение, файл будет переименован, но система и пользователи могут не распознать его тип. Всегда формируйте новое имя целиком, включая расширение.
Проверка файла перед переименованием
Прежде чем переименовывать, убедитесь, что исходный файл существует и не является каталогом. Для этого служит объект Файл: он позволяет проверить существование, получить имя без расширения, расширение, размер и время изменения.
Файл = Новый Файл(СтароеИмя);
Если Не Файл.Существует() Тогда
Сообщить("Файл не найден: " + СтароеИмя);
Возврат;
КонецЕсли;
Если Файл.ЭтоКаталог() Тогда
Сообщить("Указан каталог, а не файл");
Возврат;
КонецЕсли;
Полезно также проверить, не существует ли уже файл с новым именем. Если существует — решите прикладную задачу: пропустить операцию, добавить суффикс с датой или порядковым номером, либо перезаписать (предварительно удалив старый файл).
Если Новый Файл(НовоеИмя).Существует() Тогда
НовоеИмя = Каталог + Файл.ИмяБезРасширения
+ "_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss")
+ Файл.Расширение;
КонецЕсли;
Формирование нового имени по шаблону
На практике новое имя чаще всего строится из данных документа или справочника. Используйте свойства объекта Файл: Путь — каталог без имени, ИмяБезРасширения, Расширение (включает точку). Это надёжнее, чем разбор строки вручную.
Файл = Новый Файл(СтароеИмя);
НовоеИмя = Файл.Путь
+ "Реализация_" + НомерДокумента
+ "_от_" + Формат(ДатаДокумента, "ДФ=dd.MM.yyyy")
+ Файл.Расширение;
ПереместитьФайл(СтароеИмя, НовоеИмя);
Следите за недопустимыми символами. В Windows в имени файла запрещены \ / : * ? " < > |. Если в шаблон подставляются наименования контрагентов или номера документов, они почти наверняка содержат такие символы. Очистите строку заранее:
Функция ОчиститьИмяФайла(Знач Строка)
Запрещенные = "\/:*?""<>|";
Для Н = 1 По СтрДлина(Запрещенные) Цикл
Строка = СтрЗаменить(Строка, Сред(Запрещенные, Н, 1), "_");
КонецЦикла;
Возврат Строка;
КонецФункции
Клиент и сервер: где выполнять переименование
Ключевой момент, на котором спотыкаются чаще всего: ПереместитьФайл работает с файловой системой того компьютера, где исполняется код. Если файл лежит на компьютере пользователя, а код выполняется на сервере (директива &НаСервере), сервер попытается найти файл на своих дисках и завершится ошибкой.
Для работы с файлами пользователя выполняйте переименование на клиенте (&НаКлиенте). Если файл нужно обработать на сервере, сначала передайте его через ПоместитьФайл / временное хранилище, а после обработки верните обратно. В тонком и веб-клиенте синхронные файловые методы могут требовать расширения работы с файлами — либо используйте асинхронные аналоги НачатьПеремещениеФайла с описанием оповещения.
Как выбрать действие
Обработка ошибок и занятых файлов
Наиболее частая причина сбоя — файл открыт другим приложением. Например, Excel-файл занят, пока пользователь держит его открытым, и Windows не даст его переместить. В этом случае ПереместитьФайл вызовет исключение с описанием отказа в доступе.
Стратегии обработки: сообщить пользователю о необходимости закрыть файл и повторить; выполнить несколько попыток с паузой в фоновом задании; при массовой обработке — пропустить занятый файл, записав его в журнал ошибок, и продолжить с остальными. Не глушите исключение пустым блоком Исключение КонецПопытки — это скрывает реальные проблемы и усложняет сопровождение.
Массовое переименование файлов в каталоге
Для пакетной обработки получите список файлов через НайтиФайлы(Каталог, Маска) и пройдите по массиву в цикле. Пример: добавление префикса «арх_» всем XML-файлам каталога.
Найденные = НайтиФайлы("D:\Обмен\Входящие\", "*.xml");
Для Каждого ТекФайл Из Найденные Цикл
Если ТекФайл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
НовоеИмя = ТекФайл.Путь + "арх_" + ТекФайл.Имя;
Попытка
ПереместитьФайл(ТекФайл.ПолноеИмя, НовоеИмя);
Исключение
ЗаписьЖурналаРегистрации("Переименование файлов",
УровеньЖурналаРегистрации.Ошибка,,,
ТекФайл.ПолноеИмя + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
- 1Получите список файлов через НайтиФайлы с нужной маской
- 2Для каждого файла проверьте, что это не каталог и файл существует
- 3Сформируйте новое имя, очистив его от запрещённых символов
- 4Проверьте, что файл с новым именем ещё не существует
- 5Выполните ПереместитьФайл внутри попытки/исключения
- 6Запишите ошибки в журнал регистрации и проверьте результат по количеству обработанных файлов
После массовой операции сверьте количество файлов до и после: оно должно совпадать, измениться должны только имена. Расхождение — признак того, что часть файлов не обработана или, хуже, перезаписана.
Как проверить результат
Совпадает с количеством до операции
Файлов стало меньше — возможна перезапись одноимённых
Соответствуют шаблону, расширения сохранены
Файлы без расширения или с символами подчёркивания вместо букв
Нет ошибок за время операции
Записи об отказе в доступе — файлы заняты или нет прав
Ограничения и права доступа
Для успешного переименования у учётной записи, под которой выполняется код, должны быть права на изменение файла и запись в каталог. При серверном исполнении это учётная запись службы агента сервера 1С (по умолчанию — служебная учётная запись), у которой часто нет доступа к сетевым папкам пользователей. Настройте права на общий каталог или выполняйте операцию на клиенте.
Дополнительные ограничения: длина полного пути в Windows традиционно ограничена примерно 260 символами — глубокая вложенность плюс длинное новое имя может вызвать ошибку; файлы с атрибутом «только чтение» перед переименованием могут потребовать снятия атрибута через Файл.УстановитьТолькоЧтение(Ложь); в веб-клиенте прямой доступ к файловой системе ограничен браузером.
Что важно запомнить
Переименование в 1С — это ПереместитьФайл с новым именем в том же каталоге. Проверяйте существование исходника и приёмника, очищайте имя от запрещённых символов, выполняйте код на той стороне, где физически лежит файл, и обрабатывайте исключения с записью в журнал.
Частые вопросы
Есть ли в 1С метод «ПереименоватьФайл»?
Нет, отдельного метода нет. Переименование выполняется методом ПереместитьФайл, когда новый путь указывает на тот же каталог с другим именем файла. Тот же приём работает и для каталогов.
Как переименовать файл, если он занят другой программой?
Напрямую — никак: операционная система блокирует операцию. Закройте файл в стороннем приложении, повторите попытку позже или пропустите файл с записью ошибки в журнал. Программно «отнять» файл у другого процесса из 1С нельзя.
Как изменить только расширение файла?
Используйте тот же ПереместитьФайл: сформируйте новое имя из объекта Файл как Путь + ИмяБезРасширения + новое расширение с точкой. Учтите, что содержимое файла при этом не конвертируется — меняется только имя.
Работает ли ПереместитьФайл в веб-клиенте?
Синхронный вызов в веб-клиенте недоступен. Используйте асинхронный метод НачатьПеремещениеФайла с описанием оповещения о завершении, либо перенесите логику на сервер, если файл доступен с сервера.
Как переименовать файл на сетевом диске с сервера 1С?
Убедитесь, что учётная запись службы сервера 1С имеет права на этот сетевой ресурс, и используйте UNC-путь вида \\Сервер\ОбщаяПапка\файл. Подключённые у пользователя сетевые диски с буквами на сервере обычно недоступны.