ОбъектXDTOИзДанныхXDTO (БСП)

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

Объект xdto из данных xdto. Выполняет преобразование структуры с данными в объект XDTO указанного типа в соответствии с правилами.

// Выполняет преобразование структуры с данными в объект XDTO указанного типа в соответствии с правилами.
//
// Параметры:
//  КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
//  Источник         - Структура - источник данных, которые необходимо преобразовать в объект XDTO.
//  ТипXDTO          - Строка - тип объекта или тип значения XDTO, к которому надо преобразовать данные.
//  Приемник         - ОбъектXDTO - объект, в который будет помещен результат.
//  СсылкиИзОбъекта  - Массив - содержит общий список выгруженных по ссылкам объектов.
//  ПроведеноЗаполнениеСвойств - Булево - параметр для определения заполненности общих составных свойств.
//
// Возвращаемое значение:
//  ОбъектXDTO - результат преобразования. 
// 
Функция ОбъектXDTOИзДанныхXDTO(
		КомпонентыОбмена,
		Знач Источник,
		Знач ТипXDTO,
		Приемник = Неопределено,
		СсылкиИзОбъекта = Неопределено,
		ПроведеноЗаполнениеСвойств = Ложь) Экспорт
	
	Если СсылкиИзОбъекта = Неопределено Тогда
		СсылкиИзОбъекта = Новый Массив;
	КонецЕсли;
	
	Если Приемник = Неопределено Тогда
		Приемник = ФабрикаXDTO.Создать(ТипXDTO);
	КонецЕсли;
	
	Для Каждого Свойство Из ТипXDTO.Свойства Цикл
		
		ЗначениеСвойства = Неопределено;
		СвойствоНайдено = Ложь;
		
		Если ТипЗнч(Источник) = Тип("Структура") Тогда
			СвойствоНайдено = Источник.Свойство(Свойство.Имя, ЗначениеСвойства);
		ИначеЕсли ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений")
			И Источник.Владелец().Колонки.Найти(Свойство.Имя) <> Неопределено Тогда
			СвойствоНайдено = Истина;
			ЗначениеСвойства = Источник[Свойство.Имя];
		КонецЕсли;
		
		ТипСвойства = Неопределено;
		Если ТипЗнч(Свойство.Тип) = Тип("ТипЗначенияXDTO") Тогда
			ТипСвойства = "ОбычноеСвойство";
		ИначеЕсли ТипЗнч(Свойство.Тип) = Тип("ТипОбъектаXDTO") Тогда
			
			Если Свойство.Имя = "AdditionalInfo" Тогда
				ТипСвойства = "AdditionalInfo";
			ИначеЕсли ЭтоТаблицаОбъекта(Свойство) Тогда
				ТипСвойства = "Таблица";
			ИначеЕсли Свойство.Имя = "КлючевыеСвойства"
				Или СтрНайти(Свойство.Тип.Имя, "КлючевыеСвойства") > 0 Тогда
				ТипСвойства = "КлючевыеСвойства";
			Иначе
				Если СвойствоНайдено Тогда
					Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") 
						И (ЗначениеСвойства.Свойство("Значение")
							Или СтрНайти(СокрЛП(Свойство.Тип), "ОбщиеСвойства") > 0) Тогда
						ТипСвойства = "ОбщееСоставноеСвойство";
					Иначе
						ТипСвойства = "СвойствоСоставногоТипа";
					КонецЕсли;
				Иначе
					ТипСвойства = "ОбщееСоставноеСвойство";
				КонецЕсли;
			КонецЕсли;
			
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Неизвестный тип свойства <%1>. Тип объекта: %2'"),
				Свойство.Имя,
				Строка(ТипXDTO));
		КонецЕсли;
		
		Попытка
			Если ТипСвойства = "ОбщееСоставноеСвойство" Тогда
				
				ПроведеноЗаполнениеВложенныхСвойств = Ложь;
				Если ТипЗнч(Источник) = Тип("Структура") И СвойствоНайдено Тогда
					ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, 
						Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
				Иначе
					ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Источник, 
						Свойство.Тип,, СсылкиИзОбъекта, ПроведеноЗаполнениеВложенныхСвойств);
				КонецЕсли;
				
				Если Не ПроведеноЗаполнениеВложенныхСвойств Тогда
					Продолжить;
				КонецЕсли;
				
			Иначе
				
				Если Не СвойствоНайдено Тогда
					Продолжить;
				КонецЕсли;
				
				// Проверка на заполненность.
				Если ЗначениеСвойства = Null
					Или Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда
					
					Если Свойство.ВозможноПустое Тогда
						Приемник[Свойство.Имя] = Неопределено;
					КонецЕсли;
					
					Продолжить;
					
				КонецЕсли;
				
				ЗначениеXDTO = Неопределено;
				Если ТипСвойства = "КлючевыеСвойства" Тогда
					ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип,,СсылкиИзОбъекта);
				ИначеЕсли ТипСвойства = "ОбычноеСвойство" Тогда
					
					Если ЭтоСсылкаXDTO(Свойство.Тип) Тогда // Конвертация ссылки
						
						ЗначениеXDTO = КонвертироватьСсылкуВXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип);
						
						Если СсылкиИзОбъекта.Найти(ЗначениеСвойства) = Неопределено Тогда
							СсылкиИзОбъекта.Добавить(ЗначениеСвойства);
						КонецЕсли;
						
					ИначеЕсли Свойство.Тип.Фасеты <> Неопределено
						И Свойство.Тип.Фасеты.Перечисления <> Неопределено
						И Свойство.Тип.Фасеты.Перечисления.Количество() > 0 Тогда // Конвертация перечисления
						ЗначениеXDTO = КонвертироватьПеречислениеВXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип);
					Иначе // Конвертация обычного значения.
						ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип, ЗначениеСвойства);
					КонецЕсли;
				ИначеЕсли ТипСвойства = "AdditionalInfo" Тогда
					ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);
					
				ИначеЕсли ТипСвойства = "Таблица" Тогда
					
					ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип);
					
					ТипТаблицы = Свойство.Тип.Свойства[0].Тип;
					
					ИмяСвойстваСтроки = Свойство.Тип.Свойства[0].Имя;
					
					Для Каждого ИсточникСтрока Из ЗначениеСвойства Цикл
						
						ПриемникСтрока = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ИсточникСтрока, ТипТаблицы,,СсылкиИзОбъекта);
						
						ЗначениеXDTO[ИмяСвойстваСтроки].Добавить(ПриемникСтрока);
						
					КонецЦикла;
					
				ИначеЕсли ТипСвойства = "СвойствоСоставногоТипа" Тогда
					
					Для Каждого СвойствоСоставногоТипа Из Свойство.Тип.Свойства Цикл
						
						СоставноеЗначениеXDTO = Неопределено;
						Если ТипЗнч(ЗначениеСвойства) = Тип("Структура")
							И ЗначениеСвойства.ТипСоставногоСвойства = СвойствоСоставногоТипа.Тип Тогда
							
							// Свойство составного типа, содержащие элементы только типа КлючевыеСвойства.
							СоставноеЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, СвойствоСоставногоТипа.Тип,,СсылкиИзОбъекта);
						// Свойство составного типа простое, и значение простое.
						ИначеЕсли (ТипЗнч(ЗначениеСвойства) = Тип("Строка")
							И СтрНайти(СвойствоСоставногоТипа.Тип.Имя,"string")>0)
							ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Число")
							И СтрНайти(СвойствоСоставногоТипа.Тип.Имя,"decimal")>0)
							ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Булево")
							И СтрНайти(СвойствоСоставногоТипа.Тип.Имя,"boolean")>0)
							ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Дата")
							И СтрНайти(СвойствоСоставногоТипа.Тип.Имя,"date")>0) Тогда
							СоставноеЗначениеXDTO = ЗначениеСвойства;

						ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Строка")
							И ТипЗнч(СвойствоСоставногоТипа.Тип) = Тип("ТипЗначенияXDTO")
							И СвойствоСоставногоТипа.Тип.Фасеты <> Неопределено Тогда
							Если СвойствоСоставногоТипа.Тип.Фасеты.Количество() = 0 Тогда
								СоставноеЗначениеXDTO = ЗначениеСвойства;
							Иначе
								
								Для Каждого Фасет Из СвойствоСоставногоТипа.Тип.Фасеты Цикл
									Если Фасет.Значение = ЗначениеСвойства Тогда
										СоставноеЗначениеXDTO = ЗначениеСвойства;
										Прервать;
									КонецЕсли;
								КонецЦикла;
								
							КонецЕсли;
						КонецЕсли;
						
						Если СоставноеЗначениеXDTO <> Неопределено Тогда
							Прервать;
						КонецЕсли;
						
					КонецЦикла;
					
					// Если передается значение с типом, которое не поддерживается в формате - не передаем.
					Если СоставноеЗначениеXDTO = Неопределено Тогда
						Продолжить;
					КонецЕсли;
					
					ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип);
					ЗначениеXDTO.Установить(СвойствоСоставногоТипа, СоставноеЗначениеXDTO);
				КонецЕсли;
				
			КонецЕсли;
		Исключение
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Ошибка формирования объекта XDTO: Тип свойства <%1>. Имя свойства: <%2>.
				|
				|%3'"),
				ТипСвойства,
				Свойство.Имя,
				ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
		
		Приемник[Свойство.Имя] = ЗначениеXDTO;
		ПроведеноЗаполнениеСвойств = Истина;
		
	КонецЦикла;
	
	Возврат Приемник;
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

ДанныеОбъектаНеУстановлены (БСП)

ЕстьПравоЧтенияДанныхВерсийОбъектов (БСП)

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

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

УдалитьДанные (БСП)

СериализоватьОбъект (БСП)

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

ОбъектXDTOВСтруктуру (БСП)

ЕстьСсылкиНаОбъект (БСП)

Синтакс-помощник БСП