Сторонний Веб сервис, XDTO #671535


#0 by Bliz
Задача: есть сторонний сервис в интернете у которого прописано API команды получения данных из сервиса Соединение и выполнение некоторых API команд происходит успешно, если в параметрах команд простые типы (Число, Дата, Булево), а если в параметрах необходимо передать Массив, или структуру то вызов не проходит. Скорей всего необходимо Объект 1с (Массив, Структуру и т.п.) перевести в Тип который ожидает сервис. в первых 3 параметрах указывается информация аутентификации, а в 4 параметр надо для этой функции передать пустой массив. При этом при вызове функции выдается ошибка "Ошибка установки соответствия префикса и URI пространства имен" Видимо надо каким то образом указать, что мой массив принадлежит тому пространству имен который ожидает сервис. Не пойму как это сделать Доп. инфа: URIПространстваИмен = "urn:ddengi" Подключение к веб сервису: ОпределениеТ=Новый WSОпределения("http://www.drebedengi.ru/soap/dd.wsdl"); WSСервис=ОпределениеТ.Сервисы[0];
#0 by Bliz
Задача: есть сторонний сервис в интернете у которого прописано API команды получения данных из сервиса Соединение и выполнение некоторых API команд происходит успешно, если в параметрах команд простые типы (Число, Дата, Булево), а если в параметрах необходимо передать Массив, или структуру то вызов не проходит. Скорей всего необходимо Объект 1с (Массив, Структуру и т.п.) перевести в Тип который ожидает сервис. в первых 3 параметрах указывается информация аутентификации, а в 4 параметр надо для этой функции передать пустой массив. При этом при вызове функции выдается ошибка "Ошибка установки соответствия префикса и URI пространства имен" Видимо надо каким то образом указать, что мой массив принадлежит тому пространству имен который ожидает сервис. Не пойму как это сделать Доп. инфа: URIПространстваИмен = "urn:ddengi" Подключение к веб сервису: ОпределениеТ=Новый WSОпределения("http://www.drebedengi.ru/soap/dd.wsdl"); WSСервис=ОпределениеТ.Сервисы[0];
#1 by Bliz
Либо надо при создании параметра использовать ФабрикуXDTO которую выдает WSПрокси. Там вот такая фабрика За ранее хочу сказать, что с XDTO и сервисами только пытаюсь, что то делать, поэтому возможно неправильно использую термнилагию.
#2 by Bliz
*терминалогию.
#3 by Serginio1
Что типа такого Типа такого Фабрика=Прокси.ФабрикаXDTO; или
#4 by Serginio1
.... Заполняем поля СтрокаТаблицы Таблица.СвойствоСписок.Добавить(СтрокаТаблицыЦен); (СвойствоСписок это сойство тип СтрокаТаблицы у которой максимальное количество -1
#5 by Bliz
если у меня у Прокси.ФабрикаXDTO; только один пакет "http://www.w3.org/2001/XMLSchema" Получается, что в ней нету типов "Таблица" "СтрокаТаблицы" или "array" Пробовал написать вот так: ПространствоИмен="http://www.w3.org/2001/XMLSchema"; Но выдается сообщение "Ошибка SOAP сервера:  getCurrencyList: Parameter 'idList' must be an array" Если передаешь просто "anyType" "Ошибка при вызове метода объекта модели XDTO. Неверный параметр."
#6 by Serginio1
При использовании anyType массивом он будет только когда 2 элемента
#7 by Bliz
Связывался с разработчиком, он говорит что этот параметр должен быть пустой, он служебный и заполнять его не надо. Но при этом он ругается, что параметр не заполнен при вызове из 1с.
#8 by Bliz
2 элемента ситуацию не спасло... все равно пишет попробовал записать этот объект в хмл вот такой код: <anyType xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
#9 by Serginio1
Передай пустую строку Фабрика.Создать(Фабрика.Тип(ПространствоИмен, "string"),""); или можно попробовать ТипNull=Фабрика.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");        СсылкаNull=ФабрикаДляКомплексной.Создать(ТипNull); и эту ссылку передать
#10 by Serginio1
СсылкаNull=Фабрика.Создать(ТипNull);
#11 by Bliz
Первый вариант "Ошибка при вызове метода объекта модели XDTO. Неверный параметр." Второй вариант: "Обязательный параметр не задан:  {urn:ddengi}:ddengiService:getCurrencyList(...idList...)"
#12 by Serginio1
Вообще -<message name="getCurrencyList"><part name="apiId" type="xsd:string"/><part name="login" type="xsd:string"/><part name="pass" type="xsd:string"/><part name="idList" type="xsd:anyType"/></message> там эни тайп. Спроси у разработчика какой должен быть xml запроса
#13 by Bliz
Он посоветовал, поставить php там есть рабочий пример на пхп. Пошел, ставить, поидее там же и будет видно какой должен быть XML запрос.
#14 by Serginio1
Если посмотреть на то подключают они -<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://xml.apache.org/xml-soap" map из можешь сохранить в файл и дописать ипорт смотри 82 и попробу передать пустой map. Эти пэхэпэшники пространства имен по умолчанию не указывают в дерективах импорта
#15 by Serginio1
Не знаю где лежит описание но тебе нужно импортировать наподобие <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
#16 by Serginio1
Или можешь сохранить в файл описание и сохранить в файл <schema elementFormDefault="qualified" targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> и в schemaLocation указать путь к этому файлу
#17 by Bliz
Сохранил в файл, что ты указал. Далее в конфу в пакеты XDTO загрузил эту схему далее: "Ошибка установки соответствия префикса и URI пространства имен" Попробовал в этом XDTO указать пространство имен "urn:ddengi" выдало "Неверный параметр" как выглядит MAP в ХМЛ: <Map xmlns="http://xml.apache.org/xml-soap" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> Что касается не совсем понял как импортировать это, поидее уже готовый тип.
#18 by Serginio1
Тебе нужно это надо прописать в файле wsdl То есть скачать Тогда тебе будут доступны при загрузке этого файла все определения пространств имен у прокси Там в файле есть секция определяющая путь к первису и точки подключения -<service name="ddengiService">-<port name="SoapPort" binding="typens:SoapBinding"><soap:address location="http://www.drebedengi.ru/soap/"/></port></service></definitions> И тогда этот пакет появится у прокси фабрики и бебе будет доступно Объект = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип("http://xml.apache.org/xml-soap","Map"));
#19 by Bliz
Сохранил wsdl далее в какое место файла необходимо вставить: Вставлял вначало сразу же после объявления. Выдается ошибка при выполнении: ПутьКСохраненнойСхеме="C:Tempdd.wsdl"; "Фатальная ошибка: Extra content at the end of the document Не совсем понял, для чего ты указываешь: "Там в файле есть секция определяющая путь к первису и точки подключения"
#20 by Serginio1
Смотри 82 там после импорт идет в секции типов Попробуй создать эту секцию со свои пространством имен
#21 by Serginio1
#22 by Bliz
Добавил вот это: В прокси появились доп. пакеты: "http://schemas.xmlsoap.org/soap/encoding/"
#23 by Serginio1
для получения map
#24 by Serginio1
можно почитать
#25 by Serginio1
#26 by Bliz
добавил Пакет в прокси появился Ошибка: "Свойство 'item' не обнаружено"
#29 by Serginio1
Добавь какой нибудь элемент или как в демо
#30 by Bliz
Ошибка: Несоответствие типов XDTO: Тип '{' не найден Тип объекта не является открытым
#31 by Bliz
ошибка выдается при выполнении строки Объект.Добавить...
#32 by Serginio1
итак для всех кей валуе
#33 by Serginio1
тебе нужно заполнять как в 3 только таблица это map а СтрокаТаблицы это Item и простанчтво имен
#34 by Bliz
ты указал на код "Set currency list" поидее, это какая то запись в базу. В параметрах надо указать "list" думаю это не тоже самое, что и "idList" в параметрах вызова операции getCurrencyList Судя по всему Веб сервис там ожидает только числовые значения, т.к. выдается ошибка на какой то другой Попробовал указать 0, тогда вызов проходит getCurrencyList (думал это уже не случится=)), но ответ приходит пустой.
#35 by Bliz
Написал еще разработчику, может подскажет какими значениями надо заполнить параметр idList чтобы получить норм ответ.
#36 by Bliz
Serginio1, а как то можно в схеме wsdl которую мы указываем, для параметра  idList указать, что он не является обязательным? Когда в конфу загружаешь по ссылке wsdl, то там у параметров показывается свойство: Возможно пустое, там оно везде Ложь
#37 by Serginio1
Возможно ошибки были при возврате значения см 100 Там точно возвращался map а 1С не могла разобрать этот тип
#38 by Bliz
у меня возвращается Неопределено, и ошибки не выскакивает "МинимальноеКоличество=0 minOccurs="0" maxOccurs=1" Поставил вот так Ошибка: Ошибка разбора XML:  - [79,28] Фатальная ошибка: Попробовал просто удалить эту строку idList, тогда параметр не требуется но при вызове функции, но сервер все равно выдает ошибку: Т.е. это на стороне сервера...
#39 by Serginio1
Знач проблема на сервере или что то нужно подставлять по умолчанию minOccurs это для полей структуры. Хрень сморозил. Есть понятие возможно пустое значение, но туда передается anySimpleType
#40 by Serginio1
можешь поиграться с
#41 by Bliz
Нашел еще один варинат работы через SOAP клиент, с помощью , но результат тот же. Ошибка: "Произошла исключительная ситуация (Client): Client:Incorrect number of parameters supplied for SOAP request HRESULT=0x80070057: Параметр задан неверно. - Client:Unspecified client error. HRESULT=0x80070057: Параметр задан неверно." Уже можно указать "" в качестве параметра, но при попытке выполнить выдает: Произошла исключительная ситуация (SoapMapper): SoapMapper:Restoring data into SoapMapper anyType failed HRESULT=0x8007000E: Недостаточно памяти для завершения операции. - Client:Unspecified client error. HRESULT=0x8007000E: Недостаточно памяти для завершения операции. Ссылка на описание:
#42 by Bliz
Думал, мб с 1с что то. Сделал подключение через SoapClient с помощью AutoIT результат, тот же не удается выполнить команды.
#43 by Serginio1
П на php то что выдает?
#44 by Bliz
у меня что то проблемы с установкой PHP на комп, точнее с портом 80. Пробовал Денвер, поидее ничего не надо прописывать, устанавливаешь и все. Вообщем пока php код не могу выполнить.
#45 by Bliz
похоже на php все работает... вызов проходит нормально. Приплыли...
#46 by Serginio1
Значит  надо смотреть  какой запрос выдает php
#47 by Serginio1
#49 by Bliz
добавил в wsdl строку <import namespace="http://www.w3.org/2001/XMLSchema-instance"/> Далее в коде пытаюсь выполнить: Объект = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema-instance","nil"));
#50 by Bliz
Не может выполнить
#51 by Bliz
Фабрика.Тип("http://www.w3.org/2001/XMLSchema-instance","nil")
#52 by Serginio1
А ты импортировал?
#53 by Bliz
добавил в wsdl строку <import namespace="http://www.w3.org/2001/XMLSchema-instance"/>
#54 by Bliz
В пакетах у прокси она появилась
#55 by Serginio1
Вообщето такую строку формирует ТипNull=Фабрика.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");
#56 by Bliz
СсылкаNull=Фабрика.Создать(ТипNull);
#57 by Bliz
В этом случае  СсылкаNull= Неопределено
#58 by Serginio1
Это неопределено в отладчике. А вот если присвоить это значение какомунибудь anyType она правильно прописывает. при записи в файл дает
#59 by Bliz
"А вот если присвоить это значение какомунибудь anyType она правильно прописывает." Возможно, но как это сделать, чтобы передать в параметр WS операции...
#60 by Bliz
В XML файле получается так: <anyType xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> При вызове операции выдается ошибка... Ошибка SOAP сервера:  getCurrencyList: Parameter 'idList' must be an array
#61 by Serginio1
#62 by Serginio1
Попробуй через WSПараметр
#63 by Serginio1
Если неявное то и прописать соответствие пространства имен
#64 by Serginio1
не в тему. Попробуй через HTTPСоединение
#65 by Bliz
тоже не понял к чему
#66 by Serginio1
Попробуй прописать nillable="true" message name="getCurrencyList"><part name="apiId" type="xsd:string"/><part name="login" type="xsd:string"/><part name="pass" type="xsd:string"/><part name="idList" type="xsd:anyType"  nillable="true"/> В 1с для параметров создантся структура
#67 by Serginio1
У параметра StructPrice стоит возможно пустое
#69 by Bliz
В wsdl прописал Результат: {Форма.Форма.Форма}: Недостаточно фактических параметров
#70 by Serginio1
Вообще то nillable="true" для anyType это не совсем то. Кстати, а что возвращает то сервис? и что возвращает 'idList' must be an array
#71 by Bliz
Ответ от разработчика: "Вам нужно добиться, чтобы передаваемый XML был таким-же, как у PHP скрипта. На самом деле не только у PHP скрипта, многие стандартные библиотеки, в частности под все мобильные устройства - тоже умеют это делать, т.к. независимые разработчики это реализовали в  приложениях. Каким должно быть значение параметра, чтобы 1с сгенерил такой XML - вам нужно разобраться."
#72 by Bliz
сервис вернет, поидее массив записей о движениях, вроде как. "и что возвращает " Честно говоря не понял, для чего этот сервис. "Нагрузочное тестирование веб сервисов" ?
#73 by Serginio1
Можешь тестировать вэб сервис
#74 by Serginio1
Кстати попробовал создал структуру соответсвующую параметрам Фабрика=ФабрикаXDTO; ТипNull=Фабрика.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");
#75 by Serginio1
или можно попробовать странно, что он выдает ответ Ошибка SOAP сервера:  getCurrencyList: Parameter 'idList' must be an array А какой эррай если передается nil?
#76 by Serginio1
Это по идее, а что реально возвращает PHP?
#77 by Bliz
Еххууууу
#78 by Bliz
нашел как
#80 by Bliz
по этой теме: хз как на нее вышел
#81 by Bliz
Понимаю, что это не особо средствами 1с... Но все же, лучше чем ничего. Огромное спасибо за помощь Serginio1
#82 by Serginio1
А объекты ты можешь из XML ответа подгружать используя прокси фабрику.
#83 by Serginio1
А 64 не подошел? httpServer="www.drebedengi.ru"; Адрес="soap";
#84 by Bliz
не выполяется поставил httpServer="http://www.drebedengi.ru/soap/"; Адрес="SoapPort"; все равно ошибку выдает
#85 by Serginio1
Ну и . Главное 79 Работает
#86 by Serginio1
Читает объект map
#87 by Serginio1
Для каждого стр Из ОбъектXDTO.getCurrencyListReturn.item Цикл        Для каждого валюта Из стр.item Цикл
#88 by Serginio1
Там кстати достаточно responseText=xmlHttp.responseText;
#89 by Serginio1
Если То пропускаются определения и сначала идет потом ns1:getCurrencyListResponse тоесть можно создать универсальную функцию для чтения результата, который будет 2 То есть
#90 by Bliz
Почему то при чтении выдает ошибку
#91 by Bliz
в wsdl в шапке прописано
#92 by Bliz
в файле map
#93 by Serginio1
Сохранил  схему "http://xml.apache.org/xml-soap/" в файл d: mpapachmap.xsd и прописал импорт <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ddengi">
#94 by Serginio1
Да у меня еще стоит 8.3
#95 by Serginio1
Стал разбираться с возможно пустой параметр. nillable в параметрах не прокатывает в 1с для параметров городится структура г де у параметра указывается nillable  например
#96 by Bliz
Можешь скинуть файл Map и dd.wsdl ? Платформу 8.3 поставил, ошибка не уходит.
#97 by Serginio1
xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
#98 by Serginio1
<!-- WSDL file generated by Zend Studio. --> <definitions name="ddengi" targetNamespace="urn:ddengi" xmlns:typens="urn:ddengi" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">            drebedengi.ru web-service description; In this document term "waste" means expense.            <documentation>                Delete all data (transactions, waste category, income source, place list, currency and tags; Used for synchronization in case of the conflicts; Returns void if success, or throws SoapFault exception;            </documentation>                Delete any object; [id] => ID of the object to delete; [type] => The type of the object, must be one of: 'waste' 'income' 'move' 'change' 'object' 'currency' 'tag' 'accum'; 'object' is waste category, income source or place; If 'id' identifies 'move' or 'change', both records will be deleted on the server; Returns 1 on success; if an error accures - generates SoapFault message; if there is other object connected to this ID - delete them first;                Get current payment status; Returns 1 if Ok, throw SoapFault otherwise.                Gets list of purchases (accums); For purchase list logic is only needed fields 'id, name, sum_need, sum_currency_id, user_id, is_family, created, comment, priority, order_id', other fields is for accum logic and should not be changed; ; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;                Retrievs waste category list (array of arrays): [id] => Internal category ID; [parent_id] => For tree structure; [budget_family_id] => User family ID (for multiuser mode); [type] => Type of object, 3 - waste category; [name] => Category name given by user; [is_hidden] => is category hidden in user interface; [sort] => User sort of category tree; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;                Get all changes (array of arrays) from server relative to given revision: [revision] => the revision of the change, [action_id] => the action of the change '1' - add, '2' - update, '3' - delete'; [object_type_id] => type of the object changed '1' - any record (transction), '2' - income source, '3' - waste category, '4' - place, '5' - currency, '6' - budget_tags, '7' - budget_accum, '8' - budget_accum_order; [object_id] => ID of the object for subsequent calls getRecordList, getCategoryList etc; [date] => the date of the change; Parameter [revision] => int8 number, usually saved on the client from last successfull sync.                Retrievs currency list (array of arrays) with codes and courses: [id] => Internal currency ID; [name] => Currency name, given by user; [course] => current course from sbrf(dot)ru; [code] => International currency code (for course autoupdating); [family_id] => User family ID (for multiuser mode); [is_default] => is default currency# There should be only one default currency; [is_autoupdate] => autoupdate course once per day, from sbrf(dot)ru; [is_hidden] => is currency hidden in user interface; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;                Get current server revision number.            <documentation>                Get expire date of active subscription (payed until) for the user - [YYYY-MM-DD]; If there is no active subscription return 0; If an error accur return -1;            </documentation>            <documentation>                Gets list of orders for purchases; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;            </documentation>                Get user right access for multi user mode; Returns 0 - full access, 1 - limited access; For limited access it is neccessary to use getBalance method to display user balance in the application; In this case local transactions must simple increment balance, but not compute that as sum of all transactions;                Retrievs income source list (array of arrays): [id] => Internal source ID; [parent_id] => For tree structure; [budget_family_id] => User family ID (for multiuser mode); [type] => Type of object, 2 - income source; [name] => Source name given by user; [is_hidden] => is income hidden in user interface; [sort] => User sort of source tree; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;                Retrievs tag list (array of arrays): [id] => Internal tag ID; [family_id] => User family ID (for multiuser mode); [name] => Tag name given by user; [is_hidden] => is tag hidden in user interface; [is_family] => is tag visible for all family user, or user only; [sort] => User sort of tag list; If parameter [idList] is given, it will be treat as ID list of objects to retrieve# this is used for synchronization;            <documentation>                Get internal user ID by login; For multi user mode, this value contained in 'purse_of_nuid' field of the current user;                Insert or update accum list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getAccumList description for other detail; Returns the array of server IDs, successfully changed; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;            <documentation>                Insert or update waste category list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getCategoryList description for other detail; Returns the array of server IDs, successfully changed; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;            <documentation>                Insert or update currency list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getCurrencyList description for other detail; Returns the array of server IDs, successfully changed; If 'is_default' flag set to another currency, then previos updated too and sent in return array; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;            </documentation>                Approve payment from Apple; [transactionReceipt] - is a signed ricept string returned from apple while purchasing, this shoud be base64 decoded; [amount] - the sum amount of the purchase, in USD; Return expire date of the subscription, getExpireDate for the description of the return values;                Insert or update place list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getPlaceList description for other detail; Returns the array of server IDs, successfully changed; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;            <documentation>                Insert or update income source list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getSourceList description for other detail; Returns the array of server IDs, successfully changed; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;                Insert or update tag list; [list] => array of arrays: 'server_id' or 'client_id' [int8] - server or client ID of the record# If client ID is present - try to insert new record, and return server2client correspondence in the result array# If server_id is present - try to update existing record, getTagList description for other detail; Returns the array of server IDs, successfully changed; The client MUST save server IDs corresponded to client IDs, for subsequent 'update' and 'delete' calls;            <documentation>                Reqister new user; Return user password on successfully register; If an error accur return -1 (such email already exist), -2 (register not allowed), -3 (email incorrect), -4 (other error); [lang] - 'en' or 'ru';
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С