Копирование файлов в 1С 8.3: от вложений документа до обработки на сервере
Содержание
Скопировать файл в 1С можно тремя путями. Вложение документа сохраняют на диск и прикрепляют к другому объекту. Файлы на диске копируют встроенным методом КопироватьФайл() из обработки. Файл с компьютера пользователя на сервер передают через временное хранилище: НачатьПомещениеФайла(), затем ПолучитьИзВременногоХранилища().
Почти все проблемы при переносе данных возникают из-за одного. Код выполняется не на том компьютере, о котором вы думаете, и не от того пользователя Windows. Сначала разберём, где «живёт» каждый файл, затем способы копирования и типовые ошибки.
Где хранятся файлы в 1С и почему это важно для копирования
В 1С:Предприятии 8.3 файл может находиться в одном из четырёх мест. От этого зависит способ копирования.
| Где лежит файл | Пример | Чем копировать |
|---|---|---|
| На компьютере пользователя | C:\Users\ivanov\Desktop\акт.pdf | Клиентские методы, диалог выбора файла |
| На сервере 1С или в сетевой папке | \\fs01\obmen\выгрузка.xml | КопироватьФайл() на сервере |
| Внутри информационной базы | Вложение документа | Механизм присоединённых файлов |
| В томе хранения на диске | D:\1C_Volumes\Бухгалтерия\ | Тоже через механизм файлов, не вручную |
Главное правило клиент-серверной базы: код с директивой &НаСервере видит диски сервера 1С, а не ваш компьютер. Путь C:\Обмен\ в серверной процедуре — это папка на сервере. Если такой папки там нет, получите ошибку, хотя на вашем диске всё на месте.
В файловой базе клиент и «сервер» — один процесс на вашем компьютере. Поэтому код, который работал в файловой копии, может сломаться после перевода базы на сервер. Это частая причина жалоб «вчера копировалось, сегодня нет».
💡 Ещё одна деталь: серверные процессы 1С работают от учётной записи службы. По умолчанию это USR1CV8, если при установке не выбрали другую. Права на папки нужно выдавать именно ей, а не пользователю, который сидит в программе.
Копирование присоединённых файлов между документами
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) к документам и справочникам прикрепляют сканы, договоры и акты. Кнопка со скрепкой в форме объекта открывает список присоединённых файлов.
Прямой команды «перенести вложение из документа А в документ Б» в типовых нет. Рабочий порядок такой:
- Откройте документ-источник и нажмите скрепку.
- Выделите нужный файл и сохраните его на диск через команду сохранения в командной панели списка.
- Откройте документ-приёмник, нажмите скрепку.
- Добавьте файл с диска или просто перетащите его мышью из проводника в список.
Перетаскивание работает и в обратную сторону: файл из списка вложений можно бросить на рабочий стол Windows. Для пары файлов это самый быстрый способ.
При копировании через диск создаётся новый файл в базе. Он не связан с исходным: правка одной копии не меняет другую. Если нужна одна версия документа для нескольких объектов, храните её в одном месте и давайте ссылку в комментарии.
Если вложений много, скажем 300 сканов из одного договора в другой, ручной путь не годится. Тут нужна обработка, о ней ниже.
Копирование документа вместе с вложениями
Команда копирования документа (F9 или кнопка в списке) создаёт новый документ с теми же реквизитами. Присоединённые файлы при этом не копируются: они хранятся отдельно и ссылаются на владельца. Новый документ будет без вложений, их придётся добавить заново.
Тома хранения: как перенести файлы из базы на диск
По умолчанию файлы хранятся прямо в информационной базе. Когда вложений становится много, база растёт на десятки гигабайт. Выгрузка .dt и резервные копии идут часами. Решение — тома хранения файлов на диске.
Настройка в типовых конфигурациях на БСП находится в разделе Администрирование, в общих настройках, в группе про файлы. Там включают хранение файлов в томах на диске и открывают список томов.
Что указать в карточке тома:
- 📁 Полный путь для Windows и, если есть серверы на Linux, отдельно для Linux. Для кластера из нескольких серверов — только UNC-путь вида
\\fs01\1C_Volumes\Buh\. - 📏 Максимальный размер в мегабайтах. Когда том заполнится, новые файлы пойдут в следующий том по порядку заполнения.
- 🔢 Порядок заполнения, если томов несколько.
Включение томов действует только на новые файлы. Старые вложения остаются в базе. Чтобы перенести их на диск, используйте команду переноса файлов, которую подсистема даёт в форме списка томов.
Не копируйте и не переименовывайте файлы в папке тома вручную через проводник. База хранит путь к каждому файлу. Сдвинули файл — вложение в 1С перестанет открываться.
Перенос тома на другой диск или сервер
Если папку тома нужно переехать, например с D: на новое хранилище:
- Выберите время, когда в базе никто не работает , или ограничьте вход пользователей.
- Скопируйте папку тома целиком, сохранив структуру подкаталогов. Подойдёт
robocopy. - Поменяйте полный путь в карточке тома на новый.
- Откройте несколько старых вложений и проверьте, что они читаются.
- Старую папку не удаляйте, пока не убедитесь, что всё открывается.
robocopy "D:\1C_Volumes\Buh" "\\fs02\1C_Volumes\Buh" /E /COPY:DAT /R:2 /W:5 /LOG:C:\Temp\volume_copy.log
Ключ /E копирует все подкаталоги, включая пустые. Лог покажет файлы, которые не скопировались из-за прав или блокировок.
Копирование файлов программно: встроенные методы платформы
Для пакетных задач пишут обработку. Встроенный язык 8.3 даёт набор методов для файловой системы.
| Метод | Что делает | Где выполняется |
|---|---|---|
КопироватьФайл(Источник, Приёмник) | Копирует файл, перезаписывает существующий | Сервер или толстый клиент |
ПереместитьФайл(Источник, Приёмник) | Переносит файл | Сервер или толстый клиент |
НайтиФайлы(Каталог, Маска, ИскатьВПодкаталогах) | Возвращает массив объектов Файл | Сервер или толстый клиент |
СоздатьКаталог(Путь) | Создаёт папку | Сервер или толстый клиент |
НачатьКопированиеФайла(...) | Асинхронное копирование на клиенте | Тонкий и веб-клиент |
В тонком клиенте синхронные файловые методы на стороне клиента не используют, там работают асинхронные варианты с ОписаниеОповещения. Для серверного кода синхронных методов достаточно.
Пример: скопировать все файлы из папки на сервере
Процедура берёт файлы из папки-источника и кладёт их в приёмник. Ошибку по одному файлу она пишет в журнал регистрации и не прерывает остальные.
&НаСервереБезКонтекста
Процедура СкопироватьФайлыКаталога(КаталогИсточник, КаталогПриемник)
СоздатьКаталог(КаталогПриемник);
Разделитель = ПолучитьРазделительПути();
Файлы = НайтиФайлы(КаталогИсточник, "*", Ложь);
Для Каждого Файл Из Файлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Приемник = КаталогПриемник + Разделитель + Файл.Имя;
Попытка
КопироватьФайл(Файл.ПолноеИмя, Приемник);
Исключение
ЗаписьЖурналаРегистрации("КопированиеФайлов",
УровеньЖурналаРегистрации.Ошибка, , ,
Файл.ПолноеИмя + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецПроцедуры
ПолучитьРазделительПути() вернёт \ на Windows-сервере и / на Linux. Код не сломается, если базу переведут на другую ОС.
💡 Пути к сетевым папкам в серверном коде пишите только в формате UNC: \\fs01\obmen. Служба 1С не видит сетевые диски вроде Z:, подключённые в сеансе пользователя.
Пример: передать файл с компьютера пользователя на сервер
Тонкий клиент не может отдать серверу путь к своему диску. Файл передают через временное хранилище:
&НаКлиенте
Процедура ЗагрузитьФайлНаСервер(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ИмяФайла = Новый Файл(ВыбранноеИмяФайла).Имя;
СохранитьФайлНаСервере(Адрес, ИмяФайла);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьФайлНаСервере(Адрес, ИмяФайла)
Данные = ПолучитьИзВременногоХранилища(Адрес);
Данные.Записать("\\fs01\obmen\" + ИмяФайла);
УдалитьИзВременногоХранилища(Адрес);
КонецПроцедуры
Четвёртый параметр Истина открывает диалог выбора файла. Обратная задача, скачать файл с сервера пользователю, решается так же: ПоместитьВоВременноеХранилище() на сервере и НачатьПолучениеФайлов() на клиенте.
Внешние обработки для массового переноса файлов
Когда задача разовая, например перенести вложения из старой базы в новую, конфигурацию не дорабатывают. Пишут внешнюю обработку
.epf и запускают через Файл → Открыть.
Типовые сценарии:
- 📦 Выгрузить все вложения в папки. Каждый документ получает свою папку с именем по номеру и дате. Удобно для передачи архива аудитору.
- 🔁 Перенести вложения между базами. Источник выгружает файлы и XML с привязкой к владельцу (вид и номер документа). Приёмник ищет владельца и добавляет файл.
- 🧹 Собрать файлы из сетевой папки в базу. Сканы из папки сканера прикрепляются к документам по номеру в имени файла.
В конфигурациях на БСП для добавления вложения из кода есть программный интерфейс подсистемы присоединённых файлов. Используйте его, а не прямую запись в справочник файлов: он сам выберет, куда положить файл, в базу или в том.
Массовую загрузку файлов сначала прогоните на копии базы. Тысяча вложений, прикреплённых не к тем документам, — это долгая ручная чистка.
Совет практика: проверяйте результат по контрольной сумме
После массового копирования сверьте количество и размер файлов в источнике и приёмнике. Для критичных архивов посчитайте хеши. В PowerShell это одна строка:
Get-ChildItem "\\fs01\obmen" -File | Get-FileHash -Algorithm SHA256 | Export-Csv C:\Temp\hash_src.csv -NoTypeInformation
Сделайте то же для приёмника и сравните файлы. Расхождение покажет оборванную или повреждённую копию.
Права доступа: кому разрешено копировать файлы
Права здесь двух уровней: внутри 1С и в операционной системе. Нужны оба.
Внутри 1С:
- 🔐 Для запуска внешней обработки у пользователя должно быть право «Интерактивное открытие внешних обработок». Обычно оно есть у администратора и полных прав.
- 👤 Работа с присоединёнными файлами зависит от прав на сам объект-владелец. Нет права изменять документ — не получится добавить к нему вложение.
- 🛡️ Если в кластере для базы включены профили безопасности, серверный код получает доступ только к разрешённым каталогам. Нужную папку добавляют в профиль в консоли администрирования кластера.
В Windows:
- Учётной записи службы сервера 1С нужны права на чтение папки-источника и на запись в папку-приёмник.
- Для сетевой папки права нужны и на уровне общего ресурса, и на уровне NTFS. Чаще всего забывают про первое.
- Если служба запущена от локальной учётной записи, к сетевой папке на другом компьютере она не подключится. В домене службу запускают от доменной учётной записи.
Смена учётной записи службы требует её перезапуска. Все сеансы пользователей на этом сервере оборвутся. Делайте это вне рабочего времени и предупредите людей.
Файлы информационной базы: что можно копировать, а что нет
Иногда «скопировать файлы 1С» означает скопировать саму базу. Для файловой базы это папка с файлом 1Cv8.1CD.
| Что копируете | Можно ли просто скопировать | Как правильно |
|---|---|---|
1Cv8.1CD при работающих пользователях | Нет, копия может оказаться битой | Выгрузка .dt или копирование после выхода всех пользователей |
1Cv8.1CD, когда в базе никого нет | Да | Обычное копирование папки |
| База на SQL-сервере | Нет, файлов .1CD у неё нет | Выгрузка .dt или резервная копия средствами СУБД |
| Папка тома хранения | Да, со всей структурой | См. раздел про тома выше |
Выгрузка .dt делается в Конфигураторе: Администрирование → Выгрузить информационную базу. Монопольный режим для выгрузки не нужен, но пусть в это время никто не проводит документы, иначе в копию попадёт промежуточное состояние.
💡 Файлы тома в выгрузку .dt не входят. Если вложения хранятся на диске, копируйте папку тома вместе с выгрузкой, иначе в восстановленной базе вложения не откроются.
Ошибки при копировании файлов и что с ними делать
Большинство ошибок сводятся к трём причинам: не тот компьютер, не тот пользователь Windows, файл занят.
Если копирование падает только на части файлов, посмотрите на длину путей и имена. Windows по умолчанию не любит пути длиннее 260 символов. Символы \ / : * ? " < > | в имени файла тоже недопустимы, а пользователи охотно вставляют двоеточие в «Акт № 12: март».
Частые вопросы
Можно ли скопировать файлы из одной базы 1С в другую без программиста?
Перезаписывает ли КопироватьФайл существующий файл?
Новый Файл(Путь).Существует().