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