01.08.2018, 17:19 | #1 |
Участник
|
Электронные больничные
Никто еще не скрещивал Nav и электронные больничные ? Хоть что-то автоматизации поддается ?
|
|
27.08.2018, 17:59 | #2 |
Участник
|
Итак, вожусь с веб-сервисом славного ФСС. Из документации только вот это:
http://fz122.fss.ru/doc/API%20%D1%88...%82%D0%B0).pdf Начал писать функцию с целью получить хоть что-нибудь от их сервиса: X++: txtSoapAction := '"http://asystems.fss/IGatewayService/UploadsGet"'; txtMethod := 'POST'; txtContentType := 'application/soap+xml; charset=utf-8'; FullXMLText1 := '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">' + '<s:Header>' + '<a:To>http://docs.fss.ru/ExtService/GatewayService.svc</a:To>' + '</s:Header>'; FullXMLText2 := '<s:Body>' + '<UploadsGet xnlns="http://asystems.fss">' + '<regNum>000000003</regNum>' + '<filter>Year</filter>' + '</UploadsGet>' + '</s:Body>' + '</s:Envelope>'; CLEAR(vBigText); vBigText.ADDTEXT(FullXMLText1); vBigText.ADDTEXT(FullXMLText2); vBigText.GETSUBTEXT(TempString,1); oXMLDom := oXMLDom.XmlDocument(); oXMLDom.LoadXml(TempString); SendHttpRequest(oXMLDom,oXMLDom); FullXMLText2@1000000008 : Text[1024]; FullXMLText3@1000000007 : Text[1024]; FullXMLText4@1000000006 : Text[1024]; vBigText@1000000010 : BigText; oXMLDom@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument"; Дальше функция SendHttpRequest: X++: LOCAL SendHttpRequest(VAR InXMLDom : DotNet "System.Xml.XmlDocument";VAR OutXMLDom : DotNet "System.Xml.XmlDocument") oXMLHttp := oXMLHttp.Create(TextURI); oXMLHttp.Method(txtMethod); oXMLHttp.ContentType(txtContentType); streamWritter := streamWritter.StreamWriter(oXMLHttp.GetRequestStream); streamWritter.Write(TempString); streamWritter.Close(); XMLHttpResponse := oXMLHttp.GetResponse(); OutXMLDom.Load(XMLHttpResponse.GetResponseStream); XMLHttpResponse.Close(); streamWritter@1000000004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.StreamWriter"; XMLHttpResponse@1000000008 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpWebResponse"; TextURI@1000000009 : TextConst 'RUS=http://docs.fss.ru/ExtService/GatewayService.svc'; На методе GetResponse получаю ответ 500 Internal Server Error. И на их тестовом сервере, и на боевом. Тестовый у них еще и лежит периодически. Что я делаю не так ? С SOAP знаком только по картинке, не могу понять, где ошибка. |
|
28.08.2018, 12:40 | #3 |
Участник
|
Добрый день.
1.Для начала, ставим расширение Chrome Wizdler Parses the WSDL files and generates SOAP messages for you. 2.В строку браузера вводим http://docs.fss.ru/ExtService/GatewayService.svc?wsdl 3.Получаем WSDL и нажимаем Brouse WSDL справа от строки в браузере. 4.Выбираем нужный метод и на новой вкладке и получаем строку запроса. <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <UploadsGet xmlns="http://asystems.fss"> <regNum>[string?]</regNum> <filter>[string?]</filter> </UploadsGet> </Body> </Envelope> 5. Тестируем для получения ответа по контрольным данным 6. Сохраняем ответ как xml файл 7. В VStudio генерируем xsd схему 8. С mibuso.com качаем xmlport генератор и с помощью его создаем xml порт, с помощью которого будем "толкать данные" в Нав. Остальное, после п.8))
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
|
За это сообщение автора поблагодарили: apanko (4), Ivanhoe (10), mira (1), BuzCom (1). |
30.08.2018, 16:30 | #4 |
Участник
|
Цитата:
Сообщение от Captain
Добрый день.
1.Для начала, ставим расширение Chrome Wizdler Parses the WSDL files and generates SOAP messages for you. 2.В строку браузера вводим http://docs.fss.ru/ExtService/GatewayService.svc?wsdl 3.Получаем WSDL и нажимаем Brouse WSDL справа от строки в браузере. 4.Выбираем нужный метод и на новой вкладке и получаем строку запроса. <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <UploadsGet xmlns="http://asystems.fss"> <regNum>[string?]</regNum> <filter>[string?]</filter> </UploadsGet> </Body> </Envelope> 5. Тестируем для получения ответа по контрольным данным 6. Сохраняем ответ как xml файл 7. В VStudio генерируем xsd схему 8. С mibuso.com качаем xmlport генератор и с помощью его создаем xml порт, с помощью которого будем "толкать данные" в Нав. Остальное, после п.8)) Приведенный код и примеры являются компиляцией из открытых источников и свободны для повторения. Все, что связано с версиями 2013 и выше - пишите. Есть много особенностей под дот нет)) 9. Создаем 2 XML port для запроса и ответа. OBJECT XMLport 50090 FNS_IN { OBJECT-PROPERTIES { Date=02.03.15; Time=17:06:18; Modified=Yes; Version List=FNS; } PROPERTIES { Format/Evaluate=C/SIDE Format/Evaluate; OnPreXMLport=BEGIN NS1:=NSpace1; NS2:=NSpace2; GINN:=FORMAT(INN_Data); GKPP:=FORMAT(KKP_Data); END; } ELEMENTS { { [{4E5AED0B-AAC1-42D7-B8E4-DE6D629CE557}]; ;SOAP-ENV:Envelope ;Element ;Text } { [{41F0E8B4-BE37-42BF-BB1A-E80C953C63C0}];1 ;xmlns:SOAP-ENV ;Attribute;Text ; VariableName=NS1 } { [{272C626D-C440-4D50-BE0E-746331EB2F6C}];1 ;xmlns:ns1 ;Attribute;Text ; VariableName=NS2 } { [{A29C2347-2ABB-414D-A77B-DE2ECFFF2D47}];2 ;SOAP-ENV:Body ;Element ;Text } { [{E2F37891-73FF-47DE-97E5-E2E16F64C66E}];3 ;ns1:NdsRequest2 ;Element ;Text } { [{3E16A058-DD58-4CA9-9A99-D935003B84C6}];4 ;ns1:NP ;Element ;Text } { [{8AF4C84C-49A1-46F3-B0F0-938A73AD46EA}];5 ;INN ;Attribute;Text ; VariableName=GINN; Occurrence=Required } { [{84F74032-6134-4F6F-B948-3990EC1C8769}];5 ;KPP ;Attribute;Text ; VariableName=GKPP; Occurrence=Optional } { [{CCAEA469-7C24-4808-81CE-7B9B7F6A9D0F}];5 ;DT ;Attribute;Text ; VariableName=DT; Occurrence=Optional } } EVENTS { } REQUESTPAGE { PROPERTIES { } CONTROLS { } } CODE { VAR NSpace1@1000000000 : TextConst 'RUS=http://schemas.xmlsoap.org/soap/envelope/'; NSpace2@1000000001 : TextConst 'RUS=http://ws.unisoft/FNSNDSCAWS2/Request'; INN_Data@1000000002 : Text[30]; KKP_Data@1000000003 : Text[30]; PROCEDURE SetData@1000000000(iNN@1000000000 : Text[30];kPP@1000000001 : Text[30];Code@1000000002 : Code[20];Type@1000000003 : 'Customer,Vendor'); BEGIN INN_Data:=iNN; IF kPP='0' THEN KKP_Data:='' ELSE KKP_Data:=kPP; END; BEGIN END. } } OBJECT XMLport 50091 FNS_OUT { OBJECT-PROPERTIES { Date=12.03.15; Time=11:13:56; Modified=Yes; Version List=FNS; } PROPERTIES { } ELEMENTS { { [{FF0A767F-7900-4629-B884-9BAC08CAB6B6}];0 ;Envelope ;Element ;Text ; VariableName=Envelope; MinOccurs=Once; MaxOccurs=Once } { [{5954D8C6-02C6-4443-946B-CECD2D615BC8}];1 ;Body ;Element ;Text ; VariableName=Body; MinOccurs=Once; MaxOccurs=Once } { [{464364A2-28F2-4823-AB11-CCA1EB732751}];2 ;NdsResponse2 ;Element ;Text ; VariableName=NdsResponse2; MinOccurs=Once; MaxOccurs=Once } { [{7D49C9D3-0B83-4614-A258-1032BFB8C85A}];3 ;DTActFL ;Attribute;Text ; VariableName=NdsResponse2_DTActFL; TextType=Text; Occurrence=Required } { [{439B59AC-86EC-4189-8B81-B4559EE87460}];3 ;DTActUL ;Attribute;Text ; VariableName=NdsResponse2_DTActUL; TextType=Text; Occurrence=Required } { [{6460C37B-8D02-43A2-9C0E-FEC47B2A05E5}];3 ;NP ;Element ;Text ; VariableName=NP; MinOccurs=Once; MaxOccurs=Once } { [{75990FFE-FD72-406F-B9B8-61E478F60104}];4 ;INN ;Attribute;Text ; VariableName=NP_INN; TextType=Text; Occurrence=Required } { [{52A39C1E-ACF2-4081-A977-00600A1B4B14}];4 ;KPP ;Attribute;Text ; VariableName=NP_KPP; TextType=Text; Occurrence=Optional } { [{7825E896-2A49-4E55-A0CC-64A2830B1633}];4 ;State ;Attribute;Text ; VariableName=NP_State; TextType=Text; Occurrence=Optional; Import::OnAfterAssignVariable=BEGIN IF GType=GType::Customer THEN BEGIN Cust.GET(GCode); Cust."FNS Status":=NP_State; Cust."FNS Status Date":=FORMAT(WORKDATE); Cust.MODIFY(FALSE); END ELSE BEGIN Vend.GET(GCode); Vend."FNS Status":=NP_State; Vend."FNS Status Date":=FORMAT(WORKDATE); Vend.MODIFY(FALSE); END; END; } } EVENTS { } REQUESTPAGE { PROPERTIES { } CONTROLS { } } CODE { VAR Cust@1000000000 : Record 18; Vend@1000000001 : Record 23; GType@1000000002 : 'Customer,Vendor'; GCode@1000000003 : Code[20]; PROCEDURE SetData@1000000000(code@1000000002 : Code[20];type@1000000003 : 'Customer,Vendor'); BEGIN GType:=type; GCode:=code; END; BEGIN { -------------------------------------------------------------------------------- -- XMLport automatically created with Dynamics NAV XMLport Generator 1.3.0.2 -- Copyright © 2007-2012 Carsten Scholling -------------------------------------------------------------------------------- } END. } } 10. Создаем CU or Report для реализации логики. Функция RemoveNameSpace - необходима для "очистки" входящего потока. OBJECT Report 50090 FNS { OBJECT-PROPERTIES { Date=12.03.15; Time=11:19:00; Modified=Yes; Version List=FNS; } PROPERTIES { } DATAITEMS { { PROPERTIES { DataItemTable=Table18; OnPreDataItem=BEGIN Windows.OPEN('#1######',"No."); END; OnAfterGetRecord=BEGIN IF "VAT Registration No."='' THEN CurrReport.SKIP; CLEAR(XP1); CLEAR(XP2); XP1.SetData("VAT Registration No.","KPP Code","No.",0); XP2.SetData("No.",0); SendMessage; Windows.UPDATE; END; OnPostDataItem=BEGIN Windows.CLOSE; END; ReqFilterFields=No.; } SECTIONS { } } { PROPERTIES { DataItemTable=Table23; OnPreDataItem=BEGIN Windows.OPEN('#1######',"No."); END; OnAfterGetRecord=BEGIN IF "VAT Registration No."='' THEN CurrReport.SKIP; CLEAR(XP1); CLEAR(XP2); XP1.SetData("VAT Registration No.","KPP Code","No.",1); XP2.SetData("No.",1); SendMessage; Windows.UPDATE; END; OnPostDataItem=BEGIN Windows.CLOSE; END; ReqFilterFields=No.; } SECTIONS { } } } REQUESTFORM { PROPERTIES { Width=9020; Height=3410; } CONTROLS { } } REQUESTPAGE { PROPERTIES { } CONTROLS { } } CODE { VAR DefType@1000000007 : TextConst 'RUS=„®Єг¬Ґвл XML (*.xml)|*.xml|‚ᥠ” ©«л (*.*)|*.*'; XP1@1000000005 : XMLport 50090; XP2@1000000004 : XMLport 50091; XMLDoc@1000000003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument"; XMLHttpConn@1000000002 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{AFBA6B42-5692-48EA-8141-DC517DCF0EF1}:'Microsoft XML, v6.0'.ServerXMLHTTP"; InStr@1000000001 : InStream; OutStr@1000000000 : OutStream; Windows@1000000006 : Dialog; PROCEDURE SendMessage@1000000002(); VAR TempTable@1000000000 : TEMPORARY Record 99008535; BEGIN //setup the temporary table so that we can handle the XML without saving it to disk first //create a couple of streams to transfer the data in and out of the BLOB field CLEAR(TempTable); TempTable.Blob.CREATEINSTREAM(InStr); TempTable.Blob.CREATEOUTSTREAM(OutStr); //the request XMLport fills the BLOB with the XML message //CLEAR(XP1); XP1.SETDESTINATION(OutStr); XP1.EXPORT; //load the message into the XML automation variable IF ISCLEAR(XMLDoc) THEN CREATE(XMLDoc); XMLDoc.load(InStr); //this is for diagnostics only, so you can see what the XMLport actually produced //XMLDoc.save('C:\Temp\XMLRequest.txt'); //create the HTTP connector IF ISCLEAR(XMLHttpConn) THEN CREATE(XMLHttpConn); //tell it where the web service is located //XMLHttpConn.open('POST','http://fat-aardvark.net/DataService.asmx',FALSE); XMLHttpConn.open('POST','http://npchk.nalog.ru/FNSNDSCAWS_2',FALSE); //set some values in the request header depending on what the service requires //XMLHttpConn.setRequestHeader('Host','fat-aardvark.net'); //XMLHttpConn.setRequestHeader('SOAPAction','http://ws.unisoft/NdsRequest2'); XMLHttpConn.setRequestHeader('Content-Type','text/xml'); //actually send the message XMLHttpConn.send(XMLDoc); //get the response XMLDoc.load(XMLHttpConn.responseXML); //tell us if we got an error (it is 200 because the response definition said "200 OK") IF XMLHttpConn.status <> 200 THEN BEGIN MESSAGE('Status %1 %2',XMLHttpConn.status,XMLHttpConn.statusText); EXIT; END; //this is for diagnostics only, so you can see what you got back //XMLDoc.save('C:\Temp\XMLResponse1.xml'); //take away the namespaces RemoveNamespace(XMLDoc,XMLDoc); //this is for diagnostics only, so you can see what it looks like after the namespaces have gone //XMLDoc.save('C:\Temp\XMLResponse2.xml'); //fill the BLOB with the response XML XMLDoc.save(OutStr); //the response XMLport reads the data from the BLOB and processes it //CLEAR(XP2); XP2.SETSOURCE(InStr); XP2.IMPORT; END; PROCEDURE RemoveNamespace@1000000004(VAR Source@1000000000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";Destination@1000000001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument"); VAR TempTable@1000000002 : TEMPORARY Record 99008535; XMLStyleSheet@1000000003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument"; StyleOutStr@1000000004 : OutStream; StyleInStr@1000000005 : InStream; BEGIN //this has been taken from a Microsoft knowledgebase aricle and strips out the //namespaces from an XML message using a style sheet TempTable.Blob.CREATEOUTSTREAM(StyleOutStr); TempTable.Blob.CREATEINSTREAM(StyleInStr); StyleOutStr.WRITETEXT('<?xml version="1.0" encoding="UTF-8"?>'); StyleOutStr.WRITETEXT('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'); StyleOutStr.WRITETEXT('<xslutput method="xml" encoding="UTF-8" />'); StyleOutStr.WRITETEXT('<xsl:template match="/">'); StyleOutStr.WRITETEXT('<xsl:copy>'); StyleOutStr.WRITETEXT('<xsl:apply-templates />'); StyleOutStr.WRITETEXT('</xsl:copy>'); StyleOutStr.WRITETEXT('</xsl:template>'); StyleOutStr.WRITETEXT('<xsl:template match="*">'); StyleOutStr.WRITETEXT('<xsl:element name="{local-name()}">'); StyleOutStr.WRITETEXT('<xsl:apply-templates select="@* | node()" />'); StyleOutStr.WRITETEXT('</xsl:element>'); StyleOutStr.WRITETEXT('</xsl:template>'); StyleOutStr.WRITETEXT('<xsl:template match="@*">'); StyleOutStr.WRITETEXT('<xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>'); StyleOutStr.WRITETEXT('</xsl:template>'); StyleOutStr.WRITETEXT('<xsl:template match="text() | processing-instruction() | comment()">'); StyleOutStr.WRITETEXT('<xsl:copy />'); StyleOutStr.WRITETEXT('</xsl:template>'); StyleOutStr.WRITETEXT('</xsl:stylesheet>'); IF ISCLEAR(XMLStyleSheet) THEN CREATE(XMLStyleSheet); XMLStyleSheet.load(StyleInStr); IF ISCLEAR(Destination) THEN CREATE(Destination); Source.transformNodeToObject(XMLStyleSheet,Destination); END; EVENT XMLDoc@1000000003:ndataavailable@198(); BEGIN END; EVENT XMLDoc@1000000003:nreadystatechange@-609(); BEGIN END; BEGIN END. } RDLDATA { } }
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
30.08.2018, 16:32 | #5 |
Участник
|
Правда многое из знаний пришлось собирать вручную. Я про компиляцию.))Всем удачи и хорошей Пятницы!
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
|
За это сообщение автора поблагодарили: mira (1). |
30.08.2018, 16:39 | #6 |
Участник
|
У вас уже пятница?
__________________
Ivanhoe as is.. |
|
30.08.2018, 16:56 | #7 |
Участник
|
Ага, а точнее ... отпуск))
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
31.08.2018, 12:31 | #8 |
Участник
|
Ох. С отправкой и приемом еще кое-как понятно, а вот с шифрованием и подписанием у ФСС это какой-то ад....
|
|
24.10.2018, 08:15 | #9 |
Участник
|
Как успехи? ничего путного не вышло?
|
|
24.10.2018, 11:21 | #10 |
Участник
|
Пока остановились на том, что принимается больничный в АРМ, выгружается в XML, его импортирую в BLOB в больничный в Нав. Как расчитают ставку, выгружаю опять в XML с цифрами уже и через АРМ его отсылаю.
Правда, пока еще ни одного не делали так. А всякую автоматику и подписи в Наве делать не стал пока, времени потратится много, а выхлопа 0.001 процент. |
|
|
За это сообщение автора поблагодарили: mira (1). |
25.10.2018, 16:12 | #11 |
Участник
|
Моя очередь из путного наткнулся на это
http://www.cyberforum.ru/web-service...ad2078783.html если чего выйдет выложу здесь.. |
|