Копирование файлов в 1С:Предприятии — код, выгрузка и автоматизация
Содержание
Скопировать файл из кода проще всего одной строкой — глобальной функцией КопироватьФайл(Источник, Приёмник). Она работает и на клиенте, и на сервере, перезаписывает приёмник без вопросов и не требует подключать библиотеки.
Выбор способа зависит от того, что именно вы копируете. Вложение или выгруженный отчёт — встроенный язык. Файл информационной базы целиком — выгрузка в .dt через Конфигуратор или копия файла базы. Отправить файл наружу — FTP. Делать это регулярно — регламентное задание или планировщик Windows. Ниже — каждый из вариантов с рабочим кодом и точными путями.
Функция КопироватьФайл: копируем из встроенного языка
Базовый инструмент — глобальная функция КопироватьФайл. Первый параметр — путь к исходному файлу, второй — путь к приёмнику:
КопироватьФайл("D:\Обмен\Накладная.pdf", "E:\Архив\Накладная.pdf");
Если файл-приёмник уже существует, он молча перезаписывается. Если нет каталога приёмника — будет ошибка, поэтому каталог создают заранее.
Перед копированием проверяйте, что источник на месте. Для этого есть объект Файл:
Источник = "D:\Обмен\Накладная.pdf";
Приёмник = "E:\Архив\Накладная.pdf";
ФайлИсточник = Новый Файл(Источник);
Если НЕ ФайлИсточник.Существует() Тогда
Сообщить("Исходный файл не найден: " + Источник);
Возврат;
КонецЕсли;
// создаём каталог приёмника, если его нет
КаталогПриёмника = Новый Файл("E:\Архив");
Если НЕ КаталогПриёмника.Существует() Тогда
СоздатьКаталог("E:\Архив");
КонецЕсли;
КопироватьФайл(Источник, Приёмник);
У объекта Файл пригодятся свойства: Существует(), Размер(), Имя, ПолноеИмя, Путь, Расширение. С их помощью удобно собрать имя приёмника из имени источника, не разбирая строку вручную.
Рядом живут родственные функции на тот случай, если копирование — часть более крупной операции:
- 📄
ПереместитьФайл(Источник, Приёмник)— перенести файл (копия + удаление оригинала); - 🗑️
УдалитьФайлы(Путь)илиУдалитьФайлы(Путь, Маска)— удалить файл или группу по маске; - 🔍
НайтиФайлы(Путь, "*.pdf")— получить массив объектовФайлпо маске; - 📁
СоздатьКаталог(Путь)— создать каталог , включая промежуточные.
Нужна временная копия для обработки — возьмите ПолучитьИмяВременногоФайла("pdf"). Функция вернёт уникальное имя в каталоге временных файлов, и коллизий по именам не будет.
Процедура с проверками для повторного использования
Чтобы не дублировать проверки в каждом месте, оберните логику в процедуру. Она сама убедится, что источник есть, и создаст каталог приёмника:
Процедура СкопироватьФайлБезопасно(Источник, Приёмник)
ФайлИсточник = Новый Файл(Источник);
Если НЕ ФайлИсточник.Существует() Тогда
ВызватьИсключение "Файл-источник не найден: " + Источник;
КонецЕсли;
КаталогПриёмника = Новый Файл(Приёмник).Путь;
Если НЕ Новый Файл(КаталогПриёмника).Существует() Тогда
СоздатьКаталог(КаталогПриёмника);
КонецЕсли;
КопироватьФайл(Источник, Приёмник);
КонецПроцедуры
Свойство Путь объекта Файл возвращает каталог без имени файла — именно его и создаём перед копированием.
Копирование на стороне клиента без зависаний
В управляемом приложении файловые операции на клиенте делают асинхронными методами, чтобы интерфейс не замирал на крупном файле. Для копирования это НачатьКопированиеФайла, результат приходит в процедуру-оповещение. Синхронный КопироватьФайл на клиенте тоже доступен, но на больших файлах окно 1С «подвисает» до конца операции.
Копирование пачки файлов по маске
Чтобы перенести все файлы определённого типа, соедините НайтиФайлы и КопироватьФайл в цикле:
Файлы = НайтиФайлы("D:\Выгрузка", "*.xml");
Для Каждого Файл Из Файлы Цикл
Приёмник = "E:\Отправлено\" + Файл.Имя;
КопироватьФайл(Файл.ПолноеИмя, Приёмник);
КонецЦикла;
Сообщить("Скопировано файлов: " + Файлы.Количество());
Файл.ПолноеИмя даёт абсолютный путь источника, Файл.Имя — только имя с расширением для склейки пути приёмника.
Где выполняется копирование: клиент или сервер
Это главный источник ошибок, поэтому разберём отдельно. В клиент-серверной базе код исполняется в двух средах, и у каждой — своя файловая система.
Код в клиентском модуле (модуль формы, команды) видит диски того компьютера, за которым сидит пользователь. Код в серверной процедуре (&НаСервере, общий модуль с флагом «Сервер», регламентное задание) видит диски сервера 1С, а не рабочего места.
Путь вида C:\... в серверном коде указывает на диск сервера, а не на компьютер пользователя. Отсюда классическая жалоба «файл не находится, хотя он есть»: его ищут на сервере, а лежит он у пользователя.
Практические следствия:
- копируете между сетевыми папками по расписанию — пишите код на сервере, пути задавайте как UNC (
\\server\share\...), доступ выдавайте учётной записи службыragent; - копируете локальный файл пользователя — делайте это на клиенте;
- тонкий клиент и веб-клиент для файловых операций на машине пользователя требуют расширения работы с файлами (
НачатьУстановкуРасширенияРаботыСФайлами), в толстом клиенте оно не нужно.
Выгрузка базы и конфигурации через Конфигуратор
Когда под «скопировать файл» подразумевают сохранить всю базу, работают через Конфигуратор. Он умеет упаковать информационную базу в один файл .dt.
Порядок действий:
- Запустите базу в режиме Конфигуратор.
- Меню
Администрирование → Выгрузить информационную базу. - Укажите имя и каталог файла
.dt, нажмите «Сохранить».
Файл .dt — это полный слепок базы: конфигурация плюс все данные. Он подходит для переноса базы между серверами и для резервной копии небольшой базы.
Выгрузка в .dt требует монопольного (эксклюзивного) доступа — все остальные сеансы должны быть завершены. На большой базе выгрузка идёт долго, поэтому для рабочего бэкапа клиент-серверной базы её обычно не используют (см. раздел про резервные копии).
Отдельно можно сохранить только конфигурацию, без данных: Конфигурация → Сохранить конфигурацию в файл создаёт .cf. Это нужно, чтобы перенести доработки в другую базу или сравнить версии конфигурации.
Внешняя обработка: копируем, не меняя конфигурацию
Если дорабатывать конфигурацию нельзя (типовая на поддержке) или задача разовая, код копирования оформляют внешней обработкой .epf. Она запускается из пользовательского режима и ничего в конфигурации не трогает.
Как собрать:
- В Конфигураторе —
Файл → Новый → Внешняя обработка. - Добавьте форму, на ней — команду с кнопкой, например «Копировать».
- В обработчике команды разместите код с
КопироватьФайл(учтите раздел про клиент и сервер: операции с сервером выносите в серверную процедуру). - Сохраните как
.epf.
Запуск у пользователя — Файл → Открыть в режиме 1С:Предприятие, затем выбрать .epf.
Открытие внешних обработок — потенциальный канал для чужого кода. Разрешайте запуск только проверенных файлов и только тем пользователям, которым это действительно нужно. В типовых есть профиль безопасного режима, ограничивающий такие операции.
Передача файла по FTP из 1С
Отправить файл на внешний сервер помогает объект FTPСоединение. Он есть в платформе «из коробки», сторонние компоненты не нужны.
Выгрузка файла на сервер — метод Записать (локальный файл → путь на сервере):
Соединение = Новый FTPСоединение("ftp.example.ru", 21, "user", "пароль");
Соединение.Записать("E:\Архив\Выгрузка.xml", "/upload/Выгрузка.xml");
Скачивание с сервера — метод Получить (путь на сервере → локальный файл):
Соединение.Получить("/upload/Ответ.xml", "E:\Входящие\Ответ.xml");
Полезные параметры конструктора и методы:
- порт по умолчанию для FTP —
21; для защищённого FTPS укажите последним параметром признак защищённого соединения; - седьмой параметр конструктора — таймаут в секундах, задавайте его, чтобы код не завис на недоступном сервере;
- шестой параметр включает пассивный режим — он чаще проходит сквозь межсетевые экраны, чем активный, поэтому при проблемах с подключением попробуйте его;
СоздатьКаталог,УдалитьФайл,НайтиФайлыработают так же, как с локальными файлами, но на стороне FTP-сервера.
Перед выгрузкой убедитесь, что локальный файл собран полностью, иначе на сервер уедет пустышка. Если файл только что сформирован кодом, проверьте его размер через Новый Файл(Путь).Размер() — ноль байт означает, что запись ещё не завершилась.
Когда файл нужен сначала на диске, а потом на FTP — сперва КопироватьФайл, затем Записать. Так проще отладить: будет видно, на каком шаге оборвалось.
Резервная копия файловой и клиент-серверной базы
Способ зависит от того, как хранится база.
Файловая база. Все данные — в одном файле 1Cv8.1CD внутри каталога базы. Резервная копия — это копия каталога, сделанная, когда в базе никто не работает
:
robocopy "D:\Bases\Buh" "E:\Backup\Buh" /MIR /R:2 /W:5
robocopy с ключом /MIR зеркалит каталог; /R:2 /W:5 ограничивают повторы при занятом файле. Копировать базу на ходу, когда в ней идёт запись, нельзя — копия получится повреждённой.
Клиент-серверная база
. Данные лежат в СУБД (PostgreSQL или MS SQL Server), а не в файле на диске 1С. Копировать их средствами 1С неправильно — бэкап делают инструментами СУБД (pg_dump для PostgreSQL, план обслуживания в MS SQL). Выгрузка в .dt годится как дополнительная копия, но не как основной механизм для крупной базы.
Универсальный способ для любой базы из командной строки — выгрузка в .dt в пакетном режиме Конфигуратора:
"C:\Program Files\1cv8\8.3.24.1234\bin\1cv8.exe" DESIGNER ^
/S "server\Buh" /N "Администратор" /P "пароль" ^
/DumpIB "E:\Backup\Buh.dt" /DisableStartupMessages
Для файловой базы вместо /S "server\Buh" подставьте /F "D:\Bases\Buh". Обратная операция — ключ /RestoreIB. Номер версии в пути (8.3.24.1234) замените на установленный у вас.
Копирование файлов по расписанию
Регулярную копию настраивают двумя способами — внутри 1С или средствами Windows.
Регламентное задание (внутри 1С). Подходит, когда копируются файлы, видимые серверу 1С: выгрузки, вложения, обмены. Создаётся в режиме предприятия:
Администрирование → Обслуживание → Регламентные и фоновые задания(в типовых на БСП) либо через общий модуль с процедурой-обработчиком.- Код задания выполняется на сервере — пути задавайте относительно сервера, доступ выдавайте учётной записи службы.
- Задайте расписание: периодичность, время, дни.
Планировщик заданий Windows. Подходит для копии файла базы и для .dt-выгрузки. Создайте .bat с командой robocopy или с запуском 1cv8 ... /DumpIB (см. выше) и добавьте его в Планировщик заданий → Создать задачу. Запуск настройте от учётной записи, у которой есть права на оба каталога.
Пакетная выгрузка /DumpIB требует монопольного доступа. Планируйте её на время, когда пользователи не работают (ночь, выходные), иначе задание завершится с ошибкой «не удалось получить монопольный доступ».
Какой способ выбрать:
| Что копируем | Способ | Когда срабатывает |
|---|---|---|
| Выгрузки, обмены, вложения на сервере | Регламентное задание 1С | Сервер 1С запущен |
Файл файловой базы (1Cv8.1CD) | robocopy в планировщике Windows | Пользователи не работают |
Полная выгрузка базы в .dt | 1cv8 /DumpIB в планировщике | Монопольный доступ (ночь) |
Ошибки при копировании и как их устранить
Новый Файл(Путь).Существует() до копирования.ragent, а не пользователь 1С. Выдайте права на чтение источника и запись в приёмник.СоздатьКаталог, затем копируйте.Частые вопросы
Чем КопироватьФайл отличается от ПереместитьФайл?
КопироватьФайл оставляет оригинал на месте и создаёт дубль. ПереместитьФайл переносит файл: после неё оригинала по старому пути уже нет.Нужны ли права администратора для копирования из кода?
Можно ли скопировать файл базы, пока в ней работают?
Как скопировать файл на другой компьютер в сети?
\\server\backup\file.pdf, и убедитесь, что учётная запись, выполняющая код, имеет доступ к этой шаре на запись.Копирование оборвалось на полпути — что с файлом?
ПереместитьФайл в целевое. Тогда частичный файл не спутают с готовым.