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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача изменить имя файла. Это может быть связано с требованиями внешних систем, необходимостью архивации или, как в случае автора темы, с обходом ограничений на длину имени файла (например, для DBF). В 1С не существует функции с названием "ПереименоватьФайл", однако платформа предоставляет несколько надежных механизмов для выполнения этой операции. Рассмотрим их подробно, разберем по шагам логику работы и проанализируем возможные ошибки.

Метод 1: Использование встроенной функции ПереместитьФайл

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

Разберем пример кода, предложенный участниками форума:


// Определяем исходный путь и новый путь с другим именем
ПутьКФайлу = "C:\Exchange\";
СтароеИмя = ПутьКФайлу + "temp.dbf";
НовоеИмя = ПутьКФайлу + "ScheduleInfo_2023_Data.dbf";

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

Важные моменты при использовании этого метода:

  1. Процедура ПереместитьФайл не возвращает значение. Если файл не найден или доступ к нему заблокирован, 1С вызовет исключение.
  2. Если файл с новым именем уже существует в целевой папке, система выдаст ошибку. Поэтому перед выполнением операции рекомендуется проверить наличие файла-приемника.
  3. Если вы работаете в клиент-серверном варианте, помните, где именно должен выполниться код: на клиенте или на сервере (вам может помочь обработка для копирования файлов между Клиентом и Сервером). Права доступа у пользователя и у службы сервера 1С могут отличаться.

Метод 2: Работа с двоичными данными

В сообщениях форума упоминался способ переименования через чтение и запись текстового документа. Однако, как справедливо заметили участники, для бинарных файлов (таких как .dbf, .jpg, .pdf) этот способ губителен, так как он может повредить структуру файла при неверной кодировке. Если по каким-то причинам стандартное перемещение не подходит, правильнее использовать объект ДвоичныеДанные.

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


ПутьИсходный = "C:\Data\old_name.bin";
ПутьНовый = "C:\Data\new_name.bin";

// Читаем данные
Данные = Новый ДвоичныеДанные(ПутьИсходный);

// Записываем под новым именем
Данные.Записать(ПутьНовый);

// Удаляем старый файл
УдалитьФайлы(ПутьИсходный);

Этот метод более ресурсозатратный, так как файл фактически копируется целиком, что при больших объемах (гигабайты данных) может привести к замедлению работы системы и нехватке оперативной памяти.

Метод 3: Использование системных команд (CMD)

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

Для Windows команда будет выглядеть так:


// Обратите внимание на кавычки, если в путях есть пробелы
ИмяСтарое = "C:\My Files\file1.txt";
ИмяНовое = "file2.txt"; // В команде REN второе имя указывается без пути
КомандаСистемы("ren """ + ИмяСтарое + """ """ + ИмяНовое + """");

Нюансы системных команд:

Метод 4: COM-объекты (Shell.Application и FSO)

Для продвинутых задач автоматизации в Windows можно использовать объект Shell.Application или Scripting.FileSystemObject. Это позволяет работать с файловой системой через мощные инструменты Windows. Рассмотрим пример переименования через Shell, предложенный в одном из сообщений:


Shell = Новый COMОбъект("Shell.Application");
Folder = Shell.NameSpace("C:\Папка\");
// Находим объект файла по имени
FolderItem = Folder.ParseName("СтароеИмя.txt");
// Меняем свойство Name — файл переименовывается мгновенно
FolderItem.Name = "НовоеИмя.txt";

Преимущество этого метода в том, что он работает очень быстро даже с огромными файлами, так как не происходит физического перемещения блоков данных на диске, а только меняется запись в таблице файловой системы (MFT).

Особенности переименования DBF-файлов

В теме поднимался вопрос об именах DBF более 8 символов. Выясним причину этого беспокойства (пригодится инструмент для просмотра файлов в формате DBF). Исторически формат DBF ассоциируется с эпохой DOS, где действовало ограничение "8.3" (8 символов на имя и 3 на расширение).

Важно знать:

  1. Современная платформа 1С 8.3 и объект XBase отлично работают с длинными именами файлов.
  2. Ограничение в 8 символов в самом формате DBF касается только названий колонок (полей) внутри таблицы, но не самого имени файла на диске.
  3. Если ваша 1С выдает ошибку при работе с длинным именем DBF, убедитесь, что файл не открыт в другой программе или самой 1С (всегда вызывайте XBase.ЗакрытьФайл() перед манипуляциями).

Метод 5: Работа с временными файлами и шаблонами строк

Часто переименование требуется при формировании печатных форм. Проанализируем современный подход с использованием функции СтрШаблон, которая делает код чище и понятнее:


// Формируем красивое имя файла на основе данных документа
ИмяФайла = СтрШаблон("Уведомление_%1_от_%2.xls", Объект.Номер, Формат(Объект.Дата, "ДФ=yyyyMMdd"));
ПолныйПуть = КаталогВременныхФайлов() + ИмяФайла;

// Сразу записываем файл с нужным именем, избегая лишнего переименования
ТабличныйДокумент.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.XLS);

Использование СтрШаблон (доступно в 8.3.6+) позволяет избежать громоздких конструкций со сложением строк и делает код более читаемым.

Безопасное переименование: Обработка исключений

Посмотрим на пример правильной обработки ошибок. При работе с файловой системой всегда что-то может пойти не так (нет прав, файл занят, диск переполнен). Рассмотрим шаблон "безопасного" переименования:


СтарыйФайл = "C:\temp\report.pdf";
НовыйФайл = "C:\reports\final_report.pdf";

ФайлПроверка = Новый Файл(СтарыйФайл);
Если ФайлПроверка.Существует() Тогда
    Попытка
        ПереместитьФайл(СтарыйФайл, НовыйФайл);
        Сообщить("Файл успешно переименован!");
    Исключение
        ЗаписьЖурналаРегистрации("Файловые операции", УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось переименовать файл: " + ОписаниеОшибки());
        Предупреждение("Ошибка доступа к файлу. Возможно, он открыт в другой программе.");
    КонецПопытки;
Иначе
    Сообщить("Исходный файл не найден!");
КонецЕсли;

Подведем итог: для большинства задач в 1С достаточно использовать ПереместитьФайл. Если вы работаете в Windows и вам нужна высокая производительность при массовом переименовании, можно обратить внимание на COM-объекты. А при формировании новых файлов лучше сразу задавать им корректное имя, используя СтрШаблон и КаталогВременныхФайлов.

← На главную