Перенос данных, связанных с хранением файлов, из конфигураций на обычных формах (например, УТ 10.3) в современные системы (УТ 11, КА 2.4, Розница 2.х) является одной из самых частых задач при обновлении IT-инфраструктуры. Основная сложность заключается в том, что в новых конфигурациях используется БСП (Библиотека стандартных подсистем), которая меняет архитектуру хранения файлов: теперь это не просто реквизит справочника, а сложная связка из справочника присоединенных файлов и регистра сведений для двоичных данных.
Разберем, как устроена работа с файлами в современных конфигурациях. Система строится на трех компонентах:
Номенклатура) имеется реквизит, например ФайлКартинки, который хранит ссылку на основной файл из справочника присоединенных файлов.Для корректного переноса необходимо настроить правила так, чтобы данные выгружались в правильной последовательности и связывались между собой. Рассмотрим реализацию логики в обработчике ПередВыгрузкой для объекта-владельца:
Запросы.ФайлыНоменклатуры.УстановитьПараметр("Номенклатура", Источник);
Выборка = Запросы.ФайлыНоменклатуры.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДХ = Выборка.ДвоичныеДанныеФайла.Получить();
Если ТипЗнч(ДХ) = Тип("Картинка") Тогда
Размер = ДХ.ПолучитьДвоичныеДанные().Размер();
ДвДанные = Новый ХранилищеЗначения(ДХ.ПолучитьДвоичныеДанные(), Новый СжатиеДанных(9));
Иначе
ДвДанные = ДХ;
Размер = Выборка.РазмерФайла;
КонецЕсли;
ДанныеПрисоединенногоФайла = Новый Структура ("Ссылка, Наименование, ВладелецФайла, Расширение, Размер, ПутьКФайлу, ФайлХранилище, Автор, ТипХраненияФайла, СтатусИзвлеченияТекста");
ЗаполнитьЗначенияСвойств(ДанныеПрисоединенногоФайла, Выборка);
ДанныеПрисоединенногоФайла.Расширение = РаботаСФайлами.ПолучитьРасширениеФайла(Выборка.ИмяФайла);
ДанныеПрисоединенногоФайла.ФайлХранилище = ДвДанные;
ДанныеПрисоединенногоФайла.Размер = Размер;
ДанныеПрисоединенногоФайла.ТипХраненияФайла = "ВИнформационнойБазе";
ВыгрузитьПоПравилу(ДанныеПрисоединенногоФайла, , , , "НоменклатураПрисоединенныеФайлы");
ДанныеРегистра = Новый Структура("ДвоичныеДанныеФайла, Активность, Файл");
ДанныеРегистра.Вставить("ДвоичныеДанныеФайла", ДвДанные);
ДанныеРегистра.Вставить("Активность", Истина);
ДанныеРегистра.Вставить("Файл", ДанныеПрисоединенногоФайла);
ВыгрузитьПоПравилу(ДанныеРегистра, , , , "ДвоичныеДанныеФайлов");
Значение = ДанныеПрисоединенногоФайла;
КонецЦикла;
После того как файлы загружены в приемник, необходимо обновить ссылку в объекте-владельце. Это удобнее всего делать в обработчике ПослеЗагрузкиДанных (конвертация):
ЗагруженныеОбъектыПереноса = Параметры.ЗагруженныеОбъектыПереноса;
Для Каждого СтрокаТаблицы Из ЗагруженныеОбъектыПереноса Цикл
Если СтрокаТаблицы.Объект.ЭтоНовый Тогда Продолжить; КонецЕсли;
Объект = СтрокаТаблицы.Объект.Ссылка.ПолучитьОбъект();
Если ОбъектМодифицирован Тогда
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
// Связываем номенклатуру с основным файлом картинки
Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
Ном = Объект.ВладелецФайла.Ссылка.ПолучитьОбъект();
Ном.ФайлКартинки = Объект.Ссылка;
Ном.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Картинка, обязательно вызывайте метод ПолучитьДвоичныеДанные(). Без этого файл в базе-приемнике будет поврежден или нечитаем.ПослеЗагрузки.ДвоичныеДанныеФайлов. Часто ошибка кроется в неправильной передаче двоичных данных в структуру перед вызовом ВыгрузитьПоПравилу.Значение в обработчиках ПередВыгрузкой или ПослеЗагрузки критически важно для корректной передачи ссылок между этапами конвертации в КД 2.1.Следуя этим шагам, вы сможете успешно перенести все графические материалы в новую конфигурацию, обеспечив корректную работу механизмов ПрисоединенныеФайлы и отображение картинок в карточках номенклатуры.