|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
Исходные данные: Веб-клиент Cache (сгенерирован из WSDL) соединяется с веб-сервисом 1С 8 и тянет некоторые объекты, у которых есть свойство EndDateContract, тип которого определен в WSDL как dateTime: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Генератор определил это свойство как (в Cache 2010 и в Cache 5.1 одинаково): Код: plaintext 1. 2. 3. 4. 5. 6.
Проблема: 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
И там видно, что дата в таком виде приходит уже непосредственно из 1С (в 1С нулевая или пустая дата имеет вот такой вот формат, как сказали специалисты 1С) Вопросы: 1) Допускает ли "как бы стандарт" общения систем через SOAP передачу пустой даты в таком виде, или же это свойство должно быть пустым? Должен отлавливать клиент или надо править веб-сервис? 2) Какой системный метод обработки SOAP-сообщений нужно переопределить, чтобы объекты с такой датой все-таки не вызывали ошибки? Пусть дата будет пустой у таких объектов при обработке ответа веб-сервиса. 3) Есть ли справочник недокументированных возможностей как ClassMethod LogInput в %SOAP.WebBase.cls ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 10:00 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
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 . ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 10:58 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
На всякий случай уточню: веб-сервис - на 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 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 11:18 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
drakutКакой системный метод обработки SOAP-сообщений нужно переопределить, чтобы объекты с такой датой все-таки не вызывали ошибки? Пусть дата будет пустой у таких объектов при обработке ответа веб-сервиса.servitДайте код простого веб-сервиса на COS для тестов.На всякий случай уточню: веб-сервис - на 1С, клиент - на Cache.Тогда помочь смогут те, кто работал с 1С и могут потестить. Ждите.drakutКстати, ошибка в системном методе $SYSTEM.OBJ.Dump(contract), который выдает ошибку при печати свойства UUID1c равным, например "7799e729-3af8-11e3-8a33-4c72b94fa00d"Какую ошибку? Какой тип у поля UUID1c?drakutпоэтому пришлось каждое св-во выводить отдельно - писать в WRC ?Вам решать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 11:55 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
drakutsync. 1C Как Вам удалось создать класс с таким интересным именем, когда студия (во всяком случае 2015.1) и документация это запрещают? Документация 2010.1Identifiers must start with an alphabetic character, though they may contain numeric characters after the first position. источник ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 12:15 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
Servit, авторКакую ошибку? Какой тип у поля UUID1c?Тип поля UUID1с в сгенерированном классе: Property UUID1c As %String(MAXLEN = "", XMLNAME = "UUID1c"); авторТогда помочь смогут те, кто работал с 1С и могут потестить. Ждите.Наверняка же можно обработать эту некорректную дату еще на этапе парсинга ответа от веб-сервиса ) Допустим, контакта с разработчиками веб-сервиса нет или воздействие на них невозможно. То проблема уже клиента ) А мне нужно получить эти объекты и обработать, а в случае ошибочных данных - сообщить уже пользователям 1С, а не разработчикам. Большое спасибо за ссылку на советы по веб-сервисам. Но про [Internal] не совсем понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 12:17 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
servitdrakutпропущено... Как Вам удалось создать класс с таким интересным именем, когда студия (во всяком случае 2015.1) и документация это запрещают? Документация 2010.1Identifiers must start with an alphabetic character, though they may contain numeric characters after the first position. источник Я немного слукавил, на самом деле класс называется sync.contracts1C ) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 12:19 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
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.
Попробуйте в текущей локали выставить минимальную дату в -672045, она же "01.01.0001" и свойству укажите MINVAL=-672045: Dates Prior to December 31, 1840 Код: plaintext 1. 2. 3.
Если не поможет, то попробуйте сделать поле строковым или указать 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2015, 13:53 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
servitНичего криминального: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
а вот на более новых версиях, ошибки нет Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 09:25 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
П.С.М.а вот на более новых версиях, ошибки нетТС разве где-то упомянул версию 5.0.21 или Вы таким образом лишний раз предостерегаете сообщество от использования древних версий Caché? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 11:26 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
servit, Просто я знаю какую он ошибку получил и где :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2015, 16:33 |
|
Некорректный %TimeStamp через SOAP из 1С
|
|||
---|---|---|---|
#18+
drakut Исходные данные: Веб-клиент Cache (сгенерирован из WSDL) соединяется с веб-сервисом 1С 8 и тянет некоторые объекты, у которых есть свойство EndDateContract, тип которого определен в WSDL как dateTime: Код: xml 1.
Генератор определил это свойство как (в Cache 2010 и в Cache 5.1 одинаково): Код: plaintext 1. 2. 3. 4. 5. 6.
Странно, что в wsdl элемент EndDateContract не является обязательным, а в классе - является. Данные на стороне сервиса и клиента должны быть корректные. Если сервис отправляет некорректные данные, то клиент не сможет их нормально обработать - поэтому необходимо править сервис. Другой вопрос, если данные корректны, но Cache не может их обработать - тогда это уже проблема клиента. Может быть и так, что на сервис повлиять никак нельзя (недоступны разработчики или отказываются вносить изменения по каким-то причинам) - приходится решать проблему на стороне клиента. В Вашем случае можно попробовать заключить обработку данных от сервиса в try-catch. Тогда можно видеть, есть ли ошибки и какие именно. Но в этом случае (возможно) не будет обработан целый блок данных (а не только один этот тег) и Вы не сможете обработать корректные теги. Можно сделать по другому. Изменить тип данного поля на %String: Код: plaintext 1. 2.
Способ не самый корректный, но как вариант выкрутится из данной ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2015, 12:59 |
|
|
start [/forum/topic.php?fid=39&msg=38938822&tid=1556682]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 401ms |
0 / 0 |