Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Некорректный %TimeStamp через SOAP из 1С / 12 сообщений из 12, страница 1 из 1
16.04.2015, 10:00
    #38937979
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
Исходные данные:
Веб-клиент Cache (сгенерирован из WSDL) соединяется с веб-сервисом 1С 8 и тянет некоторые объекты, у которых есть свойство EndDateContract, тип которого определен в WSDL как dateTime:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<xs:complexType name="Contracts">
<xs:sequence>
<xs:element name="Row" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
...
<xs:element name="EndDateContract" type="xs:dateTime"/>
...
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>



Генератор определил это свойство как (в Cache 2010 и в Cache 5.1 одинаково):
Код: plaintext
1.
2.
3.
4.
5.
6.
Class webClient.tns.Row2 Extends (%Persistent, %XML.Adaptor) [ ClassType = persistent, CompileAfter = , Inheritance = right, ProcedureBlock ]
{
...
Property EndDateContract As %TimeStamp(XMLNAME = "EndDateContract") [ Required ];
...
}

Проблема:
Cache 2010:
При получении ответа от веб-сервиса и попытке вывода дампа полученных объектов (в мини-страничке csp) возникает ошибка:
ERROR #6232: Datatype validation failed for tag, EndDateContract (ending at line 535 character 24), with value: 0001-01-01T00:00:00
сразу после получения ответа от веб-сервиса, даже не успевает дампнуть хоть один объект.

Cache 5.1:
Объекты приходят и выводятся, ошибки не возникает, но видно, что дата приходит в таком же виде.

Что делалось:
Включен лог получаемых xml-сообщений с помощью:
Код: plaintext
s ^ISCSOAP("Log")="i" s ^ISCSOAP("LogFile")="C:\logSOAP.xml"
(см. %SOAP.WebBase.cls)
И там видно, что дата в таком виде приходит уже непосредственно из 1С (в 1С нулевая или пустая дата имеет вот такой вот формат, как сказали специалисты 1С)

Вопросы:
1) Допускает ли "как бы стандарт" общения систем через SOAP передачу пустой даты в таком виде, или же это свойство должно быть пустым? Должен отлавливать клиент или надо править веб-сервис?
2) Какой системный метод обработки SOAP-сообщений нужно переопределить, чтобы объекты с такой датой все-таки не вызывали ошибки? Пусть дата будет пустой у таких объектов при обработке ответа веб-сервиса.
3) Есть ли справочник недокументированных возможностей как ClassMethod LogInput в %SOAP.WebBase.cls
...
Рейтинг: 0 / 0
16.04.2015, 10:58
    #38938045
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
drakutДопускает ли "как бы стандарт" общения систем через SOAP передачу пустой даты в таком виде, или же это свойство должно быть пустым? Должен отлавливать клиент или надо править веб-сервис? Совет по Web-сервисам: Представление пустых значений в схеме XML
drakutКакой системный метод обработки SOAP-сообщений нужно переопределить, чтобы объекты с такой датой все-таки не вызывали ошибки? Пусть дата будет пустой у таких объектов при обработке ответа веб-сервиса.Дайте код простого веб-сервиса на COS для тестов.
drakutЕсть ли справочник недокументированных возможностей как ClassMethod LogInput в %SOAP.WebBase.clsЭлементы с http://docs.intersystems.com/cache20151/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_classes#GOBJ_C543][Internal] прекрасно документированы в Caché Documatic, но не для всех: 4138481 .
...
Рейтинг: 0 / 0
16.04.2015, 11:18
    #38938061
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
На всякий случай уточню: веб-сервис - на 1С, клиент - на Cache.

Вывод полученного ответа в клиенте осуществляю следующим образом:<HTML>
...
<BODY>
  <script language=cache runat=server>
  d ##class(sync.1C).getContr()
  </script>
</BODY>
</HTML>
Код этого метода:ClassMethod getContr()
{
  s $ZT     = "err"
  
  S client  = 0
  S client  = ##class(webClient.LabCenterSoap).%New()
  I 'client w "Error creating client",!
  S client.HttpPassword = ..#password
  S client.HttpUsername = ..#login
  S client.Timeout = 300
  S client.Location = ..#location
  S flDebug  = 1
  S flSave  = 0

  s parameters      = ##class(webClient.tns.GetContractsInputParameters).%New()
  s parameters.OnlyChanged= 0
  s parameters.MaximumObjectsInResult=100
  s parametersXML      = """"
  s actionID        = """"
  
  while $ISOBJECT(parameters)  {
    w "Start printing contracts:"_$ZDT($H,5),!
    w "Save mode : "_flSave,!
    
    s answer = client.GetContracts(.parameters,.parametersXML,.actionID)
    s contracts=answer.Contracts
    w "Contracts count = "_contracts.Count(),!
    for i=1:1:contracts.Count() {
      s contract    = contracts.GetAt(i)
      w "Contract "_i_":",!
      ;w $SYSTEM.OBJ.Dump(contract),!!!
      
      W "+----------------- general information ---------------",!
      w "      oref value:"_contract.%Id(),!
      w "      class name:"_contract.%ClassName(1),!
      w "             OID:"_contract.%Oid(),!
      w "+----------------- attribute values ------------------",!
      w " ContractorName = "_contract.ContractorName,!
      w "   DateContract = "_contract.DateContract,!
      w "EndDateContract = "_contract.EndDateContract,!
      w "            ID1 = "_contract.ID1,!
      w "     IDContract = "_contract.IDContract,!
      w "           Name = "_contract.Name,!
      w " NumberContract = "_contract.NumberContract,!
      w "       ParentID = "_contract.ParentID,!
      w "      PartnerID = "_contract.PartnerID,!
      w "         UUID1c = "_contract.UUID1c,!
      w "         isNULL = "_contract.isNULL,!
      W "+-----------------------------------------------------",!!
    }
    s:flDebug=0 parameters=answer.InputParametersForNextPortion
    s:flDebug=1 parameters=""
  }
  Q 1
err
  s $ZT  = ""
  s errList=""
  If $ZERROR["<ZSOAP>" {
    Set ans=%objlasterror
    w "SOAP ERROR:"
  }Else{
    w "ERROR:"
    Set ans=$$$ERROR($$$CacheError,$ZERROR)
  }
  d $SYSTEM.Status.DecomposeStatus(ans,.errList)
  s errMsg=$G(errList(1))
  w errMsg,!
  d BACK^%ETN
  s $EC=""
  q 0
}Кстати, ошибка в системном методе $SYSTEM.OBJ.Dump(contract), который выдает ошибку при печати свойства
UUID1c равным, например "7799e729-3af8-11e3-8a33-4c72b94fa00d", поэтому пришлось каждое св-во выводить отдельно - писать в WRC ?
...
Рейтинг: 0 / 0
16.04.2015, 11:55
    #38938118
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
drakutКакой системный метод обработки SOAP-сообщений нужно переопределить, чтобы объекты с такой датой все-таки не вызывали ошибки? Пусть дата будет пустой у таких объектов при обработке ответа веб-сервиса.servitДайте код простого веб-сервиса на COS для тестов.На всякий случай уточню: веб-сервис - на 1С, клиент - на Cache.Тогда помочь смогут те, кто работал с 1С и могут потестить. Ждите.drakutКстати, ошибка в системном методе $SYSTEM.OBJ.Dump(contract), который выдает ошибку при печати свойства
UUID1c равным, например "7799e729-3af8-11e3-8a33-4c72b94fa00d"Какую ошибку? Какой тип у поля UUID1c?drakutпоэтому пришлось каждое св-во выводить отдельно - писать в WRC ?Вам решать.
...
Рейтинг: 0 / 0
16.04.2015, 12:15
    #38938157
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
drakutsync. 1C Как Вам удалось создать класс с таким интересным именем, когда студия (во всяком случае 2015.1) и документация это запрещают?
Документация 2010.1Identifiers must start with an alphabetic character, though they may contain numeric characters after the first position.

источник
...
Рейтинг: 0 / 0
16.04.2015, 12:17
    #38938159
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
Servit,
авторКакую ошибку? Какой тип у поля UUID1c?Тип поля UUID1с в сгенерированном классе:
Property UUID1c As %String(MAXLEN = "", XMLNAME = "UUID1c");
авторТогда помочь смогут те, кто работал с 1С и могут потестить. Ждите.Наверняка же можно обработать эту некорректную дату еще на этапе парсинга ответа от веб-сервиса )
Допустим, контакта с разработчиками веб-сервиса нет или воздействие на них невозможно. То проблема уже клиента ) А мне нужно получить эти объекты и обработать, а в случае ошибочных данных - сообщить уже пользователям 1С, а не разработчикам.

Большое спасибо за ссылку на советы по веб-сервисам. Но про [Internal] не совсем понял.
...
Рейтинг: 0 / 0
16.04.2015, 12:19
    #38938163
drakut
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
servitdrakutпропущено...
Как Вам удалось создать класс с таким интересным именем, когда студия (во всяком случае 2015.1) и документация это запрещают?
Документация 2010.1Identifiers must start with an alphabetic character, though they may contain numeric characters after the first position.

источник Я немного слукавил, на самом деле класс называется sync.contracts1C )
...
Рейтинг: 0 / 0
16.04.2015, 13:53
    #38938272
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
drakutCache 2010:
При получении ответа от веб-сервиса и попытке вывода дампа полученных объектов (в мини-страничке csp) возникает ошибка:
ERROR #6232: Datatype validation failed for tag, EndDateContract (ending at line 535 character 24), with value: 0001-01-01T00:00:00
сразу после получения ответа от веб-сервиса, даже не успевает дампнуть хоть один объект.

Cache 5.1:
Объекты приходят и выводятся, ошибки не возникает, но видно, что дата приходит в таком же виде.Помню, были проблемы с датами в одной из старых версий, потом исправили.

Дело в том, что по умолчанию в локали выставлена минимальная дата 0, она же 31.12.1840.
Поэтому дата 01.01.0001 выходит за пределы допустимых значений.

Код: plaintext
1.
2.
3.
4.
5.
6.
USER> w $zdth("2001-01-01T00:00:00",3,7)
58440,7200
USER> w $zdth("0001-01-01T00:00:00",3,7)
 
W $ZDTH("0001-01-01T00:00:00",3,7)
^
<VALUE OUT OF RANGE>

Попробуйте в текущей локали выставить минимальную дату в -672045, она же "01.01.0001" и свойству укажите MINVAL=-672045: Dates Prior to December 31, 1840

Код: plaintext
1.
2.
3.
USER> w $zd(-672045)
01.01.0001
USER> w $zdth("0001-01-01T00:00:00",3,7,,,,,-672045)
-672045,7200

Если не поможет, то попробуйте сделать поле строковым или указать XMLDEFAULTVALUE .
drakutТип поля UUID1с в сгенерированном классе:
Property UUID1c As %String(MAXLEN = "", XMLNAME = "UUID1c");Ничего криминального:Class demo.test Extends %RegisteredObject
{

Property UUID1c As %String(MAXLEN = "", XMLNAME = "UUID1c");

ClassMethod test()
{
  s t=..%New()
  s t.UUID1c="7799e729-3af8-11e3-8a33-4c72b94fa00d"
  d $system.OBJ.Dump(t)
}

}
Код: plaintext
1.
2.
3.
4.
5.
6.
USER>d ##class(demo.test).test()
+----------------- general information ---------------
|      oref value: 1
|      class name: demo.test
| reference count: 1
+----------------- attribute values ------------------
|             UUID1c = "7799e729-3af8-11e3-8a33-4c72b94fa00d"
drakutНо про [Internal] не совсем понял.Нужно больше конкретики.
...
Рейтинг: 0 / 0
17.04.2015, 09:25
    #38938822
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
servitНичего криминального:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
>w $ZV
Cache for Windows NT (Intel) 5.0.21 (Build 6408U) Tue Jan 3 2006 13:30:53 EST
>d ##class(demo.test).test()
+----------------- general information ---------------
|      oref value: 1
|      class name: demo.test
|             OID: ""
| reference count: 2 (system), 1 (user)
+----------------- attribute values ------------------
|         UUID1c =
<MAXNUMBER>quote+1^%occRun
8e1>


а вот на более новых версиях, ошибки нет
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
>w $ZV
Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.2.8 (Build 1104U) Sat Feb 11 2012 13:08:18 EST
>d ##class(demo.test).test()
+----------------- general information ---------------
|      oref value: 1
|      class name: demo.test
| reference count: 1
+----------------- attribute values ------------------
|             UUID1c = "7799e729-3af8-11e3-8a33-4c72b94fa00d"
 


Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
w $ZV
Cache for Windows (x86-64) 2014.1.1 (Build 702) Wed May 14 2014 10:17:40 EDT
>d ##class(demo.test).test()
+----------------- general information ---------------
|      oref value: 1
|      class name: demo.test
| reference count: 1
+----------------- attribute values ------------------
|             UUID1c = "7799e729-3af8-11e3-8a33-4c72b94fa00d"
 
...
Рейтинг: 0 / 0
17.04.2015, 11:26
    #38938962
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
П.С.М.а вот на более новых версиях, ошибки нетТС разве где-то упомянул версию 5.0.21 или Вы таким образом лишний раз предостерегаете сообщество от использования древних версий Caché?
...
Рейтинг: 0 / 0
17.04.2015, 16:33
    #38939484
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
servit,

Просто я знаю какую он ошибку получил и где :)
...
Рейтинг: 0 / 0
19.04.2015, 12:59
    #38940041
imdb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Некорректный %TimeStamp через SOAP из 1С
drakut Исходные данные:
Веб-клиент Cache (сгенерирован из WSDL) соединяется с веб-сервисом 1С 8 и тянет некоторые объекты, у которых есть свойство EndDateContract, тип которого определен в WSDL как dateTime:
Код: xml
1.
<xs:element name="EndDateContract" type="xs:dateTime"/>



Генератор определил это свойство как (в Cache 2010 и в Cache 5.1 одинаково):
Код: plaintext
1.
2.
3.
4.
5.
6.
Class webClient.tns.Row2 Extends (%Persistent, %XML.Adaptor) [ ClassType = persistent, CompileAfter = , Inheritance = right, ProcedureBlock ]
{
...
Property EndDateContract As %TimeStamp(XMLNAME = "EndDateContract") [ Required ];
...
}

Странно, что в wsdl элемент EndDateContract не является обязательным, а в классе - является.
Данные на стороне сервиса и клиента должны быть корректные. Если сервис отправляет некорректные данные, то клиент не сможет их нормально обработать - поэтому необходимо править сервис. Другой вопрос, если данные корректны, но Cache не может их обработать - тогда это уже проблема клиента.
Может быть и так, что на сервис повлиять никак нельзя (недоступны разработчики или отказываются вносить изменения по каким-то причинам) - приходится решать проблему на стороне клиента.

В Вашем случае можно попробовать заключить обработку данных от сервиса в try-catch. Тогда можно видеть, есть ли ошибки и какие именно. Но в этом случае (возможно) не будет обработан целый блок данных (а не только один этот тег) и Вы не сможете обработать корректные теги.
Можно сделать по другому. Изменить тип данного поля на %String:
Код: plaintext
1.
2.
Property EndDateContract As %String(XMLNAME = "EndDateContract") [ Required ];
}
И самостоятельно обрабатывать те значения, которые передаются в это поле.
Способ не самый корректный, но как вариант выкрутится из данной ситуации.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Некорректный %TimeStamp через SOAP из 1С / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]