Копирование файлов в 1С:Предприятии — код, выгрузка и автоматизация

· 9 мин

Содержание

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

Выбор способа зависит от того, что именно вы копируете. Вложение или выгруженный отчёт — встроенный язык. Файл информационной базы целиком — выгрузка в .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.

Порядок действий:

  1. Запустите базу в режиме Конфигуратор.
  2. Меню Администрирование → Выгрузить информационную базу.
  3. Укажите имя и каталог файла .dt, нажмите «Сохранить».

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

Выгрузка в .dt требует монопольного (эксклюзивного) доступа — все остальные сеансы должны быть завершены. На большой базе выгрузка идёт долго, поэтому для рабочего бэкапа клиент-серверной базы её обычно не используют (см. раздел про резервные копии).

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

Внешняя обработка: копируем, не меняя конфигурацию

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

Как собрать:

  1. В Конфигураторе — Файл → Новый → Внешняя обработка.
  2. Добавьте форму, на ней — команду с кнопкой, например «Копировать».
  3. В обработчике команды разместите код с КопироватьФайл (учтите раздел про клиент и сервер: операции с сервером выносите в серверную процедуру).
  4. Сохраните как .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) замените на установленный у вас.

Проверка перед резервным копированием базы
Выполнено: 0 / 5

Копирование файлов по расписанию

Регулярную копию настраивают двумя способами — внутри 1С или средствами Windows.

Регламентное задание (внутри 1С). Подходит, когда копируются файлы, видимые серверу 1С: выгрузки, вложения, обмены. Создаётся в режиме предприятия:

  1. Администрирование → Обслуживание → Регламентные и фоновые задания (в типовых на БСП) либо через общий модуль с процедурой-обработчиком.
  2. Код задания выполняется на сервере — пути задавайте относительно сервера, доступ выдавайте учётной записи службы.
  3. Задайте расписание: периодичность, время, дни.

Планировщик заданий Windows. Подходит для копии файла базы и для .dt-выгрузки. Создайте .bat с командой robocopy или с запуском 1cv8 ... /DumpIB (см. выше) и добавьте его в Планировщик заданий → Создать задачу. Запуск настройте от учётной записи, у которой есть права на оба каталога.

Пакетная выгрузка /DumpIB требует монопольного доступа. Планируйте её на время, когда пользователи не работают (ночь, выходные), иначе задание завершится с ошибкой «не удалось получить монопольный доступ».

Какой способ выбрать:

Что копируемСпособКогда срабатывает
Выгрузки, обмены, вложения на сервереРегламентное задание 1ССервер 1С запущен
Файл файловой базы (1Cv8.1CD)robocopy в планировщике WindowsПользователи не работают
Полная выгрузка базы в .dt1cv8 /DumpIB в планировщикеМонопольный доступ (ночь)

Ошибки при копировании и как их устранить

Диагностика: выберите симптом

Частые вопросы

Чем КопироватьФайл отличается от ПереместитьФайл?
КопироватьФайл оставляет оригинал на месте и создаёт дубль. ПереместитьФайл переносит файл: после неё оригинала по старому пути уже нет.
Нужны ли права администратора для копирования из кода?
Нет, прав администратора Windows не требуется. Нужны лишь права на чтение каталога-источника и запись в каталог-приёмник у той учётной записи, под которой исполняется код.
Можно ли скопировать файл базы, пока в ней работают?
Файловую базу — нет: копия выйдет повреждённой. Клиент-серверную базу бэкапят средствами СУБД без остановки работы пользователей.
Как скопировать файл на другой компьютер в сети?
Задайте приёмник сетевым путём UNC, например \\server\backup\file.pdf, и убедитесь, что учётная запись, выполняющая код, имеет доступ к этой шаре на запись.
Копирование оборвалось на полпути — что с файлом?
Приёмник может остаться неполным. Надёжный приём: копировать во временное имя, а по завершении переименовать ПереместитьФайл в целевое. Тогда частичный файл не спутают с готовым.