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