Перенос прикрепленных файлов между различными информационными базами 1С — это задача, требующая аккуратного подхода к архитектуре метаданных. Чаще всего мы сталкиваемся с тем, что файлы в современных конфигурациях не хранятся просто как двоичные данные внутри справочника, а являются частью сложной структуры Библиотеки стандартных подсистем (БСП). Рассмотрим по шагам, как можно реализовать такой перенос.
Для разового переноса данных у нас есть несколько проверенных стратегий. Выбор зависит от того, насколько глубоко вы хотите погружаться в разработку.
Если вы решили писать собственную обработку для переноса, рекомендуем придерживаться следующего алгоритма работы с файлами:
Сначала необходимо подготовить данные для выгрузки. Поскольку файлы могут храниться в разных местах (в томах на диске или в информационной базе), логика получения данных должна учитывать эти особенности:
// Пример логики сериализации
МассивОбъектов = Новый Массив;
Выборка = Справочники.НоменклатурныеГруппыПрикрепленныеФайлы.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектФайла = Выборка.ПолучитьОбъект();
// Логика подмены владельца на справочник Проекты
ОбъектФайла.Владелец = СсылкаНаПроектВПриемнике;
МассивОбъектов.Добавить(ОбъектФайла);
КонецЦикла;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Transfer\Files.xml");
Сериализатор.ЗаписатьXML(ЗаписьXML, МассивОбъектов);
ЗаписьXML.Закрыть();
Обратите внимание: при использовании сериализатора СериализаторXDTO необходимо учитывать, что структура метаданных в источнике и приемнике должна быть совместимой. Если конфигурации сильно отличаются, лучше выгружать не объекты целиком, а только «сырые» данные (двоичные данные в формате Base64 и ключевые реквизиты).
При переносе важно помнить, что присоединенные файлы — это не один объект. Это сложная иерархия. При реализации решения вы обязательно столкнетесь со следующими сущностями:
СправочникСсылка.Файлы — содержит метаданные о файле (имя, расширение, автор).СправочникСсылка.ВерсииФайлов — хранит историю изменений и ссылки на сами данные.РегистрСведений.ДвоичныеДанныеФайлов — здесь физически лежат данные (если не используются внешние тома).Поэтому простая замена владельца Объект.Владелец = НовыйПроект в базе-приемнике не сработает. Вам потребуется создать новую запись в справочнике Файлы, корректно сформировать ВерсиюФайла и записать ДвоичныеДанные в регистр, если файл хранится в ИБ.
Для обеспечения стабильности переноса рекомендуем придерживаться следующих правил:
1. Соответствие объектов: Ссылка на Проект в первой базе не существует во второй. Используйте поиск по бизнес-ключу (код, артикул или наименование). Создайте таблицу соответствия, чтобы понимать, какой файл к какому объекту привязывать.
2. Использование промежуточных файлов: Вместо того чтобы «гонять» объекты через СОМ, используйте Base64-строки. Это позволит избежать проблем с типами данных ДвоичныеДанные, которые при передаче через COM-соединение могут вызывать ошибки сериализации.
3. Проверка прав: Если вы переносите файлы в 1С:Документооборот, убедитесь, что у пользователя, под которым работает обработка, есть права на запись в соответствующие папки файлов. Часто ошибки при загрузке связаны именно с отсутствием прав доступа к структуре папок.
4. Учет версионности: Определитесь, нужно ли вам переносить всю историю изменений файла (все версии) или достаточно только актуальной (последней) версии. Перенос всех версий значительно усложнит код, но сохранит целостность архива документов.
В завершение, если вам нужно выполнить разовый перенос, не усложняйте процесс интеграционными шинами. Напишите простую внешнюю обработку, которая считывает данные из базы-источника, формирует XML-структуру с Base64-кодом файлов и затем импортирует их в базу-приемник. Такой подход — самый надежный способ контроля за корректностью данных.