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

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

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

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

Встроенный язык 1С предоставляет несколько способов переместить файл из одного каталога в другой: метод ПереместитьФайл(), объект Файл с методом Переместить(), а также косвенный вариант через копирование и удаление. Выбор зависит от того, где выполняется код — на клиенте или на сервере, — нужна ли проверка результата и какая версия платформы используется.

Ключевой нюанс, о котором часто забывают: код, выполняемый на сервере, видит файловую систему сервера, а не компьютера пользователя. Если пользователь выбрал файл на своём диске C:, а обработка выполняется на сервере, прямой вызов ПереместитьФайл() по этому пути не сработает. Поэтому перед написанием кода важно определить, где физически находится файл и где будет исполняться операция.

Ниже разобраны рабочие примеры кода, условия их применения, типичные ошибки и способы проверить, что перемещение действительно выполнено.

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

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

ИмяИсточника = "D:\Обмен\Заказы.xml";

ИмяПриемника = "D:\Архив\Заказы_обработан.xml";

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

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

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

Перемещение через объект Файл

Альтернативный способ — объект Файл. Он удобен, когда перед перемещением нужно проверить свойства файла: существование, размер, атрибут «только чтение».

Файл = Новый Файл("D:\Обмен\Заказы.xml");

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

Файл.Переместить("D:\Архив\Заказы_обработан.xml");

Иначе

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

КонецЕсли;

Метод Переместить() объекта Файл по сути эквивалентен ПереместитьФайл(), но позволяет в одном месте выполнить предварительные проверки. После перемещения свойства объекта обновляются: ПолноеИмя будет указывать на новый путь.

Дополнительный плюс подхода — можно проверить атрибут «только чтение» через Файл.ПолучитьТолькоЧтение(). Такой файл переместить удастся не всегда, и лучше узнать об этом до попытки.

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

В клиент-серверном режиме это самая частая причина «неработающего» кода. Правило простое: перемещать файл может только тот контекст, который имеет физический доступ к файловой системе, где лежит файл.

Если файл выбрал пользователь на своём компьютере, а обработка должна идти на сервере, сначала передайте файл на сервер — например, через помещение во временное хранилище (ПоместитьВоВременноеХранилище) или через НачатьПомещениеФайла. Затем на сервере сохраните данные во временный файл и работайте с ним.

&НаКлиенте

Процедура ПереместитьЛокальныйФайл(Команда)

ПереместитьФайл("C:\Документы\отчет.xlsx", "C:\Архив\отчет.xlsx");

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

В тонком и веб-клиенте доступ к файловой системе ограничен: для расширенных операций требуется расширение работы с файлами, а в веб-клиенте часть сценариев недоступна вовсе. Учитывайте это при проектировании обработок.

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

Где выполнять код

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

Обработка ошибок и проверка результата

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

Попытка

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

Исключение

ТекстОшибки = ОписаниеОшибки();

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

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

ВызватьИсключение "Не удалось переместить файл: " + ТекстОшибки;

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

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

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

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

Существование файла по новому пути
Норма

Новый Файл(ИмяПриемника).Существует() возвращает Истина

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

Файла нет — перемещение не выполнено или путь указан неверно

Отсутствие файла по старому пути
Норма

Файл-источник не существует

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

Источник на месте — файл был скопирован, а не перемещён, или операция не выполнялась

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

Нет записей об ошибках файловых операций

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

Ошибки доступа, «файл занят другим процессом», «путь не найден»

Типичные ошибки при перемещении файлов

Первая группа ошибок связана с путями: относительные пути вместо абсолютных, отсутствующий каталог назначения, обратные и прямые слэши при переносе кода между Windows и Linux. В Linux-окружении пути чувствительны к регистру — /Data и /data это разные каталоги.

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

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

Типичные ошибки
01
Перемещение файла клиента в серверной процедуре — сервер не видит диск C: пользователя, код падает с ошибкой «файл не найден»
02
Отсутствие обработки исключений — при занятом файле обработка прерывается целиком, хотя можно было повторить попытку
03
Несуществующий каталог назначения — ПереместитьФайл не создаёт каталоги автоматически, нужен предварительный СоздатьКаталог()
04
Игнорирование регистра путей в Linux — код, работавший в Windows, перестаёт находить файлы после переноса базы
05
Перезапись существующего файла без проверки — старый файл в приёмнике молча заменяется новым, данные теряются

Альтернативы: копирование с удалением и КомандаСистемы

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

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

Копия = Новый Файл(ИмяПриемника);

Оригинал = Новый Файл(ИмяИсточника);

Если Копия.Существует() И Копия.Размер() = Оригинал.Размер() Тогда

УдалитьФайлы(ИмяИсточника);

КонецЕсли;

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

Сравнение способов

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

Самый простой и быстрый способ. Подходит для большинства задач, но перезаписывает существующий файл без предупреждения

Объект Файл + Переместить()

Удобен, когда нужны предварительные проверки: существование, размер, атрибуты. Чуть больше кода

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

Максимальная безопасность: источник удаляется только после проверки копии. Две операции вместо одной, медленнее

КомандаСистемы (move, robocopy)

Для больших файлов и каталогов, нестандартных сценариев. Требует прав, зависит от ОС, сложнее в отладке

FAQ

Можно ли переместить файл внутри транзакции 1С?

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

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

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

Почему ПереместитьФайл выдаёт ошибку «файл занят другим процессом»?

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

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

В тонком клиенте — да, в клиентском контексте. В веб-клиенте прямой доступ к файловой системе ограничен; для файловых операций требуется расширение работы с файлами, и даже с ним часть сценариев недоступна. Надёжнее выполнять такие операции на сервере.

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

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

Что произойдёт, если файл с таким именем уже есть в папке назначения?

Существующий файл будет перезаписан без предупреждения. Если потеря старого файла недопустима, перед перемещением проверяйте существование приёмника через объект Файл и формируйте уникальное имя, например с датой и временем.

Итог

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

Основной инструмент — ПереместитьФайл(Источник, Приемник) или метод Переместить() объекта Файл. Выполняйте код в том контексте, где доступен файл, создавайте каталог назначения заранее, обрабатывайте исключения и проверяйте результат. Для важных данных используйте связку «копирование → проверка → удаление источника».