Объект 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
///////////////////////////////////////////////////////////////////////////////////////////////////////