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