Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Преобразование СписокXDTO в ТаблицаЗначений

Преобразование СписокXDTO в ТаблицаЗначений
Я
   Mentos1C
 
20.07.21 - 09:28
Всем привет. Делаю запрос к API, получаю списокXDTO. Хотелось бы преобразовать в таблицу значений каким-нибудь максимально коротким, и максимально универсальным кодом, ибо получаю несколько разных СписокXDTO, с различной структурой. Ваши предложения? И где про это почитать? Ни с .Net ни с сериализаторами незнаком, и даже не понимаю зачем они нужны. Всем спасибо
   Галахад
 
1 - 20.07.21 - 09:31
Что за странное API?
   mikecool
 
2 - 20.07.21 - 09:35
(0) как "с различной структурой" преобразовать в 1 ТЗ?
   Mentos1C
 
3 - 20.07.21 - 09:41
(2) разные списки в разные ТЗ. Это ж логично)
(1) Да вроде дефолтное апи. Пишу запрос, получаю Объект, а внутри списки, которые нужно раскидать по таблицам значений
   END
 
4 - 20.07.21 - 09:42
(3) Дефолтное API для кого дефолтное?
   Mentos1C
 
5 - 20.07.21 - 09:42
API на сайте магазина
   END
 
6 - 20.07.21 - 09:43
(5) Пригласите программиста...
   Mentos1C
 
7 - 20.07.21 - 09:44
(4) SOAP протокол... Это имеет значение? Какие то другие объекты можно получить при десериализации XML?
   Kassern
 
8 - 20.07.21 - 09:48
(0) я правильно понимаю, вы получаете xml схему с данными на выходе? Если да, то можно так:
Преобразование_ПВЗ = Новый ПреобразованиеXSL;
Преобразование_ПВЗ.ЗагрузитьИзСтроки(Схема);
СтрокаXML_ПВЗ = Преобразование_ПВЗ.ПреобразоватьИзСтроки(СтрокаXML);
ЧтениеXML_ПВЗ = Новый ЧтениеXML();
ЧтениеXML_ПВЗ.УстановитьСтроку(СтрокаXML_ПВЗ);
ТЗ2 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML_ПВЗ);
Взято из https://forum.infostart.ru/forum9/topic131918/
   Mentos1C
 
9 - 20.07.21 - 09:58
(8) Очень интересный вариант. Если я правильно понимаю, XSL описание это и есть новая, пока не созданная и не заполненная таблица, с фиксированым количество, и наименованием колонок, что не соответствует постановке вопроса :( Но решение действительно хорошее, создать XDTOПакет и с его помощью формировать ТЗ. Просто я заранее не могу знать о структуре списков, это усложняет задачу
   Kassern
 
10 - 20.07.21 - 10:05
(9) как то странно, обычно у апишек статичная структура ответа. Если что то и меняется, то это за несколько недель предупреждается.
   Mentos1C
 
11 - 20.07.21 - 15:08
(10) Да я могу перебрать все возможные списки которые я буду преобразовывать в ТЗ. Но тоже, получается не универсальный метод) У меня получилось вот так

Функция XDTOВТаблицуЗначений(XDTOСписок)
    
    ТаблицаЗначений = Новый ТаблицаЗначений;
    
    //Создание колонок идентично колонкам в списке ХДТО

    Если XDTOСписок.Количество() > 0 тогда
        
        Для каждого Строка из XDTOСписок[1].Свойства() цикл
            
            ТаблицаЗначений.Колонки.Добавить(Строка.Имя);
            
        КонецЦикла;
        
    КонецЕсли;
    
    //Копирование ХДТО списка в таблицу значений

    Для каждого Строка из XDTOСписок цикл
        
        НоваяСтрока = ТаблицаЗначений.Добавить();
        
        Для каждого Колонка из ТаблицаЗначений.Колонки цикл
            
            НоваяСтрока[Колонка.Имя] = Строка[Колонка.Имя];    
            
        КонецЦикла;
        
    КонецЦикла;
    
    Возврат ТаблицаЗначений;
КонецФункции
   Mentos1C
 
12 - 20.07.21 - 15:10
Я не правильно вопрос сформулировал или мое решение жуткий костыль, который никому даже в голову не приходит? Или тут помощь только на платной основе?
   Вафель
 
13 - 20.07.21 - 15:31
А смысл?
Этот список можно обходить через для каждого по месту требования.
Ну может если только в запрос
   fisher
 
14 - 20.07.21 - 15:36
(11) Ну, норм. Куда уж проще-то?
В цикле обхода строк можно попробовать избавиться от вложенного цикла обхода колонок через ЗаполнитьЗначенияСвойств()
   Mentos1C
 
15 - 20.07.21 - 17:39
(13) да не только в запрос. Искать строки по множественным, иногда взаимозависимым, условиям используя обход "Для каждого", то ещё приключение, на итак короткие выходные)

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.