Разработка и Конфигурация · 10 мин
Как скопировать файл в другую папку в 1С
Как скопировать файл в другую папку в 1С: функция КопироватьФайл, проверка существования, обработка ошибок, работа на клиенте и сервере, примеры кода.
Копирование файлов — частая задача при доработке конфигураций 1С: выгрузка отчётов в сетевую папку, сохранение архивов обмена, резервное копирование выгрузок, перенос вложений. Во встроенном языке для этого есть готовая функция КопироватьФайл(), но на практике недостаточно просто её вызвать — нужно проверить существование файла-источника, убедиться, что целевая папка доступна, и корректно обработать ошибки прав доступа.
Материал ориентирован на разработчиков и администраторов 1С, которые пишут обработки, регламентные задания или внешние печатные формы. Примеры приведены для управляемых форм (тонкий клиент, веб-клиент) и обычного приложения, с пояснением различий между выполнением кода на клиенте и на сервере.
Важный нюанс: пути в коде воспринимаются относительно того контекста, где выполняется код. Если процедура работает на сервере, путь C:\ — это диск сервера 1С, а не компьютера пользователя. Эта ошибка — самая частая причина «не работающего» копирования, поэтому ей уделён отдельный раздел.
Базовый синтаксис функции КопироватьФайл
Функция имеет два обязательных параметра: полное имя файла-источника и полное имя файла-приёмника. Имена указываются с расширением; если целевой файл уже существует, он перезаписывается без предупреждения.
КопироватьФайл("C:\Обмен\выгрузка.xml", "D:\Архив\выгрузка.xml");
Если нужно скопировать файл под другим именем или с добавлением даты в имя, сформируйте имя приёмника программно:
ИмяПриемника = "D:\Архив\выгрузка_" + Формат(ТекущаяДатаСеанса(), "ДФ=ггггММдд_ЧЧммсс") + ".xml";
КопироватьФайл("C:\Обмен\выгрузка.xml", ИмяПриемника);
Функция не возвращает значения: об успехе или неудаче судят по отсутствию исключения. Поэтому без блока Попытка/Исключение сбой (нет файла, нет прав, папка недоступна) прервёт выполнение всей процедуры с неинформативной для пользователя ошибкой.
Проверка файла и папки перед копированием
Перед копированием убедитесь, что источник существует. Удобнее всего использовать объект Файл:
ФайлИсточник = Новый Файл("C:\Обмен\выгрузка.xml");
Если Не ФайлИсточник.Существует() Тогда
Сообщить("Файл-источник не найден: " + ФайлИсточник.ПолноеИмя);
Возврат;
КонецЕсли;
Целевая папка тоже должна существовать — КопироватьФайл не создаёт промежуточные каталоги. Если папки нет, создайте её:
КаталогПриемник = Новый Файл("D:\Архив");
Если Не КаталогПриемник.Существует() Тогда
СоздатьКаталог("D:\Архив");
КонецЕсли;
Метод СоздатьКаталог() создаёт всю цепочку вложенных папок сразу, поэтому подходит и для путей вида D:\Архив\Обмен\Выгрузки.
- 1Сформируйте полные пути источника и приёмника с расширениями файлов
- 2Проверьте существование файла-источника через объект Файл
- 3Проверьте или создайте целевую папку через СоздатьКаталог
- 4Вызовите КопироватьФайл внутри блока Попытка/Исключение
- 5Проверьте результат: файл появился в приёмнике, размер совпадает с источником
Обработка ошибок: Попытка/Исключение
Копирование может завершиться ошибкой по многим причинам: нет прав на запись, файл занят другим процессом, диск переполнен, сетевая папка недоступна. Оборачивайте вызов в исключение и выводите понятное сообщение:
Попытка
КопироватьФайл(ИмяИсточника, ИмяПриемника);
Сообщить("Файл скопирован: " + ИмяПриемника);
Исключение
Сообщить("Ошибка копирования: " + ОписаниеОшибки());
КонецПопытки;
В регламентных заданиях вместо Сообщить используйте ЗаписьЖурналаРегистрации, чтобы ошибку можно было найти администратору:
ЗаписьЖурналаРегистрации("Копирование файлов",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось скопировать " + ИмяИсточника + ": " + ОписаниеОшибки());
Клиент или сервер: где выполнять копирование
Ключевой вопрос — где физически находятся файлы. Если пользователь выбирает файл на своём компьютере и копирует его в другую локальную папку, код должен выполняться на клиенте (&НаКлиенте). Если файлы лежат на сервере 1С или в сетевой папке, доступной серверу, — на сервере (&НаСервере или &НаСервереБезКонтекста).
Типичная ошибка — вызывать копирование на сервере с путём C:\Users\Иванов\.... Сервер попытается найти этот путь на собственном диске, не найдёт и выдаст ошибку. Для передачи файла с клиента на сервер используют НачатьПомещениеФайла или временное хранилище, а не прямое копирование.
В веб-клиенте прямой доступ к файловой системе ограничен: работа с файлами возможна только через расширение работы с файлами и асинхронные методы (НачатьКопированиеФайла). Синхронный вызов КопироватьФайл в веб-клиенте без расширения завершится ошибкой.
// Асинхронный вариант для тонкого/веб-клиента
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеКопирования", ЭтотОбъект);
НачатьКопированиеФайла(ОписаниеОповещения, ИмяИсточника, ИмяПриемника);
Сравнение вариантов
Простой код, подходит для сервера и обычного приложения. В тонком/веб-клиенте может быть недоступен или вызовет модальное предупреждение.
Рекомендуемый способ для тонкого и веб-клиента. Требует описания оповещения и немного более сложной структуры кода.
Если исходный файл больше не нужен — перемещение выполняется быстрее копирования с последующим удалением.
Когда файл нужно передать с компьютера пользователя на сервер 1С, прямое копирование не работает — используется механизм помещения файлов.
Копирование нескольких файлов и папок
Функция КопироватьФайл работает и с маской: можно скопировать сразу группу файлов, например все XML из папки:
КопироватьФайл("C:\Обмен\*.xml", "D:\Архив\");
Если нужен контроль над каждым файлом (протоколирование, пропуск занятых файлов), перебирайте файлы через НайтиФайлы:
МассивФайлов = НайтиФайлы("C:\Обмен", "*.xml");
Для Каждого НайденныйФайл Из МассивФайлов Цикл
Попытка
КопироватьФайл(НайденныйФайл.ПолноеИмя, "D:\Архив\" + НайденныйФайл.Имя);
Исключение
ЗаписьЖурналаРегистрации("Копирование", УровеньЖурналаРегистрации.Предупреждение, , ,
"Пропущен файл " + НайденныйФайл.Имя + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Для копирования целой папки с вложенными каталогами встроенной одной команды нет — нужно рекурсивно обходить содержимое через НайтиФайлы(Путь, "*", Истина) и создавать структуру каталогов в приёмнике.
Проверка результата копирования
Отсутствие исключения — уже хороший признак, но для ответственных операций (архивы, обмены) стоит дополнительно убедиться, что копия на месте и не пустая:
ФайлКопия = Новый Файл(ИмяПриемника);
Если ФайлКопия.Существует() И ФайлКопия.Размер() > 0 Тогда
// копирование успешно
КонецЕсли;
При массовом копировании полезно сравнить количество файлов в источнике и приёмнике, а для критичных данных — размеры файлов. Совпадение размеров не гарантирует побайтовой идентичности, но на практике отсекает большинство проблем прерванной записи.
Как проверить результат
Файл виден в проводнике и через объект Файл в 1С
Файла нет — проверьте контекст выполнения (клиент/сервер) и права
Размер совпадает с исходным файлом
Размер 0 или меньше исходного — копирование прервано, файл занят или диск переполнен
Нет ошибок по событию копирования
Ошибки прав доступа или сети — проверьте учётную запись службы сервера 1С
FAQ
Чем копирование отличается от перемещения файла в 1С?
КопироватьФайл создаёт копию, исходный файл остаётся на месте. ПереместитьФайл переносит файл в новое место и удаляет из старого. Если исходный файл больше не нужен, перемещение предпочтительнее: оно быстрее и не требует отдельного удаления.
Почему КопироватьФайл выдаёт ошибку «Файл не обнаружен», хотя файл точно есть?
Чаще всего код выполняется на сервере, а путь указан для компьютера пользователя. Проверьте директиву компиляции процедуры (&НаСервере / &НаКлиенте) и убедитесь, что путь доступен именно с той машины, где исполняется код. Также проверьте раскладку: русская «С» в пути вместо латинской «C» — распространённая опечатка.
Как скопировать файл в сетевую папку?
Укажите UNC-путь вида \\Сервер\ОбщаяПапка\файл.txt. Учётная запись, под которой работает код (пользователь сеанса на клиенте или учётная запись службы агента сервера 1С на сервере), должна иметь права на запись в эту папку. Подключённые сетевые диски (Z:\) на сервере обычно недоступны — используйте UNC-пути.
Можно ли скопировать файл в веб-клиенте?
Да, но только через асинхронный метод НачатьКопированиеФайла и при установленном расширении работы с файлами в браузере. Синхронный КопироватьФайл в веб-клиенте без расширения завершится ошибкой. Проверить наличие расширения можно методом НачатьПодключениеРасширенияРаботыСФайлами.
Что будет, если целевой файл уже существует?
Он будет перезаписан без предупреждения. Если нужно сохранять предыдущие версии, формируйте уникальное имя приёмника, например добавляя дату и время, или предварительно проверяйте существование файла через объект Файл и запрашивайте подтверждение пользователя.
Как скопировать файл, если он занят другой программой?
Если файл открыт другим процессом с блокировкой, копирование завершится ошибкой. Варианты: повторить попытку позже (например, через цикл с паузой в фоновом задании), пропустить файл с записью в журнал или договориться о регламенте, когда файл гарантированно свободен. Принудительно снять чужую блокировку из 1С нельзя.
Что важно запомнить
Используйте КопироватьФайл с полными путями, предварительно проверяйте источник и создавайте целевую папку. Всегда оборачивайте вызов в Попытка/Исключение и помните про контекст выполнения: на сервере пути относятся к серверу, в веб-клиенте нужен асинхронный метод и расширение работы с файлами.