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

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

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

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

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

Проанализируем синтаксис функции:

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

Разберем по шагам, как правильно использовать этот метод для каталогов. Основная проблема, с которой сталкиваются программисты (как описано в сообщениях форума), — это ошибка «Неправильный путь к файлу». Чтобы ее избежать, важно соблюдать два правила:

  1. Отсутствие завершающего слеша: В конце пути не должно быть символов «\» или «/». Путь должен заканчиваться именно названием папки.
  2. Существование родительской директории: Путь, в который вы перемещаете папку, должен существовать (за исключением самой переименовываемой папки).

Посмотрим на правильный пример кода:


СтароеИмя = "C:\Temp\OldFolderName";
НовоеИмя = "C:\Temp\NewFolderName";

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

Метод 2: Использование COM-объекта Scripting.FileSystemObject (Windows)

Если по каким-то причинам встроенный метод платформы не подходит (например, в старых версиях 1С или при специфических требованиях окружения), в среде Windows можно воспользоваться мощностями системного компонента Scripting.FileSystemObject. Рассмотрим два варианта работы с этим объектом.

Вариант А: Изменение свойства Name

Этот способ позволяет переименовать папку, обратившись к ней как к объекту. Здесь кроется важная деталь, упомянутая в обсуждении: при установке нового имени нужно указывать только само название, а не полный путь.


// Путь к папке
ПутьКПапке = "C:\MyData\OldName";
НовоеИмяСтринг = "NewName"; // Только имя!

fso = Новый COMОбъект("Scripting.FileSystemObject");
Если fso.FolderExists(ПутьКПапке) Тогда
    Folder = fso.GetFolder(ПутьКПапке);
    Попытка
        Folder.Name = НовоеИмяСтринг;
    Исключение
        Сообщить("Не удалось переименовать: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Вариант Б: Метод MoveFolder

Метод MoveFolder более прямолинеен и принимает полные пути к источнику и приемнику.


СтарыйПуть = "D:\Project\Data";
НовыйПуть = "D:\Project\Data_Backup";

fso = Новый COMОбъект("Scripting.FileSystemObject");
Попытка
    fso.MoveFolder(СтарыйПуть, НовыйПуть);
Исключение
    Сообщить("Произошла ошибка при перемещении/переименовании");
КонецПопытки;

Метод 3: Командная строка операционной системы

Выясним, как решить задачу через системные команды. Этот метод часто называют «костылем», но он бывает незаменим, когда нужно выполнить операцию с правами администратора или обойти ограничения прав внутри 1С через выполнение команды от имени системы.

Для Windows используется команда move или ren (rename). Проанализируем пример использования:


Команда = "cmd /c move ""D:\Test\Old"" ""D:\Test\New""";
КомандаСистемы(Команда);

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

Кроссплатформенность: Работа в Linux

В современных реалиях 1С часто работает на серверах под управлением Linux. COM-объекты там недоступны, поэтому мы должны использовать либо универсальный метод ПереместитьФайл, либо системные вызовы Linux. В Linux для переименования используется команда mv.

Пример для Linux через КомандаСистемы:


СтарыйПуть = "/home/user/data_old";
НовыйПуть = "/home/user/data_new";
КомандаСистемы("mv " + СтарыйПуть + " " + НовыйПуть);

Помните, что в Linux регистр символов имеет значение: /Data и /data — это разные каталоги.

Асинхронная работа в веб-клиенте

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

Рассмотрим структуру вызова:


ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершитьПереименование", ЭтотОбъект);
НачатьПеремещениеФайла(ОписаниеОповещения, "C:\Temp\Old", "C:\Temp\New");

Затем необходимо создать процедуру обратного вызова:


Процедура ЗавершитьПереименование(ДополнительныеПараметры) Экспорт
    Сообщить("Операция завершена");
КонецПроцедуры

Почему переименование может не работать?

Проанализируем основные причины неудач при программном переименовании:

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

← На главную