Данная функция преобразует объектXDTO в структуру. Сохраняю как шпаргалку.
&НаСервере
Функция ЗаписатьОбъектXDTOВСтруктуру(ОбъектXDTOДляПреобразования, СтруктураРезультат, РазделительВложений = "_", РазделительЭлементовСписков = "-", ТекущийИндексВложенногоСписка = 0) Экспорт
КоллекцияСвойствXDTO = ОбъектXDTOДляПреобразования.Свойства();
Для Каждого ЭлементКоллекции Из КоллекцияСвойствXDTO Цикл
ЭтоЭлементСписка = ЭлементКоллекции.ВерхняяГраница <> 1;
Если ЭтоЭлементСписка Тогда
ЗаполнитьСтруктуруСпискомРекурсивно(ОбъектXDTOДляПреобразования[ЭлементКоллекции.Имя], РазделительВложений, РазделительЭлементовСписков, СтруктураРезультат);
Продолжить;
КонецЕсли;
Если ТипЗнч(ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
Префикс = ЭлементКоллекции.Имя;
ЗаполнитьСтруктуруОбъектомРекурсивно(ОбъектXDTOДляПреобразования.ПолучитьXDTO(ЭлементКоллекции.Имя), Префикс, СтруктураРезультат);
Продолжить;
КонецЕсли;
ИмяЭлементаКоллекции = ?(ТекущийИндексВложенногоСписка=0,ЭлементКоллекции.Имя, ЭлементКоллекции.Имя + РазделительВложений + ТекущийИндексВложенногоСписка);
ЗначениеЭлементаКоллекции = ОбъектXDTOДляПреобразования.Получить(ЭлементКоллекции);
СтруктураРезультат.Вставить(ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
КонецЦикла;
Возврат СтруктураРезультат;
КонецФункции // ()
&НаСервере
Процедура ЗаполнитьСтруктуруСпискомРекурсивно(СписокXDTOДляЗаписи, Префикс, РазделительЭлементовСписков, СтруктураРезультат);
ТекущийИндексВложенногоСписка = 1;
Для каждого ЭлементСписка Из СписокXDTOДляЗаписи Цикл
ЗаписатьОбъектXDTOВСтруктуру(ЭлементСписка, СтруктураРезультат, , Префикс, ТекущийИндексВложенногоСписка);
ТекущийИндексВложенногоСписка = ТекущийИндексВложенногоСписка + 1;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции, Префикс, СтруктураРезультат);
КоллекцияСвойствXDTO = ЭлементКоллекции.Свойства();
Для Каждого влЭлементКоллекции Из КоллекцияСвойствXDTO Цикл
Если ТипЗнч(ЭлементКоллекции.Получить(влЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
ПрефиксВложенный = Префикс + "_" + влЭлементКоллекции.Имя;
ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции.ПолучитьXDTO(влЭлементКоллекции.Имя), ПрефиксВложенный, СтруктураРезультат);
Продолжить;
КонецЕсли;
ИмяЭлементаКоллекции = влЭлементКоллекции.Имя;
ЗначениеЭлементаКоллекции = ЭлементКоллекции.Получить(ИмяЭлементаКоллекции);
СтруктураРезультат.Вставить(Префикс + "_" + ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Вызов операций WS-сервисов SAP из 1С (передача в параметрах Объектов XDTO)
- Пример рекурсивной выгрузки иерархической структуры в XDTO
- EnterpriseData – часть 3. Загрузка данных, идентификация объектов
- Пример обмена данными через XDTO
- Десериализация объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
дополню своей функцией, обратной
ДанныеОбъекта - Структура, Массив, СписокЗначений произвольной вложенности, значения любых типов
функция возвращает объект XDTO, с инициализированными свойствами, значениями из ДанныеОбъекта
ДанныеОбъекта - Структура, Массив, СписокЗначений произвольной вложенности, значения любых типов
функция возвращает объект 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;
КонецЕсли;
КонецФункции
Показать
Славно! спасибо огромное, позаимствовал.
...Вставлю и свои 5 копеек: чтобы не вываливаться с ошибкой вида
,надо в процедуру ЗаполнитьСтруктуруОбъектомРекурсивно() добавить обработку случая (с помощью метода ПолучитьСписок()), когда ВЛОЖЕННОЕ свойство является списком. В итоге должно получиться что-то вроде:
...в моем случае, во входных данных был объектXDTO, представляющий список документов ПоступлениеТоваровУслуг; когда парсинг дошел до номенклатуры таб. части документа Товары - а в справочнике Номенклатура есть таб. часть "РозничныеНадбавки" - и произошла вышеупомянутая ошибка....
...Вставлю и свои 5 копеек: чтобы не вываливаться с ошибкой вида
Несоответствие свойства и элемента данных XDTO:
Свойство: 'РозничныеНадбавки'
Свойство является списковым
Свойство: 'РозничныеНадбавки'
Свойство является списковым
,надо в процедуру ЗаполнитьСтруктуруОбъектомРекурсивно() добавить обработку случая (с помощью метода ПолучитьСписок()), когда ВЛОЖЕННОЕ свойство является списком. В итоге должно получиться что-то вроде:
Процедура ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции, Префикс, СтруктураРезультат);
КоллекцияСвойствXDTO = ЭлементКоллекции.Свойства();
Для Каждого влЭлементКоллекции Из КоллекцияСвойствXDTO Цикл
// начало моей вставки
ЭтоВлЭлементСписка = влЭлементКоллекции.ВерхняяГраница <> 1;
Если ЭтоВлЭлементСписка Тогда
ЗаполнитьСтруктуруСпискомРекурсивно(ЭлементКоллекции.ПолучитьСписок(влЭлементКоллекции.Имя), "_ПРОСТО_ЗАГЛУШКА_", "_ПРОСТО_ЗАГЛУШКА_", СтруктураРезультат);
Продолжить;
КонецЕсли;
//\ окончание моей вставки
Если ТипЗнч(ЭлементКоллекции.Получить(влЭлементКоллекции)) = Тип("ОбъектXDTO") Тогда
ПрефиксВложенный = Префикс + "_" + влЭлементКоллекции.Имя;
ЗаполнитьСтруктуруОбъектомРекурсивно(ЭлементКоллекции.ПолучитьXDTO(влЭлементКоллекции.Имя), ПрефиксВложенный, СтруктураРезультат);
Продолжить;
КонецЕсли;
ИмяЭлементаКоллекции = влЭлементКоллекции.Имя;
ЗначениеЭлементаКоллекции = ЭлементКоллекции.Получить(ИмяЭлементаКоллекции);
СтруктураРезультат.Вставить(Префикс + "_" + ИмяЭлементаКоллекции,ЗначениеЭлементаКоллекции);
КонецЦикла;
КонецПроцедуры
Показать...в моем случае, во входных данных был объектXDTO, представляющий список документов ПоступлениеТоваровУслуг; когда парсинг дошел до номенклатуры таб. части документа Товары - а в справочнике Номенклатура есть таб. часть "РозничныеНадбавки" - и произошла вышеупомянутая ошибка....
Для вложенных структур
я бы сделал еще и так
Ну и вызов изменить
Иначе все внутренние объекты XDTO будут восприняты с уровнем иерархии "1" и запишутся без индекса. Т.е. будут одни на все записи и каждый последующий затрет предыдущее значение.
<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" и запишутся без индекса. Т.е. будут одни на все записи и каждый последующий затрет предыдущее значение.
Пришлось переписать - на сложных участках код умирает.
Пример структуры
Функция ЗаписатьОбъект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" Строка
Показать
// подготовим объект XDTO
Данные = Новый Структура;
Данные.Вставить("Имя", "Петя");
Данные.Вставить("Должность", "ЛОДЫРЬ");
Масс = Новый Массив;
Масс.Добавить(Данные);
Масс.Добавить(Данные);
XDTO = СериализаторXDTO.ЗаписатьXDTO(Масс);
Сообщить(XDTO); // => "ОбъектXDTO"
// КАК ИЗ ОбъектXDTO сделать строку JSON
Структ = СериализаторXDTO.ПрочитатьXDTO(XDTO); // получаем обычную структуру
JSON = Новый ЗаписьJSON; // создаем объект JSON
JSON.УстановитьСтроку(); // открываем на запись
ЗаписатьJSON(JSON, Структ); // записываем в него структуру
Текст = JSON.Закрыть(); // конвертуруем в текст
Сообщить(Текст);
// ВУ А ЛЯ
Данные = Новый Структура;
Данные.Вставить("Имя", "Петя");
Данные.Вставить("Должность", "ЛОДЫРЬ");
Масс = Новый Массив;
Масс.Добавить(Данные);
Масс.Добавить(Данные);
XDTO = СериализаторXDTO.ЗаписатьXDTO(Масс);
Сообщить(XDTO); // => "ОбъектXDTO"
// КАК ИЗ ОбъектXDTO сделать строку JSON
Структ = СериализаторXDTO.ПрочитатьXDTO(XDTO); // получаем обычную структуру
JSON = Новый ЗаписьJSON; // создаем объект JSON
JSON.УстановитьСтроку(); // открываем на запись
ЗаписатьJSON(JSON, Структ); // записываем в него структуру
Текст = JSON.Закрыть(); // конвертуруем в текст
Сообщить(Текст);
// ВУ А ЛЯ
(7)
В заголовке было "Структура из Объекта XDTO", а не "Как вставить стурктуру в XDTO" или "выведем его в JSON"
Намекну, что это было сделано для прямого обращения к любому элементу заголовка или тела. Минуя жесткую структуру, а используя лишь совпадения имен.
ектXDTO"
В заголовке было "Структура из Объекта XDTO", а не "Как вставить стурктуру в XDTO" или "выведем его в JSON"
Намекну, что это было сделано для прямого обращения к любому элементу заголовка или тела. Минуя жесткую структуру, а используя лишь совпадения имен.
В результате получается массив структур
5 копеек |
---|
#Область XDTO_В_Структуру
&НаСервере
Функция XDTOВСтруктуру(XMLXDTO)
мСтруктур = Новый Массив;
Для каждого XMLXDTOЭлемент Из XMLXDTO.Свойства() Цикл
Если ТипЗнч(XMLXDTO[XMLXDTOЭлемент.Имя]) = Тип("ОбъектXDTO") Тогда
Структура = Новый Структура;
Структура.Вставить(XMLXDTOЭлемент.ЛокальноеИмя, РазобратьОбъектXDTO(XMLXDTO[XMLXDTOЭлемент.Имя]));
мСтруктур.Добавить(Структура);
ИначеЕсли ТипЗнч(XMLXDTO[XMLXDTOЭлемент.Имя]) = Тип("СписокXDTO") Тогда
Структура = Новый Структура;
Структура.Вставить(XMLXDTOЭлемент.ЛокальноеИмя, РазобратьСписокXDTO(XMLXDTO[XMLXDTOЭлемент.Имя]));
мСтруктур.Добавить(Структура);
Иначе
КонецЕсли;
КонецЦикла;
Возврат мСтруктур;
КонецФункции
&НаСервере
Функция РазобратьОбъектXDTO(ОбъектXDTO)
Если ОбъектXDTO.Свойства().Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
мЭлементов = Новый Массив;
Структура = Новый Структура;
Для каждого ОбъектXDTOСвойство Из ОбъектXDTO.Свойства() Цикл
мЭлементов.Добавить(ОбъектXDTOСвойство.ЛокальноеИмя);
КонецЦикла;
Для каждого мЭлементовЭлемент Из мЭлементов Цикл
Если ТипЗнч(ОбъектXDTO[мЭлементовЭлемент]) = Тип("ОбъектXDTO") Тогда
Структура.Вставить(мЭлементовЭлемент, РазобратьОбъектXDTO(ОбъектXDTO[мЭлементовЭлемент]));
ИначеЕсли ТипЗнч(ОбъектXDTO[мЭлементовЭлемент]) = Тип("СписокXDTO") Тогда
Структура.Вставить(мЭлементовЭлемент, РазобратьСписокXDTO(ОбъектXDTO[мЭлементовЭлемент]));
Иначе
Структура.Вставить(мЭлементовЭлемент, ОбъектXDTO[мЭлементовЭлемент]);
КонецЕсли;
КонецЦикла;
Возврат Структура;
КонецФункции
&НаСервере
Функция РазобратьСписокXDTO(СписокXDTO)
мСтруктур = Новый Массив;
Для каждого СписокXDTOЭлемент Из СписокXDTO Цикл
Если ТипЗнч(СписокXDTOЭлемент) = Тип("ОбъектXDTO") Тогда
СтруктураXDTO = РазобратьОбъектXDTO(СписокXDTOЭлемент);
мСтруктур.Добавить(СтруктураXDTO);
ИначеЕсли ТипЗнч(СписокXDTOЭлемент) = Тип("СписокXDTO") Тогда
СписокXDTO = РазобратьСписокXDTO(СписокXDTOЭлемент);
мСтруктур.Добавить(СтруктураXDTO);
Иначе
мСтруктур.Добавить(СписокXDTOЭлемент);
КонецЕсли;
КонецЦикла;
Возврат мСтруктур;
КонецФункции
#КонецОбласти
Показать |
Искал подобное, но не нашёл.
Использовал задумку, но сделал именно многомерную структуру
Использовал задумку, но сделал именно многомерную структуру
&НаСервереБезКонтекста
Функция ПрочитатьФайлНаСервере(ДанныеФайла)
ЧтениеДанных = Новый ЧтениеXML;
ЧтениеДанных.УстановитьСтроку(ДанныеФайла);
ЧтениеДанных.Прочитать();
Данные=ФабрикаXDTO.ПрочитатьXML(ЧтениеДанных);
СтруктураРезультат=Новый Структура();
Владелец="";
ВычСтрока="Структ";
ЗаписатьОбъектXDTOВСтруктуру(Данные,СтруктураРезультат,Владелец,ВычСтрока);
Показать
&НаСервереБезКонтекста
Функция ЗаписатьОбъектXDTOВСтруктуру(Данные,Структ,Владелец,Знач ВычСтрока)
Если ТипЗнч(Данные)=Тип("ОбъектXDTO")=Ложь Тогда
Сообщить("Это не XDTO");
Возврат Новый Структура();
КонецЕсли;
Коллекция=Данные.Свойства();
Если Коллекция.Количество()=0 Тогда
Владелец="";
Возврат Новый Структура();
Иначе
ВычСтрока=ВычСтрока+Владелец;
КонецЕсли;
ТТТ=Вычислить(ВычСтрока);
Для каждого Элем Из Коллекция Цикл
ТекКлюч=Элем.Имя;
Если Элем.ВерхняяГраница=1 Тогда
ЭлемДанные=Данные.Получить(Элем);
Если ТипЗнч(ЭлемДанные)=Тип("ОбъектXDTO") Тогда
Если ТТТ.Свойство(ТекКлюч)=Ложь Тогда
Владелец="."+ТекКлюч;
ТТТ.Вставить(ТекКлюч,Новый Структура);
ТТТ[ТекКлюч]=ЗаписатьОбъектXDTOВСтруктуру(Данные.Получить(Элем),Структ,Владелец,ВычСтрока);
КонецЕсли;
ИначеЕсли ТипЗнч(Данные.Получить(Элем))=Тип("Строка") Тогда
ТТТ.Вставить(ТекКлюч,ЭлемДанные);
Иначе
А=1; //на всякий пожарный
КонецЕсли;
Иначе
ВремМассив=Новый Массив;
Для каждого Стр Из Данные[ТекКлюч] Цикл
ВремСтр=Новый Структура();
Для каждого ВСтр Из Стр.Свойства() Цикл
ВремСтр.Вставить(ВСтр.Имя,Стр.Получить(ВСтр)); //если у кого-то список в списке.... может дописать :-)
КонецЦикла;
ВремМассив.Добавить(ВремСтр);
А=1;
КонецЦикла;
ТТТ.Вставить(ТекКлюч,ВремМассив);
КонецЕсли;
КонецЦикла;
Возврат ТТТ;
КонецФункции // ЗаписатьОбъектXDTOВСтруктуру(Данные,Структ)
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот