Как перенести картинки и присоединенные файлы из старых конфигураций в современные на управляемых формах?

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

Перенос данных, связанных с хранением файлов, из конфигураций на обычных формах (например, УТ 10.3) в современные системы (УТ 11, КА 2.4, Розница 2.х) является одной из самых частых задач при обновлении IT-инфраструктуры. Основная сложность заключается в том, что в новых конфигурациях используется БСП (Библиотека стандартных подсистем), которая меняет архитектуру хранения файлов: теперь это не просто реквизит справочника, а сложная связка из справочника присоединенных файлов и регистра сведений для двоичных данных.

Понимание архитектуры хранения файлов

Разберем, как устроена работа с файлами в современных конфигурациях. Система строится на трех компонентах:

  1. Справочник присоединенных файлов: содержит метаданные (имя файла, расширение, ссылку на владельца).
  2. Регистр сведений «Двоичные данные файлов»: хранит само содержимое файла в двоичном виде.
  3. Реквизит владельца: в объекте (например, Номенклатура) имеется реквизит, например ФайлКартинки, который хранит ссылку на основной файл из справочника присоединенных файлов.

Алгоритм выгрузки данных через КД 2.1

Для корректного переноса необходимо настроить правила так, чтобы данные выгружались в правильной последовательности и связывались между собой. Рассмотрим реализацию логики в обработчике ПередВыгрузкой для объекта-владельца:


Запросы.ФайлыНоменклатуры.УстановитьПараметр("Номенклатура", Источник);
Выборка = Запросы.ФайлыНоменклатуры.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ДХ = Выборка.ДвоичныеДанныеФайла.Получить();
    Если ТипЗнч(ДХ) = Тип("Картинка") Тогда
        Размер = ДХ.ПолучитьДвоичныеДанные().Размер();
        ДвДанные = Новый ХранилищеЗначения(ДХ.ПолучитьДвоичныеДанные(), Новый СжатиеДанных(9));
    Иначе
        ДвДанные = ДХ;
        Размер = Выборка.РазмерФайла;
    КонецЕсли;

    ДанныеПрисоединенногоФайла = Новый Структура ("Ссылка, Наименование, ВладелецФайла, Расширение, Размер, ПутьКФайлу, ФайлХранилище, Автор, ТипХраненияФайла, СтатусИзвлеченияТекста");
    ЗаполнитьЗначенияСвойств(ДанныеПрисоединенногоФайла, Выборка);
    ДанныеПрисоединенногоФайла.Расширение = РаботаСФайлами.ПолучитьРасширениеФайла(Выборка.ИмяФайла);
    ДанныеПрисоединенногоФайла.ФайлХранилище = ДвДанные;
    ДанныеПрисоединенногоФайла.Размер = Размер;
    ДанныеПрисоединенногоФайла.ТипХраненияФайла = "ВИнформационнойБазе";
    
    ВыгрузитьПоПравилу(ДанныеПрисоединенногоФайла, , , , "НоменклатураПрисоединенныеФайлы");

    ДанныеРегистра = Новый Структура("ДвоичныеДанныеФайла, Активность, Файл");
    ДанныеРегистра.Вставить("ДвоичныеДанныеФайла", ДвДанные);
    ДанныеРегистра.Вставить("Активность", Истина);
    ДанныеРегистра.Вставить("Файл", ДанныеПрисоединенногоФайла);
    ВыгрузитьПоПравилу(ДанныеРегистра, , , , "ДвоичныеДанныеФайлов");
    
    Значение = ДанныеПрисоединенногоФайла;
КонецЦикла;

Завершение загрузки и связывание данных

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


ЗагруженныеОбъектыПереноса = Параметры.ЗагруженныеОбъектыПереноса;
Для Каждого СтрокаТаблицы Из ЗагруженныеОбъектыПереноса Цикл
    Если СтрокаТаблицы.Объект.ЭтоНовый Тогда Продолжить; КонецЕсли;
    
    Объект = СтрокаТаблицы.Объект.Ссылка.ПолучитьОбъект();
    
    Если ОбъектМодифицирован Тогда
        Объект.ОбменДанными.Загрузка = Истина;
        Объект.Записать();
        
        // Связываем номенклатуру с основным файлом картинки
        Если ЗначениеЗаполнено(Объект.ВладелецФайла) Тогда
            Ном = Объект.ВладелецФайла.Ссылка.ПолучитьОбъект();
            Ном.ФайлКартинки = Объект.Ссылка;
            Ном.Записать();
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Ключевые рекомендации по решению проблем

  1. Типизация данных: Всегда проверяйте, что именно лежит в хранилище. Если вы получаете объект типа Картинка, обязательно вызывайте метод ПолучитьДвоичныеДанные(). Без этого файл в базе-приемнике будет поврежден или нечитаем.
  2. Последовательность выгрузки: Соблюдайте порядок: сначала метаданные файла, затем бинарные данные, и в самом конце — обновление ссылки в объекте-владельце через ПослеЗагрузки.
  3. Отладка: Если файл загружается, но не открывается, проверьте размер и содержимое в регистре ДвоичныеДанныеФайлов. Часто ошибка кроется в неправильной передаче двоичных данных в структуру перед вызовом ВыгрузитьПоПравилу.
  4. Значение: Использование переменной Значение в обработчиках ПередВыгрузкой или ПослеЗагрузки критически важно для корректной передачи ссылок между этапами конвертации в КД 2.1.

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

← На главную