ВыгрузкаОбъектаВыборки (БСП)

Автор: 1С
ОбщийМодуль.ОбменДаннымиXDTOСервер
БСП

Выгрузка объекта выборки. Выполняет выгрузку объекта информационной базы.

// Выполняет выгрузку объекта информационной базы.
//
// Параметры:
//  КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
//  Объект           - ЛюбаяСсылка - Ссылка на объект информационной базы.
//  ПравилоОбработки - СтрокаТаблицыЗначений - Строка таблицы значений правил обработки данных, 
//                     соответствующая правилу обработки типа выгружаемого объекта.
//                     Если ПравилоОбработки не задано, оно будет найдено по объекту метаданных выгружаемого объекта.
//
Процедура ВыгрузкаОбъектаВыборки(КомпонентыОбмена, Объект, ПравилоОбработки = Неопределено) Экспорт
	
	ОбъектСсылочногоТипа = (ТипЗнч(Объект) <> Тип("Структура"))
		И ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(Объект.Метаданные());
		
	Если (ТипЗнч(Объект) <> Тип("Структура"))
		И ПравилоОбработки = Неопределено Тогда
		ПолучитьПравилоОбработкиДляОбъекта(КомпонентыОбмена, Объект, ПравилоОбработки);
	КонецЕсли;
	
	КомпонентыОбмена.ВыгруженныеОбъекты.Добавить(?(ОбъектСсылочногоТипа, Объект.Ссылка, Объект));
	
	// Отработка ПОД
	ИспользованиеПКО = Новый Структура;
	Для Каждого ТекущийПКО Из ПравилоОбработки.ИспользуемыеПКО Цикл
		ИспользованиеПКО.Вставить(ТекущийПКО, Истина);
	КонецЦикла;
	
	ПрерватьОбработку = Ложь;
	ВзвестиФлагОшибки = Ложь;
	
	ПриОбработкеПОД(
		КомпонентыОбмена,
		ПравилоОбработки,
		Объект,
		ИспользованиеПКО,
		ПрерватьОбработку);
	
	Если ПрерватьОбработку Тогда
		ВзвестиФлагОшибки = Истина;
	КонецЕсли;
	
	Если Не ПрерватьОбработку Тогда
		// Отработка ПКО
		НесколькоПКО = (ИспользованиеПКО.Количество() > 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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПараметрыВыборки (БСП)

ПриВыгрузкеОбъекта (БСП)

ПослеВыгрузкиОбъекта (БСП)

ПередВыгрузкойОбъекта (БСП)

Выгрузка запроса в XML. Выгрузка объекта

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз