Копирование файлов из 1С в другую папку: от кнопки до регламентного задания
Содержание
Скопировать файл в другую папку можно двумя путями. Если файл прикреплён к документу или элементу справочника, откройте его в списке присоединённых файлов и сохраните на диск через команду сохранения. Если файл лежит на диске и копировать нужно из кода, используйте метод КопироватьФайл(ИмяИсточника, ИмяПриемника).
Выбор зависит от трёх вещей: где лежит исходный файл (в базе или на диске), где выполняется операция (на клиенте или на сервере) и кто её запускает (человек или регламентное задание). От этого зависит, какие права и какие пути сработают. Ниже все варианты по порядку, от простого к программному.
Сначала определите, где лежит файл
Слово «файл» в 1С означает три разных объекта. Способ копирования у каждого свой.
| Где файл | Как выглядит | Как копировать |
|---|---|---|
| В базе, как присоединённый | Список «Присоединённые файлы» у документа или элемента | Сохранить на диск через интерфейс или программно |
| В томах хранения на сервере | Файлы базы вынесены на диск сервера | Через интерфейс; прямое копирование с диска — только для резервных целей |
| На диске, вне базы | Обычный файл в папке | Проводник ОС или КопироватьФайл |
Если не уверены, откройте карточку документа и найдите в ней список прикреплённых файлов. Есть он там, значит, файл хранится в базе, и копировать нужно «наружу» из базы.
Копирование вручную: через интерфейс и проводник
Сохранить присоединённый файл на диск
- Откройте документ или элемент справочника, к которому прикреплён файл.
- Перейдите к списку присоединённых файлов (обычно ссылка или вкладка «Файлы» в карточке).
- Выделите нужный файл и найдите в командной панели команду сохранения на диск. Названия кнопок немного отличаются в разных конфигурациях, но смысл один: файл уходит из базы в выбранную вами папку.
- Укажите папку назначения и подтвердите.
Для нескольких файлов сразу в списке есть выделение с Ctrl или Shift. Если массовое сохранение в вашей конфигурации не работает
, придётся выгружать по одному или использовать обработку (см. ниже).
Скопировать файл на диске обычными средствами
Если файл уже на диске, 1С не нужна вообще. Копируйте проводником, Ctrl+C / Ctrl+V. Это самый быстрый путь, когда вы просто хотите переложить выгрузку из каталога в каталог.
Одна ловушка: папку, которую видите вы, может не видеть сервер 1С. Диск D: на вашем компьютере и диск D: на сервере — разные диски. Это важно, когда копирование запускается из серверного кода.
Копирование на языке 1С: КопироватьФайл и родственники
Базовый вызов выглядит так:
КопироватьФайл("C:\Обмен\Выгрузка.xml", "D:\Архив\Выгрузка.xml");
Первый параметр — файл-источник, второй — полный путь назначения вместе с именем файла. Если файл с таким именем в целевой папке уже есть, он будет перезаписан, поэтому проверяйте наличие заранее.
Безопасный вариант с проверками
Процедура СкопироватьСПроверкой(ПутьИсточника, КаталогНазначения)
Источник = Новый Файл(ПутьИсточника);
Если Не Источник.Существует() Тогда
ВызватьИсключение "Файл не найден: " + ПутьИсточника;
КонецЕсли;
Каталог = Новый Файл(КаталогНазначения);
Если Не Каталог.Существует() Тогда
СоздатьКаталог(КаталогНазначения);
КонецЕсли;
ПутьНазначения = КаталогНазначения + "\" + Источник.Имя;
Если Новый Файл(ПутьНазначения).Существует() Тогда
УдалитьФайлы(ПутьНазначения);
КонецЕсли;
КопироватьФайл(ПутьИсточника, ПутьНазначения);
КонецПроцедуры
Что здесь важно:
- 📁
Новый Файл(...)с методомСуществует()проверяет и файл, и каталог; - 🛠
СоздатьКаталогсоздаёт и вложенные уровни, если их нет; - ⚠️ перед копированием поверх существующего файла решите, нужно ли перезаписывать его или лучше добавить к имени дату.
Копирование нескольких файлов по маске
Файлы = НайтиФайлы("C:\Обмен", "*.xml");
Для Каждого Файл Из Файлы Цикл
КопироватьФайл(Файл.ПолноеИмя, "D:\Архив\" + Файл.Имя);
КонецЦикла;
НайтиФайлы возвращает массив объектов Файл. Для вложенных папок передайте третьим параметром Истина (поиск в подкаталогах) и учтите, что структуру каталогов нужно воссоздавать самому: простой КопироватьФайл положит все файлы в одну папку.
Присоединённый файл из базы в папку из кода
Здесь без промежуточного шага не обойтись: данные файла лежат в хранилище базы. Схема такая:
- Получить двоичные данные файла
из его реквизита или хранилища (
ДвоичныеДанные). - Записать их в указанное место методом
Записать(ПутьНазначения).
// ДвоичныеДанные — уже полученные данные присоединённого файла
ДвоичныеДанные.Записать("D:\Архив\Договор.pdf");
Как именно достать двоичные данные, зависит от того, использует ли конфигурация подсистему «Работа с файлами» из библиотеки стандартных подсистем. В типовых конфигурациях для этого есть готовые функции, ищите их в общем модуле, имя которого содержит слово «файлы». Не придумывайте обращение к реквизитам напрямую, пока не посмотрели структуру справочника в конфигураторе.
Клиент или сервер: где запускается копирование
Это источник большей части «у меня не работает». Правило простое:
| Где выполняется код | Чьи диски и права |
|---|---|
| Клиентская процедура | Диски и права пользователя на его компьютере |
| Серверная процедура | Диски сервера и права учётной записи, под которой работает служба |
| Файловая база | Всё выполняется на компьютере пользователя, различие почти стирается |
В клиент-серверном варианте клиент подключается к серверу 1С, а серверный код видит только то, что видит сам сервер. Поэтому пути вида C:\Users\Иванов\Desktop из серверной процедуры не откроются: такого каталога на сервере нет.
Типовая цепочка для «положить файл с сервера на компьютер пользователя»:
- Сервер формирует файл и помещает его во временное хранилище или отдаёт двоичные данные.
- Клиент получает данные методом
ПолучитьФайл(или асинхроннымНачатьПолучениеФайла). - Платформа предложит пользователю выбрать место, а при включённых настройках расширения для работы с файлами сохранит без лишних запросов.
В обратную сторону работает пара ПоместитьФайл / НачатьПомещениеФайла: клиентский файл попадает во временное хранилище, откуда его забирает серверный код.
В современных версиях платформы синхронные методы работы с файлами на клиенте могут быть недоступны в веб-клиенте. Для универсальности используйте асинхронные варианты с префиксом Начать.
Расширения, внешние обработки и готовые инструменты
Когда нужно массово выгрузить вложения из документов, а типовой интерфейс этого не умеет, обычно применяют внешнюю обработку . Подключить её можно через меню открытия файла или через раздел дополнительных отчётов и обработок, если он включён в вашей конфигурации (в типовых решениях на БСП он находится в разделе администрирования).
Что учесть при выборе:
- 🔐 обработка исполняется с вашими правами, значит, чужой файл с неизвестного сайта может сделать с базой что угодно; берите только проверенное;
- 📌 прежде чем запускать массовую выгрузку, проверьте её на одном-двух файлах;
- 🧩 вместо правки типовой конфигурации лучше подключить расширение : оно не ломается при обновлении.
Расширение конфигурации
поддерживается с версии платформы 8.3.6. После загрузки файла .cfe не забудьте отдельным шагом применить изменения к базе данных, иначе команды в интерфейсе не появятся.
Автоматизация: регламентные задания
Копирование по расписанию (например, ночью складывать сформированные выгрузки в архивную папку) делают регламентным заданием. Код задания выполняется на сервере, поэтому всё из раздела выше применимо в полной мере.
Что должно быть выполнено:
- Сетевая папка доступна серверу по полному UNC-пути вида
\\сервер\ресурс\папка, а не по букве подключённого диска. Буквы дисков в сеансе службы не создаются. - У учётной записи, под которой работает служба сервера 1С, есть право на запись в целевую папку.
- Процедура задания не вызывает клиентских методов и диалогов: у неё нет интерфейса.
- Результат пишется в журнал регистрации, чтобы утром было видно, сработало ли.
Минимальный каркас:
Процедура КопироватьВыгрузкиВАрхив() Экспорт
Файлы = НайтиФайлы("\\fileserver\exchange", "*.xml");
Для Каждого Файл Из Файлы Цикл
Попытка
КопироватьФайл(Файл.ПолноеИмя, "\\fileserver\archive\" + Файл.Имя);
Исключение
ЗаписьЖурналаРегистрации("КопированиеФайлов",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Если файлов много, не копируйте их одним громоздким циклом без обработки ошибок: один заблокированный файл остановит задание, а остальные останутся ненакопированными. Конструкция Попытка вокруг каждого копирования решает проблему.
Имя с датой, перемещение и копирование больших файлов
Копия поверх старого файла часто не нужна: нужен архив, где каждая выгрузка хранится отдельно. Проще всего добавить дату и время к имени.
Источник = Новый Файл("C:\Обмен\Выгрузка.xml");
Метка = Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss");
Назначение = "D:\Архив\" + Источник.ИмяБезРасширения + "_" + Метка + Источник.Расширение;
КопироватьФайл(Источник.ПолноеИмя, Назначение);
Свойство Расширение возвращает точку вместе с расширением (.xml), поэтому дополнительная точка в строке не нужна. Формат даты в строке ДФ задаёт порядок частей: год, месяц, день, затем время. Такие имена сортируются в проводнике по алфавиту в хронологическом порядке.
Если нужно именно переместить файл, а не скопировать, у платформы есть метод ПереместитьФайл. Он быстрее копирования с удалением, когда папки находятся на одном диске, потому что данные физически не переписываются. Между разными дисками перенос всё равно сводится к копированию и удалению исходника.
Для файлов в сотни мегабайт полезны три правила:
- 📏 проверьте свободное место в целевой папке до копирования, сравнив его с
Источник.Размер(); - ⏳ запускайте тяжёлое копирование в фоновом задании, а не в диалоге пользователя: иначе окно «зависнет» до конца операции;
- ✅ после копирования сверьте размеры исходника и копии. Если они разные, копия неполная, и исходник удалять нельзя.
Когда копировать файл в 1С не нужно
Бывает, что задача решается иначе, и копия только добавит путаницы:
- Файл нужен другому сотруднику. Дайте ему доступ к документу в самой базе, и вложение он откроет сам. Файловые копии по папкам быстро расходятся с оригиналом.
- Нужна резервная копия. Для базы используйте выгрузку информационной базы или средства СУБД, а не ручное копирование отдельных файлов.
- Файл нужен для передачи контрагенту. Отправляйте его из документа вложением в письмо или через обмен, чтобы в истории осталась связь с документом.
Частые ошибки и как их разобрать
Ещё две ловушки, которые встречаются реже:
- ⚠️ длинные пути: если полный путь вместе с именем слишком длинный, операция может не пройти; сократите вложенность папок;
- ⚠️ кодировка имён: если файл создан другой системой, кириллица в названии иногда превращается в нечитаемый набор символов; перед копированием проверьте имя через
Новый Файл(...).Имя.
Частые вопросы
Можно ли скопировать сразу все присоединённые файлы документа?
Чем КопироватьФайл отличается от перемещения?
КопироватьФайл оставляет исходник на месте. Для переноса после копирования удалите исходный файл через УдалитьФайлы, но только когда убедились, что копия на месте.