При переходе с конфигурации «Управление торговлей», редакция 10.3 на «Управление торговлей», редакция 11, одной из самых трудоемких задач является перенос медиа-данных — для этого есть комплексный перенос справочников и документов в УТ 11. В этой статье мы подробно разберем, как реализовать выгрузку и загрузку изображений номенклатуры, используя программный инструмент «Конвертация данных 2.1». Мы проанализируем архитектурные различия систем и выберем оптимальный метод переноса в зависимости от объема вашей базы.
Прежде чем приступать к написанию правил, давайте выясним причину сложности этой задачи. В УТ 10 изображения хранятся в справочнике ХранилищеДополнительнойИнформации. Данные файла находятся непосредственно внутри базы данных в реквизите типа ХранилищеЗначения.
В УТ 11 архитектура принципиально иная. Здесь используется подсистема БСП (Библиотека стандартных подсистем) «Присоединенные файлы». Для каждого основного объекта (например, справочника Номенклатура) существует вспомогательный справочник (НоменклатураПрисоединенныеФайлы). Более того, сами файлы могут храниться не в базе, а в томах на диске. Это различие требует от нас не простого сопоставления полей, а написания кода обработки данных в процессе конвертации.
Рассмотрим алгоритм, который считается наиболее стабильным для больших объемов данных. Суть метода заключается в том, что при выгрузке мы сохраняем картинки из базы в обычные файлы на диске, а в XML-файл обмена записываем только ссылки на эти файлы. Такой подход предлагает, например, рабочий алгоритм по переносу картинок. Разберем по шагам:
ПередВыгрузкой, мы извлекаем двоичные данные из ХранилищаЗначения.ХранилищеДополнительнойИнформации в качестве имени файла.Записать() для сохранения картинки в промежуточную папку.Пример кода для обработчика выгрузки:
// В обработчике ПередВыгрузкой ПКО Номенклатура
Если Источник.ОсновноеИзображение <> Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка() Тогда
КартинкаОбъект = Источник.ОсновноеИзображение.Хранилище.Получить();
Если ТипЗнч(КартинкаОбъект) = Тип("Картинка") Тогда
ИмяФайла = Строка(Источник.ОсновноеИзображение.УникальныйИдентификатор()) + ".jpg";
ПутьКФайлу = ПутьВыгрузкиКартинок + ИмяФайла;
КартинкаОбъект.Записать(ПутьКФайлу);
// Передаем имя файла в параметр, чтобы прочитать его при загрузке
ПередатьПараметр("ИмяФайлаКартинки", ИмяФайла);
КонецЕсли;
КонецЕсли;
При загрузке в УТ 11 нам нужно выполнить обратное действие: прочитать файл из папки и программно создать запись в справочнике НоменклатураПрисоединенныеФайлы. Проанализируем ситуацию: важно не просто записать данные, но и правильно заполнить реквизиты ТипХраненияФайла и Расширение.
Если объем картинок невелик (несколько сотен мегабайт), мы можем рассмотреть более простой вариант без использования промежуточных папок. Данные картинки кодируются в строку Base64 и помещаются прямо в XML-файл обмена.
Внимание: Выясним причину, почему этот метод опасен. При использовании стандартных обработок обмена на платформе 1С весь XML-файл может загружаться в оперативную память. Если в файле много тяжелых картинок в Base64, вы рискуете получить ошибку Out of memory.
Посмотрим на пример реализации этого метода:
// При выгрузке (ПКО Номенклатура, обработчик ПриВыгрузке)
ДвоичныеДанные = Источник.ОсновноеИзображение.Хранилище.Получить().ПолучитьДвоичныеДанные();
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
Значение = СтрокаBase64; // Записываем в дополнительный реквизит или параметр
После загрузки объекта в приемнике, нам потребуется выполнить преобразование обратно:
// При загрузке (ПКО Номенклатура, обработчик ПослеЗагрузки)
Если ПараметрыОбъекта <> Неопределено Тогда
СтрокаBase64 = ПараметрыОбъекта.Получить("КартинкаBase64");
Если ЗначениеЗаполнено(СтрокаBase64) Тогда
ДвоичныеДанные = Base64Значение(СтрокаBase64);
// Далее используем методы БСП для создания присоединенного файла
// Например: РаботаСФайлами.ДобавитьФайл(...)
КонецЕсли;
КонецЕсли;
Проанализируем важный нюанс: в УТ 11 недостаточно просто создать элемент справочника присоединенных файлов. Система ожидает, что работа с файлами идет через стандартизированные программные интерфейсы. Выясним, какие методы нам помогут.
Рекомендуется использовать программный интерфейс общего модуля ПрисоединенныеФайлы. Детально изучить доступные возможности можно, используя специальный справочник по методам БСП с примерами. Это гарантирует, что если в базе настроено хранение в томах на диске, файл физически попадет в нужную папку на сервере, а не «раздует» базу данных.
Пример программного создания файла в приемнике:
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяФайлаИсточник", "Картинка.jpg");
ПараметрыФайла.Вставить("Наименование", "Основное изображение");
// Используем метод БСП для корректного добавления
ПрисоединенныеФайлы.ДобавитьФайл(Объект.Ссылка, ПараметрыФайла, АдресВоВременномХранилище, "", "");
Такой подход, основанный на БСП, также применяется в универсальных механизмах для пакетной загрузки и выгрузки изображений, что доказывает его надежность.
Рассмотрим несколько рекомендаций, которые помогут сэкономить время и избежать ошибок:
pdf, doc или даже некорректные данные. Обязательно добавьте проверку ТипЗнч() перед обработкой.ХранилищаДополнительнойИнформации из УТ 10. Это позволит избежать дублирования картинок при повторной выгрузке.Таким образом, мы выяснили, что перенос картинок — это не просто настройка маппинга полей, а полноценная процедура трансформации данных. Используя метод с промежуточным каталогом и программные интерфейсы БСП, вы обеспечите стабильность и высокую скорость работы обмена. Если же у вас нет времени на разработку собственных правил, можно воспользоваться одним из готовых наборов для выгрузки номенклатуры с картинками — для этого подойдут правила переноса справочников и остатков через XML.