Копирование файлов в 1С 8.3: от вложений документа до обработки на сервере

· 10 мин

Содержание

Скопировать файл в 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) к документам и справочникам прикрепляют сканы, договоры и акты. Кнопка со скрепкой в форме объекта открывает список присоединённых файлов.

Прямой команды «перенести вложение из документа А в документ Б» в типовых нет. Рабочий порядок такой:

  1. Откройте документ-источник и нажмите скрепку.
  2. Выделите нужный файл и сохраните его на диск через команду сохранения в командной панели списка.
  3. Откройте документ-приёмник, нажмите скрепку.
  4. Добавьте файл с диска или просто перетащите его мышью из проводника в список.

Перетаскивание работает и в обратную сторону: файл из списка вложений можно бросить на рабочий стол Windows. Для пары файлов это самый быстрый способ.

При копировании через диск создаётся новый файл в базе. Он не связан с исходным: правка одной копии не меняет другую. Если нужна одна версия документа для нескольких объектов, храните её в одном месте и давайте ссылку в комментарии.

Если вложений много, скажем 300 сканов из одного договора в другой, ручной путь не годится. Тут нужна обработка, о ней ниже.

Копирование документа вместе с вложениями

Команда копирования документа (F9 или кнопка в списке) создаёт новый документ с теми же реквизитами. Присоединённые файлы при этом не копируются: они хранятся отдельно и ссылаются на владельца. Новый документ будет без вложений, их придётся добавить заново.

Тома хранения: как перенести файлы из базы на диск

По умолчанию файлы хранятся прямо в информационной базе. Когда вложений становится много, база растёт на десятки гигабайт. Выгрузка .dt и резервные копии идут часами. Решение — тома хранения файлов на диске.

Настройка в типовых конфигурациях на БСП находится в разделе Администрирование, в общих настройках, в группе про файлы. Там включают хранение файлов в томах на диске и открывают список томов.

Что указать в карточке тома:

  • 📁 Полный путь для Windows и, если есть серверы на Linux, отдельно для Linux. Для кластера из нескольких серверов — только UNC-путь вида \\fs01\1C_Volumes\Buh\.
  • 📏 Максимальный размер в мегабайтах. Когда том заполнится, новые файлы пойдут в следующий том по порядку заполнения.
  • 🔢 Порядок заполнения, если томов несколько.

Включение томов действует только на новые файлы. Старые вложения остаются в базе. Чтобы перенести их на диск, используйте команду переноса файлов, которую подсистема даёт в форме списка томов.

Не копируйте и не переименовывайте файлы в папке тома вручную через проводник. База хранит путь к каждому файлу. Сдвинули файл — вложение в 1С перестанет открываться.

Перенос тома на другой диск или сервер

Если папку тома нужно переехать, например с D: на новое хранилище:

  1. Выберите время, когда в базе никто не работает , или ограничьте вход пользователей.
  2. Скопируйте папку тома целиком, сохранив структуру подкаталогов. Подойдёт robocopy.
  3. Поменяйте полный путь в карточке тома на новый.
  4. Откройте несколько старых вложений и проверьте, что они читаются.
  5. Старую папку не удаляйте, пока не убедитесь, что всё открывается.
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С в другую без программиста?
Для десятка вложений — да: сохраните их на диск в одной базе и прикрепите в другой. Для сотен файлов нужна обработка, иначе работа займёт дни.
Перезаписывает ли КопироватьФайл существующий файл?
Да. Если файл с таким именем в приёмнике уже есть, он будет заменён без предупреждения. Проверяйте наличие заранее через Новый Файл(Путь).Существует().
Почему база не уменьшилась после включения томов хранения?
Тома действуют на новые файлы. Старые нужно перенести командой переноса из списка томов. После переноса размер базы уменьшится; для файловой базы может понадобиться ещё и сжатие через тестирование и исправление.
Как ограничить, в какие папки сервера может писать обработка?
Включите для информационной базы профиль безопасности в консоли кластера и укажите в нём разрешённые каталоги. Код без разрешения получит ошибку доступа.
Копируются ли файлы при обмене данными между базами?
Зависит от правил конкретного обмена. Во многих типовых обменах присоединённые файлы не передаются, и их переносят отдельно.