Разработка и Конфигурация · 10 мин
Как переместить файл в 1С программно
Как переместить файл в 1С программно: синтаксис ПереместитьФайл, примеры кода, обработка ошибок, работа на сервере и клиенте, типичные ошибки.
Встроенный язык 1С предоставляет несколько способов переместить файл из одного каталога в другой: метод ПереместитьФайл(), объект Файл с методом Переместить(), а также косвенный вариант через копирование и удаление. Выбор зависит от того, где выполняется код — на клиенте или на сервере, — нужна ли проверка результата и какая версия платформы используется.
Ключевой нюанс, о котором часто забывают: код, выполняемый на сервере, видит файловую систему сервера, а не компьютера пользователя. Если пользователь выбрал файл на своём диске C:, а обработка выполняется на сервере, прямой вызов ПереместитьФайл() по этому пути не сработает. Поэтому перед написанием кода важно определить, где физически находится файл и где будет исполняться операция.
Ниже разобраны рабочие примеры кода, условия их применения, типичные ошибки и способы проверить, что перемещение действительно выполнено.
Метод ПереместитьФайл: синтаксис и базовый пример
Глобальный метод ПереместитьФайл() — основной инструмент. Он принимает два параметра: полное имя исходного файла и полное имя файла назначения. Если файл назначения уже существует, он будет перезаписан.
ИмяИсточника = "D:\Обмен\Заказы.xml";
ИмяПриемника = "D:\Архив\Заказы_обработан.xml";
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
При успешном выполнении файл исчезает из исходного каталога и появляется по новому пути. Если перемещение невозможно (файл не найден, нет прав, файл занят другим процессом), платформа вызывает исключение, которое следует обрабатывать через Попытка...Исключение.
Обратите внимание: метод работает и для перемещения между разными дисками, но в этом случае фактически выполняется копирование с последующим удалением, что занимает больше времени для больших файлов.
Перемещение через объект Файл
Альтернативный способ — объект Файл. Он удобен, когда перед перемещением нужно проверить свойства файла: существование, размер, атрибут «только чтение».
Файл = Новый Файл("D:\Обмен\Заказы.xml");
Если Файл.Существует() Тогда
Файл.Переместить("D:\Архив\Заказы_обработан.xml");
Иначе
Сообщить("Файл не найден: " + Файл.ПолноеИмя);
КонецЕсли;
Метод Переместить() объекта Файл по сути эквивалентен ПереместитьФайл(), но позволяет в одном месте выполнить предварительные проверки. После перемещения свойства объекта обновляются: ПолноеИмя будет указывать на новый путь.
Дополнительный плюс подхода — можно проверить атрибут «только чтение» через Файл.ПолучитьТолькоЧтение(). Такой файл переместить удастся не всегда, и лучше узнать об этом до попытки.
Клиент и сервер: где выполнять перемещение
В клиент-серверном режиме это самая частая причина «неработающего» кода. Правило простое: перемещать файл может только тот контекст, который имеет физический доступ к файловой системе, где лежит файл.
Если файл выбрал пользователь на своём компьютере, а обработка должна идти на сервере, сначала передайте файл на сервер — например, через помещение во временное хранилище (ПоместитьВоВременноеХранилище) или через НачатьПомещениеФайла. Затем на сервере сохраните данные во временный файл и работайте с ним.
&НаКлиенте
Процедура ПереместитьЛокальныйФайл(Команда)
ПереместитьФайл("C:\Документы\отчет.xlsx", "C:\Архив\отчет.xlsx");
КонецПроцедуры
В тонком и веб-клиенте доступ к файловой системе ограничен: для расширенных операций требуется расширение работы с файлами, а в веб-клиенте часть сценариев недоступна вовсе. Учитывайте это при проектировании обработок.
Где выполнять код
Обработка ошибок и проверка результата
Файловые операции — один из самых «хрупких» участков кода: файл может быть занят Excel, антивирусом, другим сеансом 1С или заблокирован правами доступа. Оборачивайте перемещение в попытку и фиксируйте причину отказа.
Попытка
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Перемещение файла",
УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
ВызватьИсключение "Не удалось переместить файл: " + ТекстОшибки;
КонецПопытки;
После перемещения полезно убедиться в результате: исходный файл отсутствует, а новый существует. Это особенно актуально для регламентных заданий, где никто не увидит сообщение об ошибке на экране.
Как проверить результат
Новый Файл(ИмяПриемника).Существует() возвращает Истина
Файла нет — перемещение не выполнено или путь указан неверно
Файл-источник не существует
Источник на месте — файл был скопирован, а не перемещён, или операция не выполнялась
Нет записей об ошибках файловых операций
Ошибки доступа, «файл занят другим процессом», «путь не найден»
Типичные ошибки при перемещении файлов
Первая группа ошибок связана с путями: относительные пути вместо абсолютных, отсутствующий каталог назначения, обратные и прямые слэши при переносе кода между Windows и Linux. В Linux-окружении пути чувствительны к регистру — /Data и /data это разные каталоги.
Вторая группа — права доступа. Сервер 1С работает под своей учётной записью (обычно USR1CV8), и у неё может не быть прав на сетевую папку, куда пользователь свободно пишет со своего компьютера. Проверяйте доступ именно от имени учётной записи сервера.
Третья группа — занятые файлы. Если файл открыт в другом приложении без совместного доступа, перемещение завершится ошибкой. В таких случаях помогает повторная попытка через паузу или перенос операции на время, когда файл гарантированно свободен.
Альтернативы: копирование с удалением и КомандаСистемы
Если нужен контроль на каждом шаге, перемещение можно разложить на два действия: КопироватьФайл() плюс УдалитьФайлы() после проверки, что копия создана корректно. Такой вариант безопаснее для важных данных: сначала убеждаетесь, что копия на месте и её размер совпадает с оригиналом, и только потом удаляете источник.
КопироватьФайл(ИмяИсточника, ИмяПриемника);
Копия = Новый Файл(ИмяПриемника);
Оригинал = Новый Файл(ИмяИсточника);
Если Копия.Существует() И Копия.Размер() = Оригинал.Размер() Тогда
УдалитьФайлы(ИмяИсточника);
КонецЕсли;
Метод КомандаСистемы() (или ЗапуститьПриложение) с вызовом move/robocopy/mv применяют редко — например, для перемещения очень больших файлов или каталогов целиком. Недостатки очевидны: зависимость от ОС, сложность диагностики ошибок, требования к правам. Используйте этот путь только когда штатных средств платформы недостаточно.
Сравнение способов
Самый простой и быстрый способ. Подходит для большинства задач, но перезаписывает существующий файл без предупреждения
Удобен, когда нужны предварительные проверки: существование, размер, атрибуты. Чуть больше кода
Максимальная безопасность: источник удаляется только после проверки копии. Две операции вместо одной, медленнее
Для больших файлов и каталогов, нестандартных сценариев. Требует прав, зависит от ОС, сложнее в отладке
FAQ
Можно ли переместить файл внутри транзакции 1С?
Файловые операции не участвуют в транзакциях базы данных: откат транзакции не вернёт перемещённый файл на место. Если файл связан с записью в базе, сначала выполняйте файловую операцию, а запись в базу делайте после её успешного завершения.
Как переместить сразу несколько файлов?
Штатного метода пакетного перемещения нет. Используйте НайтиФайлы() для получения массива файлов по маске и перемещайте каждый в цикле, оборачивая каждую итерацию в попытку — тогда ошибка одного файла не прервёт обработку остальных.
Почему ПереместитьФайл выдаёт ошибку «файл занят другим процессом»?
Файл открыт другим приложением или сеансом без разрешения совместного доступа: Excel, антивирусная проверка, другой сеанс 1С. Закройте файл в сторонней программе или реализуйте повторную попытку с паузой в несколько секунд.
Работает ли ПереместитьФайл в тонком и веб-клиенте?
В тонком клиенте — да, в клиентском контексте. В веб-клиенте прямой доступ к файловой системе ограничен; для файловых операций требуется расширение работы с файлами, и даже с ним часть сценариев недоступна. Надёжнее выполнять такие операции на сервере.
Как переместить файл на сетевой диск?
Укажите UNC-путь вида \\Сервер\ОбщаяПапка\файл. Критично, чтобы учётная запись, под которой выполняется код (для сервера 1С — обычно USR1CV8), имела права на запись в этот сетевой ресурс. Буквы подключённых дисков (Z:) на сервере часто недоступны, поэтому предпочтительны UNC-пути.
Что произойдёт, если файл с таким именем уже есть в папке назначения?
Существующий файл будет перезаписан без предупреждения. Если потеря старого файла недопустима, перед перемещением проверяйте существование приёмника через объект Файл и формируйте уникальное имя, например с датой и временем.
Что важно запомнить
Основной инструмент — ПереместитьФайл(Источник, Приемник) или метод Переместить() объекта Файл. Выполняйте код в том контексте, где доступен файл, создавайте каталог назначения заранее, обрабатывайте исключения и проверяйте результат. Для важных данных используйте связку «копирование → проверка → удаление источника».