Имя: Пароль:
1C
1С v8
Веб-сервисы, передача массива сложных структур
0 nesergey
 
26.05.15
10:27
1C83 Есть сторонний веб-сервис с функции doUpdate(). В качестве параметра этой функции передается переменная, которая определена так: https://www.dropbox.com/s/cc455pqh6auxdx1/1.PNG?dl=0

Соответственно я создаю объект типа doUpdate, после создания:
items = Неопределено
initiator = Строка
token = Строка

Вот с items и возникает проблема, это должен быть массив, каждый элемент которого имеет тип Shipping. Как мне правильно его определить?
1 Широкий
 
26.05.15
10:31
Создать объект твоего типа
2 nesergey
 
26.05.15
10:44
Так в том то и проблема, что у items в определении 1С нет типа. И чтобы я не пытался присваивать (массив, списокXDTO и пр.), появляется ошибка.
3 Широкий
 
26.05.15
10:52
Тип у items - какой?
4 nesergey
 
26.05.15
10:54
5 Широкий
 
26.05.15
10:55
Определение типа - что там?
6 Мигрень
 
26.05.15
10:57
(0)
1. Получаешь фабрику с сервака.
2. Получаешь через полученную фабрику тип.
3. Создаешь с помощью полученной фабрики объект по полученному типу.

Все операции только через фабрику с сервера, а не через свою.
7 nesergey
 
26.05.15
10:58
В определении типа указан тип значения (Shipping) см. первую картинку.
8 Широкий
 
26.05.15
11:00
(7) Ну и ? Создать объект типа Shipping - никак?
9 Serginio1
 
26.05.15
11:00
10 Широкий
 
26.05.15
11:04
ОбъектXDTO (XDTODataObject)
Добавить (Add)
Вариант синтаксиса: Установка значения нового произвольного свойства
Описание:
Добавляет значение произвольного свойства. Имя свойства будет создано автоматически, на основе локального имени XML представления свойства.
В случае, если произвольное свойство с полученным именем уже существует и, если предыдущая установка значения произвольного свойства выполнялась для данного произвольного свойства, либо другого свойства в случае наличия последовательности, - свойство становится списковым с неограниченной верхней границей.
11 Fragster
 
гуру
26.05.15
11:05
(10) не угадал
12 Fragster
 
гуру
26.05.15
11:05
(0) выложи XSD схему куда-нибудь
13 nesergey
 
26.05.15
11:21
14 Serginio1
 
26.05.15
11:28
(13) 9 Смотрел? Пройдись отладчиком по типам


ТипShiping= ТипItems.Свойства.Получить("Shiping").Тип;
15 Широкий
 
26.05.15
11:40
У "items" МаксимальноеЗначений= 1 - где список то?
16 nesergey
 
26.05.15
11:41
(14) Пробую
17 nesergey
 
26.05.15
11:43
(15) items объект, в котором лежит список shiping максимальное значение = -1
18 Fragster
 
гуру
26.05.15
11:54
Фабрика = СоздатьФабрикуXDTO("x:\shipping.ws.xsd");
ПространствоИмен = "http://192.168.1.145:8081/";
Тип = Фабрика.Тип(ПространствоИмен, "doUpdate");
Объект = Фабрика.Создать(Тип);
Объект.Items = Фабрика.Создать(Тип.Свойства.Получить("Items").Тип);
ТипShipping = Объект.Items.Shipping.ВладеющееСвойство.Тип;
Для Сч = 1 по 10 Цикл
    Shipping = Фабрика.Создать(ТипShipping);
    Shipping.id = Сч;
    //////
    Объект.Items.Shipping.Добавить(Shipping);
КонецЦикла;
19 nesergey
 
26.05.15
12:00
(9), (18) Спасибо! Это то что надо, разобрался.
20 Широкий
 
26.05.15
12:05
Фабрика=СоздатьФабрикуXDTO("C:\Фабрика.xml");
    ПространстваИмен=Фабрика.Пакеты[1].URIПространстваИмен;
    
    Тип_doUpdate=Фабрика.Тип(ПространстваИмен,"doUpdate");
    Тип_Shipping=Фабрика.Тип(ПространстваИмен,"Shipping");
    Тип_Items=Тип_doUpdate.Свойства.Получить("items").Тип;
    
    Объект_Item=Фабрика.Создать(Тип_doUpdate.Свойства.Получить("items").Тип);
    
    Объект_Shipping=Фабрика.Создать(Тип_Shipping);
    Объект_Shipping.id=1;
    Объект_Item.Shipping.Добавить(Объект_Shipping);
    
    Объект_Shipping=Фабрика.Создать(Тип_Shipping);
    Объект_Shipping.id=2;
    Объект_Item.Shipping.Добавить(Объект_Shipping);
    
    Объект_doUpdate=Фабрика.Создать(Тип_doUpdate);  
    Объект_doUpdate.initiator="222";
    Объект_doUpdate.token="уц";
    Объект_doUpdate.items=Объект_Item;
21 Широкий
 
26.05.15
12:06
Тип явно не был указан
22 Serginio1
 
26.05.15
12:17
(19) Есть в модуле Поиск ОбщийМодуль.ЭлектронныеДокументыВнутренний.Модуль

Функция

Функция ПолучитьТипОбъектаCML(Тип, ВерсияСхемы)
    
    МассивПути = СтрРазделить(Тип, ".");
    
    ПервыйЭлемент = МассивПути[0];
    Если Лев(ПервыйЭлемент,1) = "{" И Прав(ПервыйЭлемент,1) = "}" Тогда
        ИмяПакета = Сред(ПервыйЭлемент, 2, СтрДлина(ПервыйЭлемент) - 2);
        Коллекция = ФабрикаXDTO.Пакеты.Получить(ИмяПакета).КорневыеСвойства;
    ИначеЕсли ВерсияСхемы <> "4.02" Тогда
        ТипОбъекта = ФабрикаXDTO.Тип(ВерсияСхемы, ПервыйЭлемент);
        Коллекция = ТипОбъекта.Свойства;
    Иначе
        ТипОбъекта = ФабрикаXDTO.Тип("http://v8.1c.ru/edi/edi_stnd";, ПервыйЭлемент);
        Коллекция = ТипОбъекта.Свойства;
    КонецЕсли;
    
    МассивПути.Удалить(0);
    Пока МассивПути.Количество() > 0 Цикл
        
        Если Коллекция = Неопределено Тогда
            Возврат Неопределено;
        КонецЕсли;
        
        Свойство = Коллекция.Получить(МассивПути[0]);
        Если Свойство = Неопределено Тогда
            Возврат Неопределено;
        КонецЕсли;
        
        ТипОбъекта = Свойство.Тип;
        МассивПути.Удалить(0);
        Попытка
            Коллекция = ТипОбъекта.Свойства;
        Исключение
            Коллекция = Неопределено;
        КонецПопытки;
        
    КонецЦикла;
    
    Возврат ТипОбъекта;
    
КонецФункции
23 Serginio1
 
26.05.15
12:21
ПолучитьТипОбъектаCML("{"+ПростанствоИмен+"}.doUpdate.items, "")
24 Fragster
 
гуру
26.05.15
12:36
(20) а, там у вложенного описания типа имя есть. тогда проще, да :)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший