Структура из Объекта XDTO

1. FilatovRA 174 25.06.18 19:12 Сейчас в теме
Данная функция преобразует объектXDTO в структуру. Сохраняю как шпаргалку.
&НаСервере
Функция ЗаписатьОбъектXDTOВСтруктуру(ОбъектXDTOДляПреобразования, СтруктураРезультат, РазделительВложений = "_", РазделительЭлементовСписков = "-", ТекущийИндексВложенногоСписка = 0) Экспорт
		
	КоллекцияСвойствXDTO = ОбъектXDTOДляПреобразования.Свойства();
	
	Для Каждого ЭлементКоллекции Из  КоллекцияСвойствXDTO Цикл
		
		ЭтоЭлементСписка = ЭлементКоллекции.ВерхняяГраница <> 1;
		
		Если ЭтоЭлементСписка Тогда
				ЗаполнитьСтруктуруСпискомРекурсивно(ОбъектXDTOДляПреобразования[ЭлементКоллекции.Имя], РазделительВложений, РазделительЭлементовСписков,  СтруктураРезультат);		
			Продолжить;
		КонецЕсли; 
		
		Если ТипЗнч(ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
			
			Префикс = ЭлементКоллекции.Имя;
			ЗаполнитьСтруктуруОбъектомРекурсивно(ОбъектXDTOДляПреобразования.ПолучитьXDTO(ЭлементКоллекции.Имя), Префикс, СтруктураРезультат);
			Продолжить;
			
		КонецЕсли;
		
		ИмяЭлементаКоллекции      = ?(ТекущийИндексВложенногоСписка=0,ЭлементКоллекции.Имя, ЭлементКоллекции.Имя + РазделительВложений + ТекущийИндексВложенногоСписка);
		ЗначениеЭлементаКоллекции =  ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции);
		СтруктураРезультат.Вставить(ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
		
	КонецЦикла;
		
	Возврат СтруктураРезультат;
	
КонецФункции // ()

&НаСервере
Процедура ЗаполнитьСтруктуруСпискомРекурсивно(СписокXDTOДляЗаписи, Префикс, РазделительЭлементовСписков, СтруктураРезультат);

	ТекущийИндексВложенногоСписка = 1;
	Для каждого ЭлементСписка Из СписокXDTOДляЗаписи  Цикл
		ЗаписатьОбъектXDTOВСтруктуру(ЭлементСписка, СтруктураРезультат, , Префикс, ТекущийИндексВложенногоСписка);
		ТекущийИндексВложенногоСписка = ТекущийИндексВложенногоСписка + 1;
	КонецЦикла; 
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции, Префикс, СтруктураРезультат);
	
	КоллекцияСвойствXDTO = ЭлементКоллекции.Свойства();
	
	Для Каждого влЭлементКоллекции Из КоллекцияСвойствXDTO Цикл
		Если ТипЗнч(ЭлементКоллекции.Получить(влЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
			
			ПрефиксВложенный = Префикс + "_" + влЭлементКоллекции.Имя;
			ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции.ПолучитьXDTO(влЭлементКоллекции.Имя), ПрефиксВложенный, СтруктураРезультат);
			Продолжить;
		КонецЕсли;
		
		
		ИмяЭлементаКоллекции  = влЭлементКоллекции.Имя;
		ЗначениеЭлементаКоллекции =  ЭлементКоллекции.Получить(ИмяЭлементаКоллекции);
		СтруктураРезультат.Вставить(Префикс + "_" + ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
		
	КонецЦикла;
	
	
КонецПроцедуры 
Показать
ya.Avoronov; user598655_ilia-bers; beardlyhich; Chif13; vadim.semyonov.rzn; juliia1992; e-9; +7 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ЧерныйКот 25.06.18 19:32 Сейчас в теме
дополню своей функцией, обратной
ДанныеОбъекта - Структура, Массив, СписокЗначений произвольной вложенности, значения любых типов
функция возвращает объект XDTO, с инициализированными свойствами, значениями из ДанныеОбъекта


Функция ПолучитьОбъектXDTO(ФабрикаXD, ТипXDTO, ДанныеОбъекта) Экспорт
	
	Если ТипЗнч(ТипXDTO) = Тип("ТипОбъектаXDTO") Тогда
		ОбъектXDTO = ФабрикаXD.Создать(ТипXDTO);
		
		Если ТипЗнч(ДанныеОбъекта) = Тип("СписокЗначений") Тогда
			Последовательность = ОбъектXDTO.Последовательность();
			Для Каждого ЭлСписка Из ДанныеОбъекта Цикл
				Если ТипЗнч(ЭлСписка.Значение) = Тип("Структура") Тогда
					Для Каждого Эл Из ЭлСписка.Значение Цикл
						Свойство = ТипXDTO.Свойства.Получить(Эл.Ключ);
						Если Свойство = Неопределено Тогда
							Продолжить;
						КонецЕсли;
						ЗначениеСвойства = Эл.Значение;
						Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда
							ЗначениеСвойства = ПолучитьОбъектXDTO(ФабрикаXD, Свойство.Тип, ЗначениеСвойства);
							Последовательность.Добавить(Свойство, ЗначениеСвойства);
						Иначе
							Последовательность.Добавить(Свойство, ЗначениеСвойства);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
			
			Возврат ОбъектXDTO;
		КонецЕсли;
		
		Для Каждого Эл Из ДанныеОбъекта Цикл
			Свойство = ТипXDTO.Свойства.Получить(Эл.Ключ);
			Если Свойство = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ЗначениеСвойства = Эл.Значение;
			Если ЗначениеСвойства = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда // объект
				ЗначениеСвойства = ПолучитьОбъектXDTO(ФабрикаXD, Свойство.Тип, ЗначениеСвойства);
				ОбъектXDTO.Установить(Свойство, ЗначениеСвойства);
			ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Массив") Тогда // список 
				Список = ОбъектXDTO.ПолучитьСписок(Эл.Ключ);
				Для Каждого ЭлСписка Из ЗначениеСвойства Цикл
					Если ТипЗнч(ЭлСписка) = Тип("Структура") ИЛИ ТипЗнч(ЭлСписка) = Тип("СписокЗначений") Тогда
						ЗначениеСвойства = ПолучитьОбъектXDTO(ФабрикаXD, Свойство.Тип, ЭлСписка);
						Список.Добавить(ЗначениеСвойства);
					Иначе
						Список.Добавить(ЭлСписка);
					КонецЕсли;
				КонецЦикла;
			ИначеЕсли Свойство.ВерхняяГраница = -1 Тогда // список XDTO
				Список = ОбъектXDTO.ПолучитьСписок(Эл.Ключ);
				Если ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда 
					Для Каждого ЭлСписка Из ЗначениеСвойства Цикл
						Список.Добавить(ЭлСписка);
					КонецЦикла;
				Иначе
					Список.Добавить(ЗначениеСвойства);
				КонецЕсли;
			Иначе  // значение
				ОбъектXDTO.Установить(Свойство, ЗначениеСвойства);
			КонецЕсли;
		КонецЦикла;
		Возврат ОбъектXDTO;
	Иначе
		ЗначениеXDTO = ФабрикаXD.Создать(ТипXDTO);
		Возврат ЗначениеXDTO;
	КонецЕсли;
	
КонецФункции


Показать
Chif13; FilatovRA; +2 Ответить
3. e-9 60 11.10.18 17:33 Сейчас в теме
Славно! спасибо огромное, позаимствовал.
...Вставлю и свои 5 копеек: чтобы не вываливаться с ошибкой вида
Несоответствие свойства и элемента данных XDTO:
Свойство: 'РозничныеНадбавки'
Свойство является списковым

,надо в процедуру ЗаполнитьСтруктуруОбъектомРекурсивно() добавить обработку случая (с помощью метода ПолучитьСписок()), когда ВЛОЖЕННОЕ свойство является списком. В итоге должно получиться что-то вроде:

Процедура ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции, Префикс, СтруктураРезультат);
    
    КоллекцияСвойствXDTO = ЭлементКоллекции.Свойства();
    
	Для Каждого влЭлементКоллекции Из КоллекцияСвойствXDTO Цикл
		
		// начало моей вставки
        ЭтоВлЭлементСписка = влЭлементКоллекции.ВерхняяГраница <> 1;
        
        Если ЭтоВлЭлементСписка Тогда
            ЗаполнитьСтруктуруСпискомРекурсивно(ЭлементКоллекции.ПолучитьСписок(влЭлементКоллекции.Имя), "_ПРОСТО_ЗАГЛУШКА_", "_ПРОСТО_ЗАГЛУШКА_",  СтруктураРезультат);
            Продолжить;
        КонецЕсли; 
		//\ окончание моей вставки
		
        Если ТипЗнч(ЭлементКоллекции.Получить(влЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
            
            ПрефиксВложенный = Префикс + "_" + влЭлементКоллекции.Имя;
            ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции.ПолучитьXDTO(влЭлементКоллекции.Имя), ПрефиксВложенный, СтруктураРезультат);
            Продолжить;
        КонецЕсли;
        
        
        ИмяЭлементаКоллекции  = влЭлементКоллекции.Имя;
        ЗначениеЭлементаКоллекции =  ЭлементКоллекции.Получить(ИмяЭлементаКоллекции);
        СтруктураРезультат.Вставить(Префикс + "_" + ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
        
    КонецЦикла;
    
    
КонецПроцедуры 
Показать


...в моем случае, во входных данных был объектXDTO, представляющий список документов ПоступлениеТоваровУслуг; когда парсинг дошел до номенклатуры таб. части документа Товары - а в справочнике Номенклатура есть таб. часть "РозничныеНадбавки" - и произошла вышеупомянутая ошибка....
ya.Avoronov; +1 Ответить
4. Sykoku 101 03.06.19 20:44 Сейчас в теме
Для вложенных структур
   <ProductCatalogue-Lines>
      <Line>
         <Line-Item>
            <LineNumber>1</LineNumber>
            <LineType>3</LineType>
            <EAN>190084116350 </EAN>
            <BuyerItemCode>618608</BuyerItemCode>
            <SupplierItemCode>000003140</SupplierItemCode>
            <ExternalItemCode>9611 00 00 00 </ExternalItemCode>
            <ImporterReferenceNumber></ImporterReferenceNumber>
            <ServiceNumber></ServiceNumber>
            <ProductReference></ProductReference>
            <ItemDescription>Logo 89051</ItemDescription>
            <ItemType>CU</ItemType>
            <ItemAvailable>1</ItemAvailable>
            <PromotionalQuantity></PromotionalQuantity>
            <ActualStock>454</ActualStock>
            <UnitOfMeasure>PCE</UnitOfMeasure>
            <UnitNetPrice>173.55</UnitNetPrice>
            <ForeinqUnitNetPrice></ForeinqUnitNetPrice>
            <OrderedUnitGrossPrice>208.26</OrderedUnitGrossPrice>
            <ForeinqOrderedUnitGrossPrice></ForeinqOrderedUnitGrossPrice­>
            <PromotionalPrice></PromotionalPrice>
            <SuqqestedPrice></SuqqestedPrice>
            <TaxRate>0.00</TaxRate>
            <TaxCategoryCode>S</TaxCategoryCode>
            <ForeinqCurrency></ForeinqCurrency>
            <PackDetails>
               <MinOrderedQuantity>1</MinOrderedQuantity>
               <Weiqht>0.10</Weiqht>
               <Volume>0.97</Volume>
               <Length>0.23</Length>
               <Width>0.13</Width>
               <Height>0.03</Height>
               <UnitPacksize>1.00</UnitPacksize>
            </PackDetails>
         </Line-Item>
      </Line>
   </ProductCatalogue-Lines>
Показать


я бы сделал еще и так

Процедура ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции, Префикс, СтруктураРезультат, ТекущийИндексВложенногоСписка = 0);

                ............................................
		Если (ТекущийИндексВложенногоСписка > 0) Тогда
        	СтруктураРезультат.Вставить(ИмяЭлементаКоллекции + "_" + ТекущийИндексВложенногоСписка, ЗначениеЭлементаКоллекции);
		Иначе	
        	СтруктураРезультат.Вставить(Префикс + "_" + ИмяЭлементаКоллекции, ЗначениеЭлементаКоллекции);
		КонецЕсли;

Показать


Ну и вызов изменить

Функция ЗаписатьОбъектXDTOВСтруктуру(ОбъектXDTOДляПреобразования, СтруктураРезультат, РазделительВложений = "_", РазделительЭлементовСписков = "-", ТекущийИндексВложенногоСписка = 0) Экспорт
  
................................

        Если ТипЗнч(ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
            
            Префикс = ЭлементКоллекции.Имя;
            ЗаполнитьСтруктуруОбъектомРекурсивно(ОбъектXDTOДляПреобразования.ПолучитьXDTO(ЭлементКоллекции.Имя), Префикс, СтруктураРезультат, ТекущийИндексВложенногоСписка);
            Продолжить;
            
        КонецЕсли;

Показать


Иначе все внутренние объекты XDTO будут восприняты с уровнем иерархии "1" и запишутся без индекса. Т.е. будут одни на все записи и каждый последующий затрет предыдущее значение.
5. Sykoku 101 07.06.19 18:44 Сейчас в теме
Пришлось переписать - на сложных участках код умирает.

Функция ЗаписатьОбъектXDTOВСтруктуру(ОбъектXDTOДляПреобразования, Знач Префикс, СтруктураРезультат, РазделительВложений = "ᄉ", РазделительЭлементовСписков = "ᄊ", Знач ТекущийИндексВложенногоСписка = 0, ВходСчетчик = 0) 
    Попытка
		КоллекцияСвойствXDTO = ОбъектXDTOДляПреобразования.Свойства();
	Исключение
		Сообщить("Это не XDTO");
		Возврат СтруктураРезультат;
	КонецПопытки;
	
    Для Каждого ЭлементКоллекции Из  КоллекцияСвойствXDTO Цикл
        
		Попытка
			Если  (ЭлементКоллекции.ВерхняяГраница = 1) Тогда
	        	Если ТипЗнч(ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
		            ЗаписатьОбъектXDTOВСтруктуру(ОбъектXDTOДляПреобразования.ПолучитьXDTO(ЭлементКоллекции.Имя),
												Префикс + ?(Префикс="","",РазделительВложений) + ЭлементКоллекции.Имя,
												СтруктураРезультат, , , ТекущийИндексВложенногоСписка+1, ВходСчетчик);
				Иначе	
					ИмяЭлементаКоллекции      = СтрЗаменить(Префикс + ?(Префикс="","",РазделительВложений) +
								ЭлементКоллекции.Имя, "-", "_");
					Если (ВходСчетчик <> 0) Тогда
						ИмяЭлементаКоллекции = ИмяЭлементаКоллекции + "ǃ" + ВходСчетчик;
					КонецЕсли;	
					
					ЗначениеЭлементаКоллекции =  ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции);
				
					Попытка
						СтруктураРезультат.Вставить(ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
					Исключение
					КонецПопытки;
				КонецЕсли;
				
			Иначе
					ЗначениеЭлементаКоллекции = "";
					Счетчик = 1;
					Для Каждого ЭлементСписка Из ОбъектXDTOДляПреобразования[ЭлементКоллекции.Имя] Цикл
						Если (ТипЗнч(ЭлементСписка)= Тип("ОбъектXDTO")) Тогда
							ЗаписатьОбъектXDTOВСтруктуру(ЭлементСписка, Префикс + ?(Префикс="","",РазделительВложений)+
							ЭлементКоллекции.Имя + ?(ВходСчетчик=0,"","ߍ" + ВходСчетчик), СтруктураРезультат, , , 
							ТекущийИндексВложенногоСписка+1, Счетчик);

							Счетчик = Счетчик + 1;
						Иначе
							ЗначениеЭлементаКоллекции = ?(ЗначениеЭлементаКоллекции="","",ЗначениеЭлементаКоллекции + РазделительЭлементовСписков) + ЭлементСписка; //
						КонецЕсли;
					КонецЦикла;	
					Если (ЗначениеЭлементаКоллекции <> "") Тогда
						СтруктураРезультат.Вставить(Префикс + РазделительВложений + ЭлементКоллекции.Имя + "ǃ" + ВходСчетчик, 
						ЗначениеЭлементаКоллекции);
					КонецЕсли;
        	КонецЕсли;
		Исключение
			Сообщить("Сбой для " + ЭлементКоллекции);
		КонецПопытки;
    КонецЦикла;
        
    Возврат СтруктураРезультат;
    
КонецФункции 


Показать



Пример структуры

<?xml version="1.0" encoding="UTF-8"?>
<Document-Quotation>
<Quotation-Header>
        <QuotationNumber>QO_РОЗ90744975_36</QuotationNumber>
        <QuotationDate>2019-06-07</QuotationDate>
        <QuotationTime>12:27</QuotationTime>
        <EstimatedDeliveryDate>2019-06-07</EstimatedDeliveryDate>
        <ExpectedDeliveryTime>15:00</ExpectedDeliveryTime>
        <BuyerOrderNumber>РОЗ90744975</BuyerOrderNumber>
        <OrderDate>2019-06-07</OrderDate>
        <DespatchNumber>DA_3</DespatchNumber>
        <DespatchDate>2019-06-07</DespatchDate>
        <DeliveryNoteNumber>Тр000011265</DeliveryNoteNumber>
        <DeliveryNoteDate>2019-06-07</DeliveryNoteDate>
        <ContractNumber>22/15/Я</ContractNumber>
        <Currency>UAH</Currency>
    </Quotation-Header>
    <Quotation-Parties>
        <Buyer>
            <ILN>1234567890</ILN>
            <InternalNumber>000011156</InternalNumber>
            <Department></Department>
        </Buyer>
        <Seller>
            <ILN>9876543210</ILN>
            <CodeByBuyer>000000001</CodeByBuyer>
        </Seller>
        <DeliveryPoint>
            <ILN>7234576890878</ILN>
            <DeliveryPlace></DeliveryPlace>
        </DeliveryPoint>
        <UltimateConsignee>
            <ILN>45432167890</ILN>
        </UltimateConsignee>
    </Quotation-Parties>
    <Quotation-Lines>
            <Line>
            <Line-Item>
                <LineNumber>1</LineNumber>
                <BuyerOrderNumber>РОЗ90744975</BuyerOrderNumber>
                <EAN>022399430848</EAN>
                <BuyerItemCode></BuyerItemCode>
                <SupplierItemCode>000005506</SupplierItemCode>
                <ExternalItemCode>9611 00 00 00 </ExternalItemCode>
                <ItemDescription>Оснащення до штампу пласт."СПЛАЧЕНО"</ItemDescription>
               <QuantityDespatched>1.000</QuantityDespatched>
                <QuantityOrdered>1</QuantityOrdered>
                <MinimumOrderQuantity>1</MinimumOrderQuantity>
                <UnitOfMeasure>PCE</UnitOfMeasure>
                <UnitNetPrice>82.80</UnitNetPrice>
                <UnitGrossPrice>99.36</UnitGrossPrice>
               <TaxRate>20.00</TaxRate>
               <TaxCategoryCode>S</TaxCategoryCode>
                              <BatchNumbers>
                                      <BatchNumber>CO469305</BatchNumber>
                              </BatchNumbers>
            </Line-Item>
            </Line>
            <Line>
            <Line-Item>
                <LineNumber>2</LineNumber>
                <BuyerOrderNumber>РОЗ90744975</BuyerOrderNumber>
                <EAN>092399735106</EAN>
                <BuyerItemCode></BuyerItemCode>
                <SupplierItemCode>000006030</SupplierItemCode>
                <ExternalItemCode>9611 00 00 00 </ExternalItemCode>
                <ItemDescription>Мінідатер 3,8мм пласт.</ItemDescription>
               <QuantityDespatched>2.000</QuantityDespatched>
                <QuantityOrdered>2</QuantityOrdered>
                <MinimumOrderQuantity>1</MinimumOrderQuantity>
                <UnitOfMeasure>PCE</UnitOfMeasure>
                <UnitNetPrice>83.35</UnitNetPrice>
                <UnitGrossPrice>100.02</UnitGrossPrice>
               <TaxRate>20.00</TaxRate>
               <TaxCategoryCode>S</TaxCategoryCode>
                              <BatchNumbers>
                                      <BatchNumber>CO469308</BatchNumber>
                                      <BatchNumber>CO469307</BatchNumber>
                              </BatchNumbers>
            </Line-Item>
            </Line>
            <Line>
            <Line-Item>
                <LineNumber>3</LineNumber>
                <BuyerOrderNumber>РОЗ90744975</BuyerOrderNumber>
                <EAN>4013422007843</EAN>
                <BuyerItemCode></BuyerItemCode>
                <SupplierItemCode>000029041</SupplierItemCode>
                <ExternalItemCode>3215 90 00 00 </ExternalItemCode>
                <ItemDescription>Штемпельна фарба на спиртовій основі для пластика та поліетилена, 50 мл</ItemDescription>
               <QuantityDespatched>1.000</QuantityDespatched>
                <QuantityOrdered>1</QuantityOrdered>
                <MinimumOrderQuantity>1</MinimumOrderQuantity>
                <UnitOfMeasure>PCE</UnitOfMeasure>
                <UnitNetPrice>175.90</UnitNetPrice>
                <UnitGrossPrice>211.08</UnitGrossPrice>
               <TaxRate>20.00</TaxRate>
               <TaxCategoryCode>S</TaxCategoryCode>
                              <BatchNumbers>
                                      <BatchNumber>CO469306</BatchNumber>
                              </BatchNumbers>
            </Line-Item>
            </Line>
            <Line>
            <Line-Item>
                <LineNumber>4</LineNumber>
                <BuyerOrderNumber>РОЗ90744975</BuyerOrderNumber>
                <EAN>9008056526766</EAN>
                <BuyerItemCode></BuyerItemCode>
                <SupplierItemCode>000003472</SupplierItemCode>
                <ExternalItemCode>9611 00 00 00 </ExternalItemCode>
                <ItemDescription>Текстовий штамп 3-х рядковий</ItemDescription>
               <QuantityDespatched>2.000</QuantityDespatched>
                <QuantityOrdered>2</QuantityOrdered>
                <MinimumOrderQuantity>1</MinimumOrderQuantity>
                <UnitOfMeasure>PCE</UnitOfMeasure>
                <UnitNetPrice>203.00</UnitNetPrice>
                <UnitGrossPrice>243.60</UnitGrossPrice>
               <TaxRate>20.00</TaxRate>
               <TaxCategoryCode>S</TaxCategoryCode>
                              <BatchNumbers>
                                      <BatchNumber>CO469310</BatchNumber>
                                      <BatchNumber>CO469309</BatchNumber>
                              </BatchNumbers>
            </Line-Item>
            </Line>
    </Quotation-Lines>
    <Quotation-Summary>
        <TotalLines>4</TotalLines>
        <TotalAmount>831.40</TotalAmount>
        <TotalQuantity>6.000</TotalQuantity>
        <TotalGrossAmount>997.68</TotalGrossAmount>
    </Quotation-Summary>
</Document-Quotation>
Показать


СтруктураXDTO						Структура		Структура
Quotation_HeaderᄉBuyerOrderNumber	"РОЗ90744975"	Строка
Quotation_HeaderᄉContractNumber		"22/15/Я"		Строка
Quotation_HeaderᄉCurrency			"UAH"			Строка
Quotation_HeaderᄉDeliveryNoteDate		"2019-06-07"		Строка
Quotation_HeaderᄉDeliveryNoteNumber	"Тр000011265"	Строка
Quotation_HeaderᄉDespatchDate		"2019-06-07"		Строка
Quotation_HeaderᄉDespatchNumber		"DA_3"			Строка
Quotation_HeaderᄉEstimatedDeliveryDate	"2019-06-07"		Строка
Quotation_HeaderᄉExpectedDeliveryTime	"15:00"			Строка
Quotation_HeaderᄉOrderDate			"2019-06-07"		Строка
Quotation_HeaderᄉQuotationDate		"2019-06-07"		Строка
Quotation_HeaderᄉQuotationNumber		"QO_РОЗ90744975_36"	Строка
Quotation_HeaderᄉQuotationTime		"12:27"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBatchNumbersᄉBatchNumberǃ1	"CO469305"			Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBatchNumbersᄉBatchNumberǃ2	"CO469308ᄊCO469307"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBatchNumbersᄉBatchNumberǃ3	"CO469306"			Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBatchNumbersᄉBatchNumberǃ4	"CO469310ᄊCO469309"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBuyerOrderNumberǃ1				"РОЗ90744975"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBuyerOrderNumberǃ2				"РОЗ90744975"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBuyerOrderNumberǃ3				"РОЗ90744975"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉBuyerOrderNumberǃ4				"РОЗ90744975"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉEANǃ1							"022399430848"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉEANǃ2							"092399735106"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉEANǃ3							"4013422007843"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉEANǃ4							"9008056526766"		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉExternalItemCodeǃ1				"9611 00 00 00 "		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉExternalItemCodeǃ2				"9611 00 00 00 "		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉExternalItemCodeǃ3				"3215 90 00 00 "		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉExternalItemCodeǃ4				"9611 00 00 00 "		Строка
Quotation_LinesᄉLineᄉLine_ItemᄉItemDescriptionǃ1				"Оснащення до штампу пласт."СПЛАЧЕНО""	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉItemDescriptionǃ2				"Мінідатер 3,8мм пласт."	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉItemDescriptionǃ3				"Штемпельна фарба на спиртовій основі для пластика та поліетилена, 50 мл"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉItemDescriptionǃ4				"Текстовий штамп 3-х рядковий"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉLineNumberǃ1					"1"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉLineNumberǃ2					"2"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉLineNumberǃ3					"3"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉLineNumberǃ4					"4"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉMinimumOrderQuantityǃ1			"1"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉMinimumOrderQuantityǃ2			"1"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉMinimumOrderQuantityǃ3			"1"					Строка
Quotation_LinesᄉLineᄉLine_ItemᄉMinimumOrderQuantityǃ4	"1"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityDespatchedǃ1	"1.000"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityDespatchedǃ2	"2.000"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityDespatchedǃ3	"1.000"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityDespatchedǃ4	"2.000"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityOrderedǃ1	"1"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityOrderedǃ2	"2"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityOrderedǃ3	"1"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉQuantityOrderedǃ4	"2"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉSupplierItemCodeǃ1	"000005506"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉSupplierItemCodeǃ2	"000006030"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉSupplierItemCodeǃ3	"000029041"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉSupplierItemCodeǃ4	"000003472"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxCategoryCodeǃ1	"S"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxCategoryCodeǃ2	"S"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxCategoryCodeǃ3	"S"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxCategoryCodeǃ4	"S"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxRateǃ1	"20.00"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxRateǃ2	"20.00"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxRateǃ3	"20.00"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉTaxRateǃ4	"20.00"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitGrossPriceǃ1	"99.36"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitGrossPriceǃ2	"100.02"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitGrossPriceǃ3	"211.08"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitGrossPriceǃ4	"243.60"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitNetPriceǃ1	"82.80"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitNetPriceǃ2	"83.35"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitNetPriceǃ3	"175.90"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitNetPriceǃ4	"203.00"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitOfMeasureǃ1	"PCE"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitOfMeasureǃ2	"PCE"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitOfMeasureǃ3	"PCE"	Строка
Quotation_LinesᄉLineᄉLine_ItemᄉUnitOfMeasureǃ4	"PCE"	Строка
Quotation_PartiesᄉBuyerᄉILN	"4829900023799"	Строка
Quotation_PartiesᄉBuyerᄉInternalNumber	"000011156"	Строка
Quotation_PartiesᄉDeliveryPointᄉILN	"4829900023812"	Строка
Quotation_PartiesᄉSellerᄉCodeByBuyer	"000000001"	Строка
Quotation_PartiesᄉSellerᄉILN	"9871000004708"	Строка
Quotation_PartiesᄉUltimateConsigneeᄉILN	"4829900023799"	Строка
Quotation_SummaryᄉTotalAmount	"831.40"	Строка
Quotation_SummaryᄉTotalGrossAmount	"997.68"	Строка
Quotation_SummaryᄉTotalLines	"4"	Строка
Quotation_SummaryᄉTotalQuantity	"6.000"	Строка
Показать
6. Sykoku 101 07.06.19 18:48 Сейчас в теме
Добавлю, что всего 1 конструкция.

Заглушки были оставлены на моменты отладки.

Автору поста - спасибо лишь за способы обработки XDTO. Самому лень было читать кучу постов ни о чем.
7. user1323318 06.12.19 20:54 Сейчас в теме
// подготовим объект XDTO

Данные = Новый Структура;
Данные.Вставить("Имя", "Петя");
Данные.Вставить("Должность", "ЛОДЫРЬ");
Масс = Новый Массив;
Масс.Добавить(Данные);
Масс.Добавить(Данные);

XDTO = СериализаторXDTO.ЗаписатьXDTO(Масс);
Сообщить(XDTO); // => "ОбъектXDTO"


// КАК ИЗ ОбъектXDTO сделать строку JSON
Структ = СериализаторXDTO.ПрочитатьXDTO(XDTO); // получаем обычную структуру
JSON = Новый ЗаписьJSON; // создаем объект JSON
JSON.УстановитьСтроку(); // открываем на запись
ЗаписатьJSON(JSON, Структ); // записываем в него структуру
Текст = JSON.Закрыть(); // конвертуруем в текст


Сообщить(Текст);
// ВУ А ЛЯ
8. Sykoky 6 08.01.20 14:42 Сейчас в теме
(7)
ектXDTO"



В заголовке было "Структура из Объекта XDTO", а не "Как вставить стурктуру в XDTO" или "выведем его в JSON"

Намекну, что это было сделано для прямого обращения к любому элементу заголовка или тела. Минуя жесткую структуру, а используя лишь совпадения имен.
9. Sergey_Nazarov 29.01.20 14:42 Сейчас в теме
В результате получается массив структур

5 копеек
ya.Avoronov; uropek; beardlyhich; Chif13; EMelihoff; +5 Ответить
10. EMelihoff 20.04.20 15:33 Сейчас в теме
11. user799503 6 22.09.21 19:16 Сейчас в теме
Искал подобное, но не нашёл.
Использовал задумку, но сделал именно многомерную структуру

&НаСервереБезКонтекста
Функция ПрочитатьФайлНаСервере(ДанныеФайла)

	ЧтениеДанных = Новый ЧтениеXML;
	ЧтениеДанных.УстановитьСтроку(ДанныеФайла);
	ЧтениеДанных.Прочитать();

	Данные=ФабрикаXDTO.ПрочитатьXML(ЧтениеДанных);

        СтруктураРезультат=Новый Структура(); 
        Владелец="";
        ВычСтрока="Структ";
        ЗаписатьОбъектXDTOВСтруктуру(Данные,СтруктураРезультат,Владелец,ВычСтрока);
Показать


&НаСервереБезКонтекста
Функция ЗаписатьОбъектXDTOВСтруктуру(Данные,Структ,Владелец,Знач ВычСтрока)
    Если ТипЗнч(Данные)=Тип("ОбъектXDTO")=Ложь Тогда
        Сообщить("Это не XDTO");
    	Возврат Новый Структура(); 
    КонецЕсли;
    Коллекция=Данные.Свойства();
    Если Коллекция.Количество()=0 Тогда
        Владелец="";
    	Возврат Новый Структура();
    Иначе
        ВычСтрока=ВычСтрока+Владелец;
    КонецЕсли;
    ТТТ=Вычислить(ВычСтрока);
    Для каждого Элем Из Коллекция Цикл
        ТекКлюч=Элем.Имя;
        Если Элем.ВерхняяГраница=1 Тогда
            ЭлемДанные=Данные.Получить(Элем);
            Если ТипЗнч(ЭлемДанные)=Тип("ОбъектXDTO") Тогда
                Если ТТТ.Свойство(ТекКлюч)=Ложь Тогда
                    Владелец="."+ТекКлюч;
                    ТТТ.Вставить(ТекКлюч,Новый Структура);
                    ТТТ[ТекКлюч]=ЗаписатьОбъектXDTOВСтруктуру(Данные.Получить(Элем),Структ,Владелец,ВычСтрока);
                КонецЕсли;
            ИначеЕсли ТипЗнч(Данные.Получить(Элем))=Тип("Строка") Тогда
                ТТТ.Вставить(ТекКлюч,ЭлемДанные);
            Иначе
                А=1; //на всякий пожарный
            КонецЕсли;
        Иначе
            ВремМассив=Новый Массив;
            Для каждого Стр Из Данные[ТекКлюч] Цикл
                ВремСтр=Новый Структура(); 
                Для каждого ВСтр Из Стр.Свойства() Цикл
                	ВремСтр.Вставить(ВСтр.Имя,Стр.Получить(ВСтр)); //если у кого-то список в списке.... может дописать :-)
                КонецЦикла; 
                ВремМассив.Добавить(ВремСтр);
            	А=1;
            КонецЦикла; 
            ТТТ.Вставить(ТекКлюч,ВремМассив);
        КонецЕсли; 
    КонецЦикла;
    Возврат ТТТ;
КонецФункции // ЗаписатьОбъектXDTOВСтруктуру(Данные,Структ)
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот