Как исправить ошибки при переносе изображений номенклатуры в 1С через «Конвертацию данных 2.0»

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

Перенос изображений и присоединенных файлов между конфигурациями 1С — одна из самых трудоемких задач при переходе с обычных форм на управляемые. Основная сложность заключается в том, что в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) файлы хранятся не в реквизитах справочника, а в виде отдельных сущностей и записей в регистрах сведений. Разберем типичные ошибки, возникающие при использовании универсального обмена данными (XML), и найдем способы их решения.

Анализ ошибки: Поле объекта не обнаружено (Алгоритм)

Рассмотрим ситуацию, когда при загрузке данных возникает ошибка вида: Ошибка в обработчике события ПослеЗагрузкиОбъекта ИмяПКО = ФайлыНоменклатуры ... ОписаниеОшибки = Поле объекта не обнаружено (ИмяАлгоритма). Это происходит в тот момент, когда код пытается вызвать глобальный алгоритм через конструкцию Выполнить(Алгоритмы.ИмяВашегоАлгоритма).

Выясним причину: В конфигурации «Конвертация данных 2.0» (КД) для каждого алгоритма предусмотрены флаги использования. Если для алгоритма установлен флаг «Используется при выгрузке», но снят флаг «Используется при загрузке», то при выполнении обмена в базе-приемнике структура Алгоритмы просто не будет содержать соответствующего ключа. Программа попытается обратиться к отсутствующему свойству, что и вызовет сбой.

Проанализируем шаги для исправления:

  1. Откроем информационную базу «Конвертация данных».
  2. Найдем в дереве метаданных раздел «Алгоритмы».
  3. Выберем алгоритм ПослеЗагрузкиПрисоединенногоФайла (или аналогичный по смыслу).
  4. Убедимся, что установлена галочка «Используется при загрузке».
  5. Сохраним изменения и заново выгрузим правила обмена.

Инициализация таблицы параметров загрузки

Вторая частая проблема — ошибка Поле объекта не обнаружено (ЗагруженныеОбъектыПереноса). Она возникает в обработчике ПослеЗагрузкиОбъекта, когда мы пытаемся добавить информацию о созданном объекте в таблицу для последующей отложенной обработки.

Посмотрим на пример кода, который вызывает ошибку:


// Попытка обращения к параметру, который не был инициализирован
НоваяСтрока = Параметры.ЗагруженныеОбъектыПереноса.Добавить();
НоваяСтрока.ИмяПКО = "ФайлыНоменклатуры";
НоваяСтрока.Объект = Объект;

Чтобы этот код заработал, необходимо инициализировать таблицу значений в глобальном обработчике ПередЗагрузкойДанных. Рассмотрим, как правильно подготовить структуру параметров:


// Обработчик: ПередЗагрузкойДанных
ЗагруженныеОбъекты = Новый ТаблицаЗначений;
ЗагруженныеОбъекты.Колонки.Добавить("ИмяПКО");
ЗагруженныеОбъекты.Колонки.Добавить("Объект");
ЗагруженныеОбъекты.Колонки.Добавить("Параметры");

// Добавляем таблицу в общую структуру параметров загрузки
Параметры.Вставить("ЗагруженныеОбъектыПереноса", ЗагруженныеОбъекты);

Решение ошибки: Значение не является значением объектного типа (Отбор)

Когда данные уже загружены, часто требуется выполнить постобработку (например, связать файл с владельцем или прописать его в регистр двоичных данных). Если при этом возникает ошибка с упоминанием (Отбор), это сигнализирует о некорректной работе с наборами записей или обращении к «битым» ссылкам.

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


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

    Объект = СтрокаТаблицы.Объект.Ссылка.ПолучитьОбъект();
    Если Объект = Неопределено Тогда
        Продолжить; // Объект мог быть удален или не записан
    КонецЕсли;

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

Особенности переноса «Присоединенных файлов» в БСП

При переносе изображений в конфигурации на управляемых формах важно понимать архитектуру подсистемы «Присоединенные файлы». Просто создать элемент справочника НоменклатураПрисоединенныеФайлы недостаточно — изображение не появится на форме.

Рассмотрим по шагам, что нужно сделать в обработчике ПослеЗагрузкиОбъекта:

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

Пример заполнения реквизитов в алгоритме:


Объект.Автор = ПараметрыСеанса.ТекущийПользователь;
Объект.ДатаСоздания = ТекущаяДата();
Объект.ДатаМодификацииУниверсальная = УниверсальноеВремя(ТекущаяДата());
Объект.Изменил = ПараметрыСеанса.ТекущийПользователь;
Объект.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Объект.Расширение);

Оптимизация производительности при переносе больших объемов

Перенос картинок сильно увеличивает размер XML-файла из-за кодирования в Base64. Чтобы избежать переполнения памяти при загрузке, воспользуемся следующими советами:

Соблюдение этих правил и корректная настройка флагов в КД 2.0 позволят вам успешно завершить перенос изображений номенклатуры без критических ошибок загрузки.

← На главную