Имя: Пароль:
1C
1С v8
WEB - сервис стороннего приложения. В тупике. Ошибка при вызове метода.
0 new_hope
 
09.04.20
18:55
Имею работающий Веб сервис. Все работает, данные получаю. Вернее получал до сегодняшнего дня.
Делал запросы - получал данные и все было хорошо.
Данные, которые я получал были в таблице, поля которой были исключительно примитивных типов (Строки, числа)

Появился на ресурсе новый метод, мне его нужно использовать и получать данные, но в таблице (ответе) появился тип (не примитивный), как я понимаю, ссылка на другую таблицу (или строку другой таблицы с данными).
И все. При запросе получаю ошибку:
http://i.piccy.info/i9/3ce5f37aa06c1bdd4178664e75d5eca2/1586446965/16763/1372020/Oshybka.png

Код:
http://i.piccy.info/i9/dfa68d23bc7a7c0dc3adc2235febe528/1586446560/24219/1372020/Kod.png

ВС_Ссылка
http://i.piccy.info/i9/8c66be63a64ad07501d02f86616524c9/1586447616/8452/1372020/WS_Link.png

Описание типов?:
http://i.piccy.info/i9/18d60f474d77935ea16a67a37dccaa3a/1586447699/14998/1372020/OpysanyeTypov.png

и сама "подчиненная" таблица:
http://i.piccy.info/i9/b5410fa5ecf873d50d5ba1ecd04ce915/1586447763/7558/1372020/Opysanye_tablytsy_etoi_ssylky.png

Постарался как смог описать свою проблему. Не пойму, как получить в 1С данные.
Например - программой SoapUI я получаю данные.
1 new_hope
 
09.04.20
19:06
То-есть оно пишет ошибку, что не может типа проверить это "дополнительное" свойство (то-есть это поле, которое не примитивное а является явно другой таблицей...) Как это все увязать?
Хотябы пример какойто похожий?
2 acht
 
09.04.20
19:08
вссылку обнови
3 new_hope
 
09.04.20
19:09
(2) та это сделано в самую первую очередь... Или ее нужно динамически обновлять при каждом запросе? (я ее в конфигураторе тока обновил)
4 NorthWind
 
09.04.20
19:24
Может, поднять фиддлер и посмотреть что реально приходит, а потом сравнить это со схемой? Если метод свежевнедренный, то не исключены и ошибки разработчиков сервиса...
5 new_hope
 
09.04.20
19:25
(4) А что такое Фиддлер? Можно чуть поподробнее, по этому моменту?
6 new_hope
 
09.04.20
19:26
(4) Понял... прокси отладочный... ну это также для меня новое поле знаний
7 NorthWind
 
09.04.20
19:27
(5) это такая штука, которая перехватывает веб-трафик (wininet.dll) и показывает его. Веб-отладчик. Можно смотреть что вы отправляете на сервис и получаете с него
8 Cyberhawk
 
09.04.20
19:34
Так у тебя в ответе походу приходит не то содержимое, что ожидается
9 new_hope
 
09.04.20
19:41
(8) нууу... наверное да... Но вот программой SoapUI которой меня ткнули носом - данные получает - она отрабатывает и какие то данные приходят... типа "на все работает"

А в 1С? С точки зрения кода и запроса все ок? рядом методы работают - но там тока примитивные типы. В методах, где есть кроме примитивных типов данных - вот то, что я указал - все. капут!
10 Cyberhawk
 
09.04.20
19:42
Если дашь доступ к веб-сервису, то смогу посмотреть
11 Garykom
 
гуру
09.04.20
19:45
(0) >Появился на ресурсе новый метод

WSDL-схему перезагрузи и да могут быть приколы
12 new_hope
 
09.04.20
20:01
(11) Уже. В конфигураторе
13 new_hope
 
09.04.20
20:02
Вот в сторонней программе запрос отрабатывает:

http://piccy.info/view3/13748209/7d6ad3d5935fb9963e5e7f129d19d63f/
14 new_hope
 
09.04.20
20:02
Короче - надо торбить разработчика, как я понял
15 NorthWind
 
09.04.20
20:10
(13) вы обратили внимание, что у вас в теге ACTS элементов меньше чем указано в схеме? D_ISSUE и ORDERS нет. Они ненароком не обязательные? По остальным нормально все - т.е. данные примерно соответствуют типам и фасетам?
16 NorthWind
 
09.04.20
20:13
дело не в том отрабатывает запрос или нет. Дело в том что вы XDTO-пакет для разбора ответа генерируете по схеме, но во-первых, в схеме не исключены мелкие косяки, во-вторых, составные элементы в SOAP могут представляться немножко по-разному и из-за этого разные клиентские библиотеки иногда лажаются. 1Cный XDTO не исключение.
17 new_hope
 
09.04.20
20:17
(15)  Понял... а и вправду - нету в ответе "D_ISSUE и ORDERS".... Както странно
18 NorthWind
 
09.04.20
20:23
(17) на самом деле если они необязательные, то это влиять не должно. Надо проверить.
19 new_hope
 
09.04.20
20:26
(18) А как понять, обязательные они или нет? Это можно в описании wdsl увидеть?
20 new_hope
 
09.04.20
20:30
21 new_hope
 
09.04.20
20:35
А.... и может это.... версия 1С 8.3.10
22 NorthWind
 
09.04.20
20:53
(20) минимальное количество элементов D_ISSUE=1. Т.е. как минимум один должен быть. А у вас ни одного.
23 NorthWind
 
09.04.20
20:54
+ поменяйте на ноль и посмотрите что и как будет происходить
24 NorthWind
 
09.04.20
20:56
это я и имел в виду под "мелкими косяками". Элем описан как обязательный, но в продакшене ответ идет без него.
25 Cyberhawk
 
10.04.20
13:37
(20) Минимальное кол-во = 1, обязательное
26 new_hope
 
10.04.20
14:14
Еще вопрос - ответ от сервера - это данные в виде XML ?
27 NorthWind
 
10.04.20
14:16
(26) да, конечно. SOAP так и работает - запрос в виде XML, ответ тоже в виде XML.
28 new_hope
 
10.04.20
14:17
И и этот "ответ" (XML) 1С-ка преобразует в свой собственный объект XDTO.... Верно я понимаю?
29 NorthWind
 
10.04.20
14:19
(28) нет. Как я понимаю, сервер отправляет ответ, XDTО-пакет его проверяет на соответствие схеме (где у вас и происходит ошибка) и затем разбирает, разбрасывая данные по полям. После чего к ним можно обращаться из программы на 1С.
30 NorthWind
 
10.04.20
14:20
* сорри, неверно вашу реплику прочитал. Все верно.
31 new_hope
 
10.04.20
14:23
(25) Не меняя ничего они мне смоделировали набор данных (за один определенный деть) со всеми полями, которые есть и указаны. Всеравно ошибка.
32 new_hope
 
10.04.20
14:30
У меня поле "ORDERS" составного (не примитивного типа)... для таких полей нет никаких в 1С определенных специальных методов работы или получения данных?

Короче... уже всех задрал чувствую :-) пардон.
33 NorthWind
 
10.04.20
14:49
(31) навскидку сказать сложно, нужно проводить эксперименты. Как вариант, можно "сыграть" наоборот - заполнить поля в XDTO-пакете и записать XML, и сравнить получившееся с тем что возвращается сервером. Тут и вылезет косяк.
34 new_hope
 
10.04.20
16:56
Маленький вопрос.. Это не может касаться моего Варианта (вычитал на просторах интернета, в том числе и на ИТС):

Типы делятся на простые (simple) и составные (complex). Составные типы могут иметь несколько моделей содержимого, но XDTO поддерживает только простые последовательности свойств - так называемые sequence. (Для контента сложных типов следует использовать только модель sequence - ИТС)

Может быть проблема какраз в этом?
35 NorthWind
 
10.04.20
18:44
(34) да, вполне может быть в этом.
36 Сияющий в темноте
 
10.04.20
23:20
можно через httpзапрос отправить запрос и разобрать ответ вручную,но это придется пеоеписывать при каждом изменении сервиса.
37 Сияющий в темноте
 
10.04.20
23:21
и можно спросить,если на той стороне сервис писали кодом,то лучше и на этой работать кодом,тогда странных ошибок будет меньше.
38 H A D G E H O G s
 
10.04.20
23:33
Тащить WSDL схему на каждый чих - такое себе.
Закешируйте его в tmp файл при первом обращении программы и обновляй при перезапуске 1С.
39 NorthWind
 
11.04.20
08:17
(36) вот только пересмотрел я ответ (13) и не увидел там никакой зауми... Обычные вложенные элементы, чего XDTO не может там вычитать - на первый взгляд непонятно. Я бы все-таки внимательно посмотрел на пакет и элементы. Где-то что-то не соответствует скорее всего.
40 new_hope
 
13.04.20
14:53
(37) Кодом - это как...на этой стороне? Можно "работать" еще както совсем другим кодом?
На той стороне НЕ 1С
41 NorthWind
 
13.04.20
19:31
(40) это понятно что не 1С. Серьезные нагруженные системы такого плана пишутся на Java обычно или еще на чем-то подобном.
Имеется в виду следующее: вмешаться в механизм разбора XDTO-пакета нельзя, он - вещь в себе. У него, например, нет процедур обработки событий, которые бы позволили подправить входящие узлы перед обработкой или сделать еще что-то подобное. Поэтому если возможности по подправке XSD/WSDL исчерпаны, то остается только разбирать ответы руками, что адски неприятно для серьезных сервисов, где таких пакетов может быть много.
42 NorthWind
 
13.04.20
19:38
если вы уверены что у вас все хорошо со схемой - попробуйте платформу посвежее. Может, вам повезет и это ошибка платформы, которую со временем устранили.
43 Serginio1
 
14.04.20
13:48
Если вдруг не получится можно воспользоваться Использование классов .Net в 1С для новичков В свое время для таких случаев и писал
Не всегда сторонние схемы  соответствует 1С Wsdl. Прелесть C# в том, что всегда можно для типа реализовать IXmlSerializable и ты сам будешь контролировать сериализацию.
Ну или Скачать Wsdl и заменить тип на Any импортировать и уже  самому программно разбирать объект XDTO
44 new_hope
 
14.04.20
18:03
(42) Пробовал и на 16-й версии - все таже ошибка, к сожалению.
Как я понимаю, со стороны 1С уже ниначто не повлиять. осталось ждать совместимости со стороны разработчика сервиса. :-(
45 NorthWind
 
14.04.20
18:32
(44) не видя xsd и не имея хотя бы 1-2 респонсов в виде текстовых файлов, трудно родить каких-либо идей кроме тех что уже были озвучены. Выложите - ну, можно будет попробовать выбрать время посмотреть.
46 milan
 
14.04.20
20:34
Плюнул в свое время , запрашиваю и разбираю ответы ручками.
47 new_hope
 
15.04.20
17:40
(46) можно пример как Вы это делаете?
48 Serginio1
 
16.04.20
14:05
49 new_hope
 
17.04.20
12:22
(46)
Получил информацию.

Выкладываю XSD схему:
https://mega.nz/file/0N1V1RqC#fKsFrc_cZDmsOWAUa2Nao_Wuc7yRHwzc8Em9u5BoIc8

И ответ сервера по запросу (xml файл):
https://mega.nz/file/AN03TTbS#sP_fKiVQhO-OGhJrbqBbmKEhhnJc9_ZUtndsvfuseXM
50 NorthWind
 
17.04.20
16:10
Уже вижу косяк. В XSD у вас
  <xs:complexType name="OcInsOrderCompensationResponceDto">
    <xs:sequence>
      <!-- Номер приказа на выплату -->
      <xs:element name="NUM_PO" type="xs:string" minOccurs="0" />

а в респонсе
               <ns2:ORDERS>
                  <ns2:NUM>003/037/000012/20/1/1</ns2:NUM>

т.е. номера обозваны по-разному. Если подправить в схеме NUM_PO на NUM и удалить из XML-файла SOAPовские обертки:

==Response_mista1.xml==

<?xml version="1.0" encoding="UTF-8"?>
         <ns2:insCompensationCurrentInfo xmlns:ns2="http://othersoft.com/oc/schemas">;
            <ns2:UID>sc105960</ns2:UID>
            <ns2:D_CLAIM>2020-03-26</ns2:D_CLAIM>
            <ns2:EL_RISK>osago-damage</ns2:EL_RISK>
            <ns2:DECL>47800.0</ns2:DECL>
            <ns2:ACTS>
               <ns2:D_ISSUE>2020-03-27T00:00:00+02:00</ns2:D_ISSUE>
               <ns2:OBJ_UID>c2021330</ns2:OBJ_UID>
               <ns2:C_INSUR>7663</ns2:C_INSUR>
               <ns2:NUM>003/037/000012/20/1</ns2:NUM>
               <ns2:SUM_ACT>47800.0</ns2:SUM_ACT>
               <ns2:ORDERS>
                  <ns2:NUM>003/037/000012/20/1/1</ns2:NUM>
                  <ns2:SUM_RECEIPT>47800.0</ns2:SUM_RECEIPT>
                  <ns2:CUSTOMER_S>Админченко Админ Админович</ns2:CUSTOMER_S>
                  <ns2:OKPO>2883334290</ns2:OKPO>
               </ns2:ORDERS>
            </ns2:ACTS>
         </ns2:insCompensationCurrentInfo>

тогда следующий код

    чОтвет = Новый ЧтениеXML ();
    чОтвет.ОткрытьФайл("D:\Response_mista1.xml");
    
    Файл = ФабрикаXDTO.ПрочитатьXML(чОтвет, ФабрикаXDTO.Создать("http://othersoft.com/oc/schemas";, "OcInsCompensationCurrentInfo").Тип());

грузит ваш файлик.
51 new_hope
 
17.04.20
16:56
(50)ОГО - спасибо! Большое!

А по поводу "Соаповские" обертки - разработчики сервиса с ними тоже должны что-то подправить?
52 new_hope
 
17.04.20
17:04
Кстати - в  WDSL файле также "NUM_PO" ::-(
53 new_hope
 
17.04.20
18:06
Все это от собственного незнания.... В Программе SoapUI есть возможность автоматически проверять "Правильность" соответствия данных -> схеме этих данных.

Немножко изучив функционал и нажав кнопочку "Validate" в окне ответа (где результат с данными) получил следующее - четко написано, что ожидается элемент "NUM_PO" (В ответе "NUM")

line 17: Expected elements 'NUM_PO@http://othersoft.com/oc/schemas SUM_RECEIPT@http://othersoft.com/oc/schemas CUSTOMER_S@http://othersoft.com/oc/schemas OKPO@http://othersoft.com/oc/schemas' instead of 'NUM@http://othersoft.com/oc/schemas' here in element ORDERS@http://othersoft.com/oc/schemas
54 NorthWind
 
17.04.20
18:34
(51) > А по поводу "Соаповские" обертки - разработчики сервиса с ними тоже должны что-то подправить?
Думаю, что нет. Типы Envelope, Header, Body - служебные, они обрабатываются библиотекой SOAP-клиента, в схемах не указываются.
А тип верхнего уровня OcConsolidatedCaseInfoListResponse, по-видимому, описан в WSDL.
Все оставшееся нормально обрабатывается вашей схемой, если ее подправить.
Если у вас есть контакт с разрабами - укажите им на ошибки. А если нет - исправьте сами ручками схему под данные да и пользуйтесь, пока не исправят.
(53) так я ж вам еще неделю назад говорил - проверяйте схему и сравнивайте ее с ответом. У вас там не сотни атрибутов - с такими размерами схем безо всякого SOAPUI делается глазками за несколько минут.
55 NorthWind
 
17.04.20
18:40
как вариант - можно вообще в схеме указать оба атрибута, как необязательные:
<xs:element name="NUM" type="xs:string" minOccurs="0" />
<xs:element name="NUM_PO" type="xs:string" minOccurs="0" />
и потом обработать программно встречаемость обоих из них. Т.е. по умолчанию берем NUM, а если его вдруг нет, то проверяем NUM_PO.
В этом случае у вас программа не упадет, когда они исправят атрибут и ответ внезапно пойдет с NUM_PO вместо NUM.
56 new_hope
 
21.04.20
09:58
(54) Приветствую! Супер . Спасибо.. вроде как почти понял темперь все необходимые нюансы

Тоесть, мне достаточно отредактировать WDSL файл в соответствии с ответом (данными), которые приходят в ответ от сервера? Это конечно просто, буду его в отредактированом виде использовать локально с диска.

Но вот саму схему (xsd файл) мне его прислали,  обственно на сам файл и его расположение как повлиять или достаточно WDSL?
57 new_hope
 
21.04.20
10:39
(54) У меня все получилось! Спасибо всем огромное! Банальная невнимательность разработчика сервиса!
58 NorthWind
 
21.04.20
13:11
(56) когда вы создаете WS-ссылку в конфигурации, вы импортируете WSDL. Также вы импортируете XSD, когда создаете XDTO-пакеты. Раз вы проимпортировали - вы фиксируете то состояние, в котором оно пребывает на момент, например когда вы скачали его у разработчика и подправили под свои нужды. Если у разработчика сервиса что-то поменяется, то придется еще раз это все проделать и еще раз передать вашу конфу пользователям - обновить там или еще как-то.

Как я понимаю, в норме разработчик сервиса должен обеспечить такие XSD и WSDL, которые позволяют все нормально импортировать куда угодно - в дельфю, в 1С, в С# и т.д. Но на практике все не так просто - есть немного различающиеся механизмы представления сложных объектов в XML, разные библиотеки web-клиентов могут по-разному это все разбирать, что-то они могут уметь, а что-то не уметь (привет, XDTO), в некоторых языках может быть даже конфликт атрибутов с зарезервированными словами. Кроме того, разработчики сервисов, как в вашем случае, могут косячить, это не редкость, и крайне долго и неохотно исправлять свои косяки. Короче, править иногда приходится. Это практически норма.
59 new_hope
 
21.04.20
14:09
(58) Да, по поводу XSD файла... я его, фактически, только посмотрел! А внес изменения только в файл wdsl (согласно с XML фалом данных, которые отвечает сервер, что-бы все "совпадало") поместил файл локально и импортировал его в конфигурацию. И все сразу заработало без ошибок.

Это я к чему - к тому, что я так и не ПОНЯЛ, какую функцию несет тот XSD файл для 1C (ведь в нем осталосьвсе поля без изменений на стороне сервиса), оказалось, что достаточно только правильного WDSL файла и все.
60 NorthWind
 
21.04.20
14:15
(59) в wsdl-файле может быть вот так:

   <wsdl:types>
      <xs:schema>
         <xs:import namespace="http://api.vetrf.ru/schema/cdm/application/ws-definitions";
                    schemaLocation="application_ws_definitions_v2.0.xsd"/>
         <xs:import namespace="http://api.vetrf.ru/schema/cdm/base/ws-definitions";
                    schemaLocation="base_ws_definitions_v2.0.xsd"/>
      </xs:schema>
   </wsdl:types>

но вообще этот вопрос - скорее к разработчику сервиса.