Как перенести прикрепленные файлы из одной базы 1С в другую?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

Перенос прикрепленных файлов между различными информационными базами 1С — это задача, требующая аккуратного подхода к архитектуре метаданных. Чаще всего мы сталкиваемся с тем, что файлы в современных конфигурациях не хранятся просто как двоичные данные внутри справочника, а являются частью сложной структуры Библиотеки стандартных подсистем (БСП). Рассмотрим по шагам, как можно реализовать такой перенос.

Выбор метода переноса

Для разового переноса данных у нас есть несколько проверенных стратегий. Выбор зависит от того, насколько глубоко вы хотите погружаться в разработку.

  1. Конвертация данных (КД 2.0/3.0): Самый стандартизированный способ. Позволяет настроить правила выгрузки и загрузки объектов, включая присоединенные файлы.
  2. Самописная обработка с сериализацией: Метод, при котором мы выгружаем данные в промежуточный файл (например, в формате XML или JSON), а затем загружаем в приемник.
  3. Прямое COM-соединение: Позволяет «дотянуться» из одной базы до другой напрямую, выполнив перенос в рамках одного сеанса обработки.

Разбор алгоритма сериализации данных

Если вы решили писать собственную обработку для переноса, рекомендуем придерживаться следующего алгоритма работы с файлами:

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


// Пример логики сериализации
МассивОбъектов = Новый Массив;
Выборка = Справочники.НоменклатурныеГруппыПрикрепленныеФайлы.Выбрать();
Пока Выборка.Следующий() Цикл
    ОбъектФайла = Выборка.ПолучитьОбъект();
    // Логика подмены владельца на справочник Проекты
    ОбъектФайла.Владелец = СсылкаНаПроектВПриемнике;
    МассивОбъектов.Добавить(ОбъектФайла);
КонецЦикла;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Transfer\Files.xml");
Сериализатор.ЗаписатьXML(ЗаписьXML, МассивОбъектов);
ЗаписьXML.Закрыть();

Обратите внимание: при использовании сериализатора СериализаторXDTO необходимо учитывать, что структура метаданных в источнике и приемнике должна быть совместимой. Если конфигурации сильно отличаются, лучше выгружать не объекты целиком, а только «сырые» данные (двоичные данные в формате Base64 и ключевые реквизиты).

Технические нюансы работы с файлами

При переносе важно помнить, что присоединенные файлы — это не один объект. Это сложная иерархия. При реализации решения вы обязательно столкнетесь со следующими сущностями:

Поэтому простая замена владельца Объект.Владелец = НовыйПроект в базе-приемнике не сработает. Вам потребуется создать новую запись в справочнике Файлы, корректно сформировать ВерсиюФайла и записать ДвоичныеДанные в регистр, если файл хранится в ИБ.

Рекомендации по реализации

Для обеспечения стабильности переноса рекомендуем придерживаться следующих правил:

1. Соответствие объектов: Ссылка на Проект в первой базе не существует во второй. Используйте поиск по бизнес-ключу (код, артикул или наименование). Создайте таблицу соответствия, чтобы понимать, какой файл к какому объекту привязывать.

2. Использование промежуточных файлов: Вместо того чтобы «гонять» объекты через СОМ, используйте Base64-строки. Это позволит избежать проблем с типами данных ДвоичныеДанные, которые при передаче через COM-соединение могут вызывать ошибки сериализации.

3. Проверка прав: Если вы переносите файлы в 1С:Документооборот, убедитесь, что у пользователя, под которым работает обработка, есть права на запись в соответствующие папки файлов. Часто ошибки при загрузке связаны именно с отсутствием прав доступа к структуре папок.

4. Учет версионности: Определитесь, нужно ли вам переносить всю историю изменений файла (все версии) или достаточно только актуальной (последней) версии. Перенос всех версий значительно усложнит код, но сохранит целостность архива документов.

В завершение, если вам нужно выполнить разовый перенос, не усложняйте процесс интеграционными шинами. Напишите простую внешнюю обработку, которая считывает данные из базы-источника, формирует XML-структуру с Base64-кодом файлов и затем импортирует их в базу-приемник. Такой подход — самый надежный способ контроля за корректностью данных.

← На главную