Выгрузка объекта выборки. Выполняет выгрузку объекта информационной базы.
// Выполняет выгрузку объекта информационной базы.
//
// Параметры:
// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
// Объект - ЛюбаяСсылка - Ссылка на объект информационной базы.
// ПравилоОбработки - СтрокаТаблицыЗначений - Строка таблицы значений правил обработки данных,
// соответствующая правилу обработки типа выгружаемого объекта.
// Если ПравилоОбработки не задано, оно будет найдено по объекту метаданных выгружаемого объекта.
//
Процедура ВыгрузкаОбъектаВыборки(КомпонентыОбмена, Объект, ПравилоОбработки = Неопределено) Экспорт
ОбъектСсылочногоТипа = (ТипЗнч(Объект) <> Тип("Структура"))
И ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(Объект.Метаданные());
Если (ТипЗнч(Объект) <> Тип("Структура"))
И ПравилоОбработки = Неопределено Тогда
ПолучитьПравилоОбработкиДляОбъекта(КомпонентыОбмена, Объект, ПравилоОбработки);
КонецЕсли;
КомпонентыОбмена.ВыгруженныеОбъекты.Добавить(?(ОбъектСсылочногоТипа, Объект.Ссылка, Объект));
// Отработка ПОД
ИспользованиеПКО = Новый Структура;
Для Каждого ТекущийПКО Из ПравилоОбработки.ИспользуемыеПКО Цикл
ИспользованиеПКО.Вставить(ТекущийПКО, Истина);
КонецЦикла;
ПрерватьОбработку = Ложь;
ВзвестиФлагОшибки = Ложь;
ПриОбработкеПОД(
КомпонентыОбмена,
ПравилоОбработки,
Объект,
ИспользованиеПКО,
ПрерватьОбработку);
Если ПрерватьОбработку Тогда
ВзвестиФлагОшибки = Истина;
КонецЕсли;
Если Не ПрерватьОбработку Тогда
// Отработка ПКО
НесколькоПКО = (ИспользованиеПКО.Количество() > 1);
ЕстьКолонкаОчисткаДанных = КомпонентыОбмена.ПравилаОбработкиДанных.Колонки.Найти("ОчисткаДанных") <> Неопределено;
Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО");
Если ПравилоКонвертации = Неопределено Тогда
// Допустимо указание ПКО, не предназначенного для текущей версии формата данных.
Продолжить;
КонецЕсли;
Если Не ОбъектФорматаПроходитПоФильтруXDTO(КомпонентыОбмена, ПравилоКонвертации.ОбъектФормата) Тогда
Продолжить;
КонецЕсли;
Если Не ТекущееПКО.Значение Тогда
// Если правил конвертации несколько, и некоторые из них не используются -
// необходимо выгрузить удаление объекта на случай если ранее он был выгружен по этим правилам.
Если НесколькоПКО
И ОбъектСсылочногоТипа
И (Не ЕстьКолонкаОчисткаДанных
Или ПравилоОбработки.ОчисткаДанных) Тогда
ВыгрузитьУдаление(КомпонентыОбмена, Объект.Ссылка, ПравилоКонвертации);
КонецЕсли;
Продолжить;
КонецЕсли;
ПропуститьОбработку = Ложь;
Попытка
// 2. Конвертируем Данные в Структуру по правилам конвертации.
ДанныеXDTO = ДанныеXDTOИзДанныхИБ(КомпонентыОбмена, Объект, ПравилоКонвертации, Неопределено);
Если ДанныеXDTO = Неопределено Тогда
Продолжить;
КонецЕсли;
// 3. Конвертируем Структуру в ОбъектXDTO.
СсылкиИзОбъекта = Новый Массив;
ОбъектXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ДанныеXDTO, ПравилоКонвертации.ТипXDTO, , СсылкиИзОбъекта);
Исключение
ПропуститьОбработку = Истина;
ВзвестиФлагОшибки = Истина;
ОписаниеОшибки = ОписаниеОшибкиПКО(
КомпонентыОбмена.НаправлениеОбмена,
ПравилоОбработки.Имя,
ПравилоКонвертации.ИмяПКО,
ПредставлениеОбъектаДляПротокола(Объект),
ИнформацияОбОшибке());
ЗафиксироватьПроблемуПриОбработкеОбъекта(КомпонентыОбмена,
Объект,
Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных,
ОписаниеОшибки.ПодробноеПредставление,
ОписаниеОшибки.КраткоеПредставление);
КонецПопытки;
Если Не ПропуститьОбработку Тогда
ОшибкаПроверкиПоСхеме = Ложь;
ОписаниеОшибкиПроверкиПоСхеме = Неопределено;
Контекст = Новый Структура;
Контекст.Вставить("НаправлениеОбмена", КомпонентыОбмена.НаправлениеОбмена);
Контекст.Вставить("ИмяПОД", ПравилоОбработки.Имя);
Контекст.Вставить("ИмяПКО", ПравилоКонвертации.ИмяПКО);
Контекст.Вставить("ПредставлениеОбъекта", ПредставлениеОбъектаДляПротокола(Объект));
ПроверитьОбъектXDTOПоСхеме(ОбъектXDTO, ПравилоКонвертации.ТипXDTO, Контекст, ОшибкаПроверкиПоСхеме, ОписаниеОшибкиПроверкиПоСхеме);
Если ОшибкаПроверкиПоСхеме Тогда
ПропуститьОбработку = Истина;
ЗафиксироватьПроблемуПриОбработкеОбъекта(КомпонентыОбмена,
Объект,
Перечисления.ТипыПроблемОбменаДанными.ОшибкаПроверкиСконвертированногоОбъекта,
ОписаниеОшибкиПроверкиПоСхеме.ПодробноеПредставление,
ОписаниеОшибкиПроверкиПоСхеме.КраткоеПредставление);
КонецЕсли;
КонецЕсли;
Если ПропуститьОбработку Тогда
ПрерватьОбработку = Истина;
Продолжить;
КонецЕсли;
ВыгрузитьОбъектыПоСсылке(КомпонентыОбмена, СсылкиИзОбъекта);
// 4. Записываем ОбъектXDTO в XML-файл.
ФабрикаXDTO.ЗаписатьXML(КомпонентыОбмена.ФайлОбмена, ОбъектXDTO);
КонецЦикла;
КонецЕсли;
Если ПрерватьОбработку Тогда
КомпонентыОбмена.НеВыгруженныеОбъекты.Добавить(?(ОбъектСсылочногоТипа, Объект.Ссылка, Объект));
КонецЕсли;
Если ВзвестиФлагОшибки Тогда
КомпонентыОбмена.ФлагОшибки = Истина;
КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)