В процессе работы с крупными системами, такими как 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей 11, часто возникает ситуация, когда документы уже перенесены в другую базу, а прикрепленные к ним файлы остались в исходной. Переносить сотни или тысячи файлов вручную — задача невыполнимая. В этой статье мы подробно разберем, как устроена система хранения файлов в современных конфигурациях и какими способами можно автоматизировать их перенос.
Прежде чем приступать к переносу, нам необходимо четко понимать, что именно мы собираемся переносить. Предварительно рекомендуется провести анализ прикрепленных файлов, чтобы оценить их количество, типы и владельцев. В конфигурациях на базе Библиотеки стандартных подсистем (БСП) файлы не хранятся внутри самого документа. Система использует сложную связку объектов. Проанализируем основные составляющие:
ЗаказКлиента) существует свой справочник, например, ЗаказыКлиентовПрисоединенныеФайлы. Именно здесь хранятся карточки файлов (имя, владелец, дата создания).ДвоичныеДанныеФайлов: Это «сердце» системы. Именно здесь в ресурсе с типом ХранилищеЗначения лежат сами файлы (бинарные данные), если в настройках базы не выбран перенос в тома на диске.СведенияОФайлах: Содержит техническую информацию: размер файла, расширение, признак зашифрованности и, что крайне важно, ХешСумма (MD5).ФайлыВРабочемКаталоге: Содержит данные о файлах, которые пользователи редактируют локально.Важный нюанс: если вы перенесете только справочник ПрисоединенныеФайлы, в базе-приемнике вы увидите список файлов в документах, но при попытке их открыть система выдаст ошибку: «Файл не найден».
Это самый простой и доступный способ для программиста. Рассмотрим по шагам, как выполнить перенос, если конфигурации абсолютно идентичны. Для этих целей отлично подойдет универсальная выгрузка и загрузка документов и регистров, которая также поддерживает возможности шифрования данных.
Воспользуемся типовой обработкой «Выгрузка и загрузка данных XML». Однако, если ваши конфигурации не полностью идентичны, стоит обратить внимание на адаптивную выгрузку и загрузку данных XML с гибкими отборами, которая позволяет более тонко настраивать процесс обмена. В отличие от обмена через КД 2.0, эти инструменты переносят данные «как есть», сохраняя UUID (УИД) объектов, что критически важно для связки файлов с документами-владельцами.
Проанализируем алгоритм действий:
[ИмяОбъекта]ПрисоединенныеФайлы.ДвоичныеДанныеФайлов и СведенияОФайлах.Если нам требуется более тонкая настройка (например, перенос только определенных файлов за конкретный период), мы можем написать небольшую обработку. Также можно использовать готовое решение для экспорта любых документов базы в JSON, которое сохраняет структуру данных и бизнес-логику. Рассмотрим пример кода для выгрузки данных справочника в формат JSON с использованием СериализаторXDTO.
Выясним, как программно подготовить данные для выгрузки:
&НаСервере
Функция ПолучитьДанныеДляВыгрузкиНаСервере()
ДанныеДляВыгрузки = Новый Соответствие();
// Выбираем файлы, привязанные к конкретным документам
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ЗаказыКлиентовПрисоединенныеФайлы ГДЕ ...";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекСпр = Выборка.Ссылка;
ДанныеДляВыгрузки.Вставить(XMLСтрока(ТекСпр),
Новый Структура("Объект", ЭлементВТекстJSON(ТекСпр)));
КонецЦикла;
Возврат ДанныеДляВыгрузки;
КонецФункции
Для корректного преобразования объекта в строку JSON воспользуемся следующим методом. Похожий подход реализует универсальный механизм выгрузки и загрузки картинок на базе БСП, который автоматизирует сопоставление файлов и объектов базы.
&НаСервере
Функция ЭлементВТекстJSON(Элем)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
// Используем СериализаторXDTO для сохранения структуры объекта 1С
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Элем.ПолучитьОбъект(), НазначениеТипаXML.Явное);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Важный момент при работе с бинарными данными: Регистр ДвоичныеДанныеФайлов содержит ресурс ХранилищеЗначения. При обычной сериализации в JSON эти данные могут быть потеряны или некорректно преобразованы. Рассмотрим, как правильно обработать двоичные данные. Нам необходимо принудительно извлечь ДвоичныеДанные из хранилища и преобразовать их в строку Base64.
Проанализируем ситуацию: что делать, если документы-владельцы в базах имеют разные УИДы? Например, если документы переносились не через XML, а создавались заново или через синхронизацию по номеру и дате.
В этом случае стандартная выгрузка/загрузка не сработает — файлы «потеряют» своих владельцев. Решение заключается в следующем:
Документы[ТипВладельца].НайтиПоНомеру(Номер, Дата).ВладелецФайла нового элемента справочника присоединенных файлов.Если объем файлов исчисляется гигабайтами, сериализация в XML или JSON станет крайне медленной и может привести к переполнению памяти. В таких случаях для контроля структуры каталогов на диске удобно использовать Xtree — инструмент для работы с файлами в виде дерева. Рассмотрим альтернативный путь — использование механизма томов БСП.
Алгоритм действий следующий:
ПереносФайловВТома. Все файлы «выгрузятся» из базы в сетевую папку.Резюмируем: Для идентичных баз оптимальным является использование Универсального обмена данными XML. Если же базы имеют различия в данных или требуется сложная логика отбора — используйте программную сериализацию через СериализаторXDTO, уделяя особое внимание ресурсам регистра ДвоичныеДанныеФайлов.