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

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

Как скопировать файл в папку в 1С: рабочие способы и примеры

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

Копирование файлов — частая задача при доработке конфигураций 1С: выгрузка отчётов в сетевую папку, резервное сохранение выгрузок, обмен файлами между сервером и клиентом. Во встроенном языке 1С для этого есть несколько подходов, и выбор зависит от того, где выполняется код — на клиенте или на сервере, — и от того, нужно ли сохранить исходный файл.

Основной инструмент — функция КопироватьФайл(), которая создаёт копию файла по указанному пути. Альтернативы — ПереместитьФайл(), когда исходник больше не нужен, и чтение-запись через ДвоичныеДанные или ТекстовыйДокумент, когда требуется контроль над содержимым. Ниже разобраны все варианты с примерами, проверкой результата и типичными ошибками.

Функция КопироватьФайл — основной способ

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

Процедура СкопироватьФайлВПапку(ПутьИсточника, ПапкаНазначения)

ФайлИсточник = Новый Файл(ПутьИсточника);

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

Сообщить("Исходный файл не найден: " + ПутьИсточника);

Возврат;

КонецЕсли;

ПутьПриемника = ПапкаНазначения + "\" + ФайлИсточник.Имя;

Попытка

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

Сообщить("Файл скопирован: " + ПутьПриемника);

Исключение

Сообщить("Ошибка копирования: " + ОписаниеОшибки());

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

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

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

bsl
КопироватьФайл("C:\Выгрузки\отчет.xlsx", "D:\Архив\отчет.xlsx");

Подготовка: проверка файла и создание папки назначения

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

// Проверка и создание каталога назначения

Каталог = Новый Файл(ПапкаНазначения);

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

СоздатьКаталог(ПапкаНазначения);

КонецЕсли;

Функция СоздатьКаталог() создаёт всю цепочку вложенных папок, поэтому можно указывать путь вида D:\Архив\2026\Январь, даже если промежуточных каталогов ещё нет.

Порядок действий
  1. 1
    Проверьте существование исходного файла через Новый Файл() и метод Существует()
  2. 2
    Проверьте или создайте папку назначения функцией СоздатьКаталог()
  3. 3
    Сформируйте полный путь приёмника с именем файла
  4. 4
    Вызовите КопироватьФайл() внутри блока Попытка...Исключение
  5. 5
    Проверьте результат: файл появился в папке назначения и открывается

Копирование на сервере и на клиенте: в чём разница

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

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

// Клиентская часть: помещаем файл во временное хранилище

НачатьПомещениеФайла(

Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),

,

ПутьКФайлу,

Ложь,

УникальныйИдентификатор);

// Серверная часть: сохраняем из хранилища в папку

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ДвоичныеДанные.Записать(ПутьНазначения);

Альтернативные способы копирования

Функция КопироватьФайл() подходит не всегда. В зависимости от задачи удобнее другие механизмы.

ПереместитьФайл — когда исходник не нужен

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

Копирование содержимого целой папки

Для копирования всех файлов каталога применяется обход через НайтиФайлы() с последующим копированием каждого файла по отдельности:

МассивФайлов = НайтиФайлы(ПапкаИсточник, ".", Ложь);

Для Каждого Файл Из МассивФайлов Цикл

Если Файл.ЭтоФайл() Тогда

КопироватьФайл(Файл.ПолноеИмя,

ПапкаНазначения + "\" + Файл.Имя);

КонецЕсли;

КонецЦикла;

Чтение и запись содержимого

Когда нужно контролировать содержимое (например, изменить кодировку текстового файла при копировании), файл читается через ТекстовыйДокумент или ДвоичныеДанные и записывается в новое место. Для бинарных файлов без изменений этот способ избыточен, но для текстовых даёт полный контроль.

Сравнение вариантов

КопироватьФайл()

Стандартное копирование с сохранением исходника. Подходит для большинства задач, не создаёт папку назначения автоматически.

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

Перенос без сохранения исходника. Быстрее, но исходный файл исчезает — рискованно при ошибке в середине обмена.

ДвоичныеДанные + Записать()

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

ТекстовыйДокумент

Копирование текстовых файлов с возможностью смены кодировки и обработки содержимого. Не подходит для бинарных файлов.

Проверка результата копирования

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

Минимальная проверка — убедиться, что файл-приёмник существует и его размер совпадает с исходным:

ФайлПриемник = Новый Файл(ПутьПриемника);

Если ФайлПриемник.Существует()

И ФайлПриемник.Размер() = ФайлИсточник.Размер() Тогда

// Копирование выполнено успешно

КонецЕсли;

Для критичных обменов дополнительно полезно попробовать открыть скопированный файл (например, загрузить табличный документ или прочитать первые байты), чтобы убедиться в его целостности.

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

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

Файл в папке назначения
Норма

Файл существует, имя и расширение совпадают с ожидаемыми

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

Файла нет или имя обрезано — проверьте путь и права доступа

Размер файла
Норма

Размер приёмника равен размеру источника

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

Размер меньше — копирование прервано, повторите операцию

Открытие файла
Норма

Файл открывается штатным способом без ошибок

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

Ошибка чтения или повреждённый формат — файл скопирован не полностью

Типичные ошибки и ограничения

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

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

Третья типичная ситуация — файл занят другим процессом (открыт в Excel, заблокирован антивирусом или другим сеансом 1С). В этом случае копирование завершится ошибкой доступа. Решение — повторная попытка с задержкой или копирование в момент, когда файл гарантированно свободен.

Типичные ошибки
01
Использование клиентского пути в серверном коде — файл ищется на диске сервера и не находится
02
Отсутствие создания папки назначения — КопироватьФайл завершается ошибкой, если каталога нет
03
Сетевой диск вместо UNC-пути — буква диска недоступна серверному процессу 1С
04
Копирование без блока Попытка-Исключение — необработанная ошибка прерывает всю обработку
05
Игнорирование занятости файла — попытка скопировать открытый другой программой файл даёт ошибку доступа

FAQ

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

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

Почему КопироватьФайл работает в файловой базе, но не работает на сервере?

Потому что в клиент-серверном режиме серверный код обращается к файловой системе сервера, а не компьютера пользователя. Путь C:\Документы на сервере ведёт на диск сервера. Передавайте файл через временное хранилище (НачатьПомещениеФайла на клиенте, ПолучитьИзВременногоХранилища на сервере).

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

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

Можно ли скопировать сразу всю папку с подпапками?

Одной функцией — нет. Нужно рекурсивно обойти каталог через НайтиФайлы(Путь, "*", Истина), для каждого подкаталога создать соответствующий каталог в назначении через СоздатьКаталог(), а файлы копировать по одному функцией КопироватьФайл().

Что делать, если файл занят другим процессом?

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

Чем отличается КопироватьФайл от ПереместитьФайл?

КопироватьФайл создаёт копию, исходный файл остаётся на месте. ПереместитьФайл переносит файл, исходник исчезает. Для важных данных безопаснее схема «скопировать — проверить — удалить исходник», чем прямое перемещение, особенно по сети.

Итог

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

Основной инструмент копирования в 1С — функция КопироватьФайл с полными путями источника и приёмника. Проверяйте существование исходника, создавайте папку назначения, учитывайте контекст выполнения (клиент или сервер) и подтверждайте результат сравнением размера файлов. Для сетевых путей используйте UNC-адреса, а перенос важных данных выполняйте через копирование с последующим удалением.