Как перенести картинки номенклатуры из УТ 10 в УТ 11 с помощью Конвертации данных?

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

При переходе с конфигурации «Управление торговлей», редакция 10.3 на «Управление торговлей», редакция 11, одной из самых трудоемких задач является перенос медиа-данных — для этого есть комплексный перенос справочников и документов в УТ 11. В этой статье мы подробно разберем, как реализовать выгрузку и загрузку изображений номенклатуры, используя программный инструмент «Конвертация данных 2.1». Мы проанализируем архитектурные различия систем и выберем оптимальный метод переноса в зависимости от объема вашей базы.

Разбор архитектурных различий хранения данных

Прежде чем приступать к написанию правил, давайте выясним причину сложности этой задачи. В УТ 10 изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Данные файла находятся непосредственно внутри базы данных в реквизите типа ХранилищеЗначения.

В УТ 11 архитектура принципиально иная. Здесь используется подсистема БСП (Библиотека стандартных подсистем) «Присоединенные файлы». Для каждого основного объекта (например, справочника Номенклатура) существует вспомогательный справочник (НоменклатураПрисоединенныеФайлы). Более того, сами файлы могут храниться не в базе, а в томах на диске. Это различие требует от нас не простого сопоставления полей, а написания кода обработки данных в процессе конвертации.

Способ №1: Использование временного каталога (самый надежный)

Рассмотрим алгоритм, который считается наиболее стабильным для больших объемов данных. Суть метода заключается в том, что при выгрузке мы сохраняем картинки из базы в обычные файлы на диске, а в XML-файл обмена записываем только ссылки на эти файлы. Такой подход предлагает, например, рабочий алгоритм по переносу картинок. Разберем по шагам:

  1. Подготовка при выгрузке: В правилах выгрузки данных (ПВД) или в ПКО номенклатуры, в обработчике ПередВыгрузкой, мы извлекаем двоичные данные из ХранилищаЗначения.
  2. Генерация имени файла: Чтобы избежать дублей, проанализируем использование Уникального Идентификатора (УИД) объекта ХранилищеДополнительнойИнформации в качестве имени файла.
  3. Сохранение на диск: Используем метод Записать() для сохранения картинки в промежуточную папку.

Пример кода для обработчика выгрузки:


// В обработчике ПередВыгрузкой ПКО Номенклатура
Если Источник.ОсновноеИзображение <> Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка() Тогда
    КартинкаОбъект = Источник.ОсновноеИзображение.Хранилище.Получить();
    Если ТипЗнч(КартинкаОбъект) = Тип("Картинка") Тогда
        ИмяФайла = Строка(Источник.ОсновноеИзображение.УникальныйИдентификатор()) + ".jpg";
        ПутьКФайлу = ПутьВыгрузкиКартинок + ИмяФайла;
        КартинкаОбъект.Записать(ПутьКФайлу);
        
        // Передаем имя файла в параметр, чтобы прочитать его при загрузке
        ПередатьПараметр("ИмяФайлаКартинки", ИмяФайла);
    КонецЕсли;
КонецЕсли;

При загрузке в УТ 11 нам нужно выполнить обратное действие: прочитать файл из папки и программно создать запись в справочнике НоменклатураПрисоединенныеФайлы. Проанализируем ситуацию: важно не просто записать данные, но и правильно заполнить реквизиты ТипХраненияФайла и Расширение.

Способ №2: Перенос через Base64 (для небольших баз)

Если объем картинок невелик (несколько сотен мегабайт), мы можем рассмотреть более простой вариант без использования промежуточных папок. Данные картинки кодируются в строку Base64 и помещаются прямо в XML-файл обмена.

Внимание: Выясним причину, почему этот метод опасен. При использовании стандартных обработок обмена на платформе 1С весь XML-файл может загружаться в оперативную память. Если в файле много тяжелых картинок в Base64, вы рискуете получить ошибку Out of memory.

Посмотрим на пример реализации этого метода:


// При выгрузке (ПКО Номенклатура, обработчик ПриВыгрузке)
ДвоичныеДанные = Источник.ОсновноеИзображение.Хранилище.Получить().ПолучитьДвоичныеДанные();
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
Значение = СтрокаBase64; // Записываем в дополнительный реквизит или параметр

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


// При загрузке (ПКО Номенклатура, обработчик ПослеЗагрузки)
Если ПараметрыОбъекта <> Неопределено Тогда
    СтрокаBase64 = ПараметрыОбъекта.Получить("КартинкаBase64");
    Если ЗначениеЗаполнено(СтрокаBase64) Тогда
        ДвоичныеДанные = Base64Значение(СтрокаBase64);
        // Далее используем методы БСП для создания присоединенного файла
        // Например: РаботаСФайлами.ДобавитьФайл(...)
    КонецЕсли;
КонецЕсли;

Особенности работы с БСП в УТ 11

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

Рекомендуется использовать программный интерфейс общего модуля ПрисоединенныеФайлы. Детально изучить доступные возможности можно, используя специальный справочник по методам БСП с примерами. Это гарантирует, что если в базе настроено хранение в томах на диске, файл физически попадет в нужную папку на сервере, а не «раздует» базу данных.

Пример программного создания файла в приемнике:


ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяФайлаИсточник", "Картинка.jpg");
ПараметрыФайла.Вставить("Наименование", "Основное изображение");

// Используем метод БСП для корректного добавления
ПрисоединенныеФайлы.ДобавитьФайл(Объект.Ссылка, ПараметрыФайла, АдресВоВременномХранилище, "", "");

Такой подход, основанный на БСП, также применяется в универсальных механизмах для пакетной загрузки и выгрузки изображений, что доказывает его надежность.

Практические советы по оптимизации переноса

Рассмотрим несколько рекомендаций, которые помогут сэкономить время и избежать ошибок:

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

← На главную