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

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

В процессе работы с крупными системами, такими как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей 11, часто возникает ситуация, когда документы уже перенесены в другую базу, а прикрепленные к ним файлы остались в исходной. Переносить сотни или тысячи файлов вручную — задача невыполнимая. В этой статье мы подробно разберем, как устроена система хранения файлов в современных конфигурациях и какими способами можно автоматизировать их перенос.

Разберем архитектуру хранения файлов в 1С (БСП)

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

  1. Справочники присоединенных файлов: Для каждого метаданного (например, ЗаказКлиента) существует свой справочник, например, ЗаказыКлиентовПрисоединенныеФайлы. Именно здесь хранятся карточки файлов (имя, владелец, дата создания).
  2. Регистр сведений ДвоичныеДанныеФайлов: Это «сердце» системы. Именно здесь в ресурсе с типом ХранилищеЗначения лежат сами файлы (бинарные данные), если в настройках базы не выбран перенос в тома на диске.
  3. Регистр сведений СведенияОФайлах: Содержит техническую информацию: размер файла, расширение, признак зашифрованности и, что крайне важно, ХешСумма (MD5).
  4. Регистр сведений ФайлыВРабочемКаталоге: Содержит данные о файлах, которые пользователи редактируют локально.

Важный нюанс: если вы перенесете только справочник ПрисоединенныеФайлы, в базе-приемнике вы увидите список файлов в документах, но при попытке их открыть система выдаст ошибку: «Файл не найден».

Способ 1: Использование универсальной обработки выгрузки и загрузки XML

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

Воспользуемся типовой обработкой «Выгрузка и загрузка данных XML». Однако, если ваши конфигурации не полностью идентичны, стоит обратить внимание на адаптивную выгрузку и загрузку данных XML с гибкими отборами, которая позволяет более тонко настраивать процесс обмена. В отличие от обмена через КД 2.0, эти инструменты переносят данные «как есть», сохраняя UUID (УИД) объектов, что критически важно для связки файлов с документами-владельцами.

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

  1. В базе-источнике выбираем нужные справочники [ИмяОбъекта]ПрисоединенныеФайлы.
  2. Обязательно отмечаем для выгрузки регистры сведений ДвоичныеДанныеФайлов и СведенияОФайлах.
  3. Если файлы хранятся в томах на диске, убедитесь, что в базе-приемнике уже настроены аналогичные пути или предварительно переведите файлы в информационную базу.
  4. Выполняем выгрузку в файл и последующую загрузку в приемнике.

Способ 2: Программный перенос через JSON и XDTO (сериализация)

Если нам требуется более тонкая настройка (например, перенос только определенных файлов за конкретный период), мы можем написать небольшую обработку. Также можно использовать готовое решение для экспорта любых документов базы в JSON, которое сохраняет структуру данных и бизнес-логику. Рассмотрим пример кода для выгрузки данных справочника в формат JSON с использованием СериализаторXDTO.

Выясним, как программно подготовить данные для выгрузки:


&НаСервере
Функция ПолучитьДанныеДляВыгрузкиНаСервере()
    ДанныеДляВыгрузки = Новый Соответствие();
    
    // Выбираем файлы, привязанные к конкретным документам
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ЗаказыКлиентовПрисоединенныеФайлы ГДЕ ...";
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ТекСпр = Выборка.Ссылка;
        ДанныеДляВыгрузки.Вставить(XMLСтрока(ТекСпр),
                                    Новый Структура("Объект", ЭлементВТекстJSON(ТекСпр)));
    КонецЦикла;
    
    Возврат ДанныеДляВыгрузки;
КонецФункции

Для корректного преобразования объекта в строку JSON воспользуемся следующим методом. Похожий подход реализует универсальный механизм выгрузки и загрузки картинок на базе БСП, который автоматизирует сопоставление файлов и объектов базы.


&НаСервере
Функция ЭлементВТекстJSON(Элем)
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
    
    // Используем СериализаторXDTO для сохранения структуры объекта 1С
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Элем.ПолучитьОбъект(), НазначениеТипаXML.Явное);
    
    Возврат ЗаписьJSON.Закрыть();
КонецФункции

Важный момент при работе с бинарными данными: Регистр ДвоичныеДанныеФайлов содержит ресурс ХранилищеЗначения. При обычной сериализации в JSON эти данные могут быть потеряны или некорректно преобразованы. Рассмотрим, как правильно обработать двоичные данные. Нам необходимо принудительно извлечь ДвоичныеДанные из хранилища и преобразовать их в строку Base64.

Проблема уникальных идентификаторов (GUID)

Проанализируем ситуацию: что делать, если документы-владельцы в базах имеют разные УИДы? Например, если документы переносились не через XML, а создавались заново или через синхронизацию по номеру и дате.

В этом случае стандартная выгрузка/загрузка не сработает — файлы «потеряют» своих владельцев. Решение заключается в следующем:

  1. При выгрузке файла сохраняйте не только его данные, но и ключевые реквизиты документа-владельца (тип, номер, дата).
  2. При загрузке в базу-приемник выполняйте поиск владельца: Документы[ТипВладельца].НайтиПоНомеру(Номер, Дата).
  3. Устанавливайте найденную ссылку в реквизит ВладелецФайла нового элемента справочника присоединенных файлов.

Метод переноса через тома хранения (для больших объемов)

Если объем файлов исчисляется гигабайтами, сериализация в XML или JSON станет крайне медленной и может привести к переполнению памяти. В таких случаях для контроля структуры каталогов на диске удобно использовать Xtree — инструмент для работы с файлами в виде дерева. Рассмотрим альтернативный путь — использование механизма томов БСП.

Алгоритм действий следующий:

  1. В исходной базе перейдите в настройки работы с файлами и установите способ хранения «В томах на диске».
  2. Запустите регламентное задание ПереносФайловВТома. Все файлы «выгрузятся» из базы в сетевую папку.
  3. Скопируйте файлы из сетевой папки на сервер новой базы.
  4. Перенесите только «легкие» данные: справочники и регистры (без самих двоичных данных), сохранив ссылки на пути к томам.
  5. В целевой базе пропишите новый путь к тому.

Резюмируем: Для идентичных баз оптимальным является использование Универсального обмена данными XML. Если же базы имеют различия в данных или требуется сложная логика отбора — используйте программную сериализацию через СериализаторXDTO, уделяя особое внимание ресурсам регистра ДвоичныеДанныеФайлов.

← На главную