1s 8.3 post zahtevo za prejemanje naročil. Obravnava preusmeritve zahtev http

Pojavila se je naloga prenosa podatkov med 1C (razvoj in konfiguracija je bila oddana zunanjim izvajalcem), ki je predviden za uporabo kot glavni sistem za upravljanje elektronskih dokumentov (EDF) in sistemom B2B (interni razvoj), ki je napisan v PHP (Symfony) in opravlja funkcije primarnega vnosa informacij v podjetja.

Imel sem že izkušnje z integracijo B2B z drugim B2B. Ideja je bila prenesti JSON z uporabo cURL. Nato se je pojavila naloga integracije sistema Borlas, ki temelji na Oraclu, kjer je bil ta pristop tudi uporabljen. Na strani Oracle pa so uporabili svoj paket - analog cURL v PHP (če bo interes, ga lahko opišem v novem članku).

Kot sem ugotovil, lahko 1C 8.2 pošilja tudi zahteve GET in POST. Predvideval sem, da če je vse že konfigurirano in deluje z drugimi sistemi, potem bi moralo delovati tudi tukaj. JSON so razvijalci 1C zavrnili, češ da je oblika neprimerna in da prepoznajo samo XML. Pripombe, da bi tako dobili minimalno količino prenosa podatkov, dejansko pa smo prejeli veliko podatkov, so bile zavrnjene. Posledično smo začeli pripravljati 2 sistema, ki temeljita na XML.

Sam sem napisal sprejemnik zahtev iz 1C in vrnil rezultate. Funkcija za sprejem spremenljivke v POST, v kateri je moral 1Sniki nadomestiti XML.
Oblika je približno naslednja:

123ABC456// avtorizacijski ključ get_last_orders//operacija, ki jo želijo izvesti 4000//omejitev zapisov, ki jih želijo izbrati

Upravljalnik, ki vrne zapise, ki so že bili izbrani glede na pogoje, in ustvari XML, kot je:

1 O.P.S. 4853352 01.01.2013 1 Naloženo iz b2b SNILS 999999999 Polno ime stranke Mikhailov Mikhail Evgenievich Datum prijave 01.01.2013 ...

Podatki se lahko prenašajo le prek povezave HTTPS.

Na prvi pogled se vse zdi preprosto, vendar se je v procesu pojavilo več težav:
1) zunanji izvajalci so poročali, da niso seznanjeni s tovrstnimi zahtevami, in so poskušali ponuditi staro preizkušeno shemo:
1. uvoz datoteke iz B2B,
2. Nalaganje v 1C,
3. Izvozite datoteko, ki označuje, kaj je bilo mogoče obdelati, kaj ni bilo iz 1C,
4. Uvoz v B2B,
5. in že od samega začetka...
Shema je bila zavrnjena, ker jo je bilo treba narediti hitro, brez človeškega posredovanja in kakršnih koli "gumbov".

Nato so prosili za primer kode. Na internetu sem poguglal ​​naslednji primer:

Strežnik = "test.com"; Vrata = "443"; HTTPTry = New HTTPConnection(Server, Port, True); Drugače HTTP = Nova povezava HTTP (strežnik, vrata); endIf; ScriptAddress = "/gateway/GetData1C/"; Poskus HTTP.SendForProcessing(SendFileName, ScriptAddress, ResponseFileName, HTTPHeader); Poročilo o izjemah ("Poskus povezave ni uspel: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "Poskus povezave ni uspel: " + ErrorDescription()); EndIf Vrnitev; EndAttempt;

Podatki so začeli prihajati na strežnik, vendar je bil prazen, torej GET in POST sta bila prazna. Dodal sem vnos v dnevnike in ga uspešno pozabil. Po 4 mesecih sem dobil nujno nalogo - pripeljati integracijo do rezultata (ker je minilo veliko časa, razvijalci 1C delajo in delajo, vendar se nič ne odzove). Namestili so mi 1C in začel sem brskati.

Najprej sem se odločil namestiti Fiddler, da bi razumel, kaj se dogaja. Opazil sem, da je povezava prek HTTP, nato pa strežnik preusmeri na HTTPS. Predvideval sem, da so iz tega razloga podatki prazni. Poskušal sem ga reproducirati v Chromu in prejel potrditev, da so podatki v zahtevi POST izgubljeni med preusmeritvijo.

Ker je nemogoče dovoliti delo prek HTTP-ja, sem začel preučevati, zakaj, ker je navedeno, da:

HTTP = Nova povezava HTTP (strežnik, vrata, resnično); Parameter »True« pomeni uporabo HTTPS, nato pa se je izkazalo, da je HTTP = New HTTPConnection(Server, Port);

Posledično je bilo to "Drugače" vrženo in prejel sem napako, da potrdilo ni pravilno. Potrdilo je bilo samopodpisano. Razvoj integracije je potekal na internih strežnikih, kjer je bil uradno kupljen certifikat »Thawte SSL CA«, za razliko od PROD strežnika. Uvoz potrdila v vse možne trgovine ni dal rezultatov.

Iskanje po virih je pripeljalo do dejstva, da ima 1C lastna korenska potrdila in na podlagi njih že preverja druge. V testni obliki so v datoteki “cacert.pem”, ki se nahaja v mapi “bin”, kjer se nahaja 1C. Uvoz ni tako preprost, kot se je izkazalo.

Najprej moramo potrdilo, ki ga potrebujemo, izvoziti v datoteko (jaz sem ga že imel v osebni shrambi). Z zagonom “certmgr.msc”, potem ko najdemo certifikat, ga izvozimo v datoteko *.cer.

C:\OpenSSL-Win64\bin>openssl x509 -inform der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 OPOZORILO: ne morem odpreti konfiguracijske datoteke: /usr/local/ ssl/openssl.cnf MD5 prstni odtis=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
MD5 prihranimo, potrebovali ga bomo.
Nato odprite datoteko »cacert.pem«.
Spustimo se čisto na dno in dodamo najprej MD5, nato pa vso vsebino, ki je prišla v datoteko "fiddler.pem".
Shranite datoteko.
Znova zaženemo 1C (morda ni potrebno, vendar zame ni delovalo, zato sem znova zagnal vse.

Izvorna datoteka v 1C je dobila to obliko:

Postopek SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefined Then Report("Ni bilo mogoče vzpostaviti povezave s strežnikom, določenim v nastavitvah izmenjave! Obdelava je bila prekinjena!"); V nasprotnem primeru je Vir = FileAddress; endIf; FileName = FileResult; PostFileName = PostFile; PostFile = Nova datoteka (PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); Glave = Novo ujemanje(); Headers.Insert("Content-Type", "application/x-www-form-urlencoded"); Headers.Insert("Content-Lenght", SubmissionFileSize); Poskus povezave.SendForProcessing(PostFileName, Source, FileName, Headers); Poročilo o izjemi (Opis napake ()); EndAttempts EndProcedures Function GetHTTPConnection() Export AttemptConnection = New HTTPConnection(HTTPServer,"443",True); Poročilo o izjemi (Opis napake ()); Povezava = Nedefinirano; EndAttempt; Povratna povezava; Postopek EndFunctions OnOpen() HTTPServer = "test.com"; FileAddress = "/gateway/GetData1C"; PostFile = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; Konec postopka

Po kliku na gumb je bila zahteva poslana prek HTTPS in pravilen XML je bil prejet kot izhod.

Iskal sem, kako 1C deluje prek HTTPS, veliko gradiva, vendar nisem našel, kako delati s samopodpisnim potrdilom.

Pri razvoju postopka za pošiljanje informacij iz 1C na spletno mesto z različico platforme 8.3.9.2170 sem naletel na težavo: razvijalec spletnega mesta mi je omogočil zapisovanje potrebnih informacij samo z uporabo zahteve HTTP z metodo PUT.

Brez dvakratnega razmišljanja sem skiciral preprosto kodo:

Povezava = New HTTPConnection("www.mysite.ru"); Glave = novo ujemanje; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Zahteva = New HTTPRequest("/api/order_items/93076?order_item=30", Headers); Connection.Write(Request);

Na podlagi rezultatov izvedbe bi morala biti količina blaga, prejetega v skladišče, vnesena v ustrezno vrstico naročila kupca na spletni strani.

Vendar, kot ste verjetno že razumeli, se ni zgodilo nič. Ko sem se prepričal, da na spletnem mestu ni napak (s pošiljanjem podobne zahteve prek vtičnika za Chrome), sem ga zagnal na svojem lokalni računalnik spletni strežnik in začel eksperimentirati.

Takoj je postalo jasno nekaj čudnega: Zgornja koda ne ustvari zahteve PUT, ampak zahtevo HEAD!

V dnevnikih Apache sem videl naslednje:

127.0.0.1 - - "GLAVA /api/order_items/93076?order_item=30 HTTP/1.1"

Bil sem nekoliko presenečen (navsezadnje je v priročniku črno na belem pisalo PUT), vendar me ni zmedlo - metodo lahko pokličete neposredno:

Connection.CallHTTPMethod("PUT",Request);

Dnevniki kažejo isto:

127.0.0.1 - - "GLAVA /api/order_items/93076?order_item=30 HTTP/1.1"

"Mogoče delam kaj narobe?" - Zastavil sem si vprašanje. Toda na internetu ali v priročnikih ni bilo namigov. No, nihče še ni preklical metode znanstvenega pikanja. Za začetek sem poskusil narediti tole:

Connection.CallHTTPMethod("fyvfyv",Request);

V dnevnikih, ki sem jih prejel:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Zanimivo je, da to pomeni, da 1C nadomešča metodo PUT posebej (zakaj 1C ni bila všeč?).

Po še nekaj poskusih sem prišel do tega:

Connection.CallHTTPMethod("PUT",Request);

V dnevnikih, ki sem jih prejel:

127.0.0.1 - - "PUST /api/order_items/93076?order_item=30 HTTP/1.1"

In ta možnost je že delovala na spletnem mestu in vsi so bili zadovoljni.

Predlagal je pravilnejšo rešitev problema: navesti morate telo zahteve, katero koli telo, tudi prazno. Na primer, ta možnost bo delovala:

Povezava = New HTTPConnection("www.mysite.ru"); Glave = novo ujemanje; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Zahteva = New HTTPRequest("/api/order_items/93076?order_item=30", Headers); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Request);

In verjetno je povsem pravilno posredovati same vrednosti parametrov v telesu zahteve.

Zaključek je naslednji: platforma 1C meni, da je zahteva PUT brez telesa napačna in metodo nadomesti z HEAD.

Zanimivo je, da 1C ne sledi zahtevi POST brez telesa in ga ne pretvori v GET, preveril sem za zabavo.

Kot bi rekel znani Vovočka iz znane šale: "Kje je logika?"

Upam, da bo moja objava komu prihranila nekaj ur življenja v iskanju odgovora. =)))

Natisni (Ctrl+P)

Drugi del si lahko ogledate

Splošne informacije

V različici platforme 8.3.5.1068 , objavljen septembra 2015, mehanizem za integracijo 1C z zunanji programi skozi tehnologijo REST vmesnik. Platforma uporablja protokol OData kot protokol za dostop. Je odprt spletni protokol za poizvedovanje in posodabljanje podatkov. Omogoča vam manipulacijo podatkov z uporabo ukazov HTTP kot zahtev. V različici 8.3.5.1068 je bilo možno prejemati odgovore le v formatu Atom/XML . Vendar pa se je od izdaje 8.3.8.1652 avgusta 2017 pojavila druga možnost za prejemanje podatkov v formatu JSON (JavaScript Object Notation). . V primerjavi z XML je preprost za branje in zavzame manj prostora. Poleg tega imajo vsi brskalniki vgrajena orodja za delo z JSON.

Delo s protokolom OData na platformi 1C: Enterprise lahko najdete v knjigi 1C: Vodnik za razvijalce v 17. poglavju Mehanizmi internetnih storitev, odstavek 17.2.1 Standardni vmesnik OData. Ogledate si lahko tudi primere razširitve podpore za protokol OData,

Prednost uporabe REST vmesnik. zaključuje, da za pridobitev dostopa do sistemskih podatkov iz zunanje aplikacije ni potrebna sprememba kode aplikacijske rešitve (na primer, če je aplikacijska rešitev podprta). Za pridobitev tega dostopa morate objaviti aplikacijo na spletnem strežniku na določen način in določiti, kateri konfiguracijski objekti bodo uporabljeni na ta način. Sistemi tretjih oseb lahko nato dostopajo do vaše aplikacije s pomočjo zahtev HTTP.

Objava standardnega vmesnika OData se izvede z uporabo pogovornega okna za objavo na spletnem strežniku (Administracija - Objava v spletni strežnik) in opisano v knjigi 1C:Enterprise 8.3. “Administratorski vodnik”.
Pomembno!Če želite, da so konfiguracijski objekti dostopni prek standardnega vmesnika OData, mora biti to omogočeno z metodo globalnega konteksta SetComposition ofStandardInterfaceOData().
Mehanizem za nastavitev sestave objektov, ki so na voljo s standardnim vmesnikom OData, je mogoče izvesti v obliki zunanja obdelava. To ne zahteva spreminjanja aplikacijske rešitve.

Za interakcijo z zunanjim spletnim strežnikom REST iz 1C:Enterprise uporabljamo orodja, ki so na voljo v platformi za delo s predmeti HTTP: HTTPConnection, HTTPRequest in HTTPResponse.

V tej seriji člankov bom prikazal primere tipičnih operacij z uporabo ustrezne metode HTTP;

  • Prejemanje podatkov - metoda DOBITI;
  • Ustvarjanje predmeta – metoda OBJAVI;
  • Posodobite podatke: metoda POKRIV– v tem primeru lahko določite samo tiste lastnosti, ki jih je treba posodobiti; metoda POSTAVITE– v tem primeru je treba navesti vse lastnosti subjekta;
  • Brisanje podatkov - metoda IZBRIŠI.

1. Primeri zajemanja podatkov. Metoda HTTP GET

Strežnik bo zbirka podatkov, objavljena na spletnem strežniku z imenom WebBuh(Demo baza podatkov “Enterprise Accounting 3.0”). Kot format za izmenjavo podatkov bom uporabil format JSON. Več informacij o delu z JSON je napisano v razpoložljivi dokumentaciji. Če želite prejemati podatke s strežnika z metodo HTTP GET, morate ustvariti objekt Branje JSON za zaporedno branje podatkov JSON iz datoteke ali niza. Če želite organizirati zaporedno snemanje objektov in besedil na strežniku z uporabo metode HTTP POST PATCH PUT, morate ustvariti objekt Vnos JSON. Upoštevajte, da metoda DELETE ne zahteva JSON.

Za ponazoritev poteka branja in pisanja JSON pri dostopu do vmesnika REST bom poklical naslednjo funkcijo po meri glavni namen Pokličite HTTPMethodOnServer :

&Na strežniku // <Описание функции>// // Opcije: // - Niz, ki vsebuje ime metode HTTP za zahtevo ("POST"."PATCH", "PUT" ,"GET","DELETE" // - Objekt HTTPConnection //<АдресРесурса>- Niz vira http, na katerega bo poslana zahteva HTTP. //<ОтправляемыеДанные>- Struktura ali ujemanje, ki vsebuje podatke, poslane na določen naslov za obdelavo // na strežniku z uporabo podane metode HTTP "POST" ali "PATCH" ali "PUT" // Povratna vrednost: // Struktura odziva strežnika, odvisno od metodo HTTP// Funkcija Pokliči HTTPMethodOnServer(HTTPMethod, HTTPConnection, ResourceAddress, SentData = Nedoločeno ) // Ustvari zahtevo HTTP Glave = novo ujemanje(); Naslovi. Vstavi("Vrsta vsebine", "aplikacija/json"); Zahteva HTTP = Nova zahteva HTTP ( ResourceAddress, Headers ); // Napišite Json za ustvarjanje in posodabljanje podatkovČe je HTTPMethod = "POST" ali HTTPMethod = "PATCH" ali HTTPMethod = "PUT", potem zapis JSON = nov zapis JSON ; Parametri JSON = Novo ParametersRecordsJSON(Vrstica WrapJSON.Auto,"",True); RecordJSON.SetString(ParametriJSON); WriteJSON(WriteJSON, SentData ); // SentData so v tem primeru potrebne LineForBody = RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, TextEncoding.UTF8, UsingByteOrderMark.Ne uporabljajte); endIf; // Pokliči metodo HTTPConnection ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMethod, HTTPRequest) ; Struktura odgovora= Nova struktura; Struktura odgovora.Insert("StatusCode", ResponseHTTP.StatusCode); // Branje JSON samo za metodo GETče HTTPMetoda="GET" Potem TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Ujemanje = ReadJSON(ReadJSON,Prav); Struktura odgovora.Vstavi("ServerResponse",Dopisovanje) ; Struktura odgovora.Vstavi (" Odziv strežnika Nešifrirano", ServerResponse); Izjema Poročilo (Opis napake ()); Vrni Nedefinirano; EndAttempt; EndIf ; Vrnitev Struktura odgovora ; EndFunction // Pokliči HTTPMethodOnServer()

Za prejemanje s strežnika v format JSON ko dostopate do vmesnika REST aplikacijske rešitve, morate podati naslov vira $format=json. Ali določite vrsto MIME "aplikacija/json" v naslovu:

Glave = novo ujemanje(); Headings.Insert("Content-Type", "aplikacija/json") ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" Zahteva HTTP = Novo HTTPRequest(ResourceAddress, Headers);

Značilnost globalnega konteksta ReadJSON(ReadJSON, True)

  • Če je drugi parameter nastavljen na True, preberite predmet JSON bo dokončan v Dopisovanje.Če je nastavljeno na False, bodo objekti prebrani v objekt tipa Struktura.
  • Ko deserializirate objekte JSON v strukturo, se morate zavedati zahtev glede strukturnega ključa. Če je pri deserializaciji objekta najdeno ime lastnosti, ki ni veljavno za strukturni ključ, bo vržena izjema.

1. 1 Konfiguracija parametrov povezave HTTP

Za organizacijo odjemalskega dela interakcije z zunanjim spletnim strežnikom REST sem iz nič ustvaril konfiguracijo odjemalca, ki temelji na BSP. S to konfiguracijo sem ustvaril referenco za nastavitev parametrov povezave (glej sliko 1)

Slika 1 Imenik za nastavitev parametrov za povezavo HTTP z zunanjo informacijsko varnostjo prek vmesnika rest

Po pritisku na gumb Preverite odziv strežnika, pokliče se postopek, v katerem bo odjemalec poskušal prejeti odgovor od strežnika. Programska koda Postopek je napisan spodaj:

&OnClient Postopek CheckConnection(Command) Address = Object.ServerAddress; Uporabnik = Object.User; Geslo = Object.Password; Ime baze podatkov = Ime predmeta; Pristanišče =? (Object.Port<>0,Object.Port,80); HTTPConnection = Novo HTTPConnection(naslov, vrata, uporabnik, geslo); ResourceAddress = DatabaseName + "/odata/standard.odata/ $metapodatki "; //Pokliči funkcija po meri Struktura odgovora= B Pokličite HTTPMethodOnServer("GET", HTTPConnection, ResourceAddress) ; če Struktura odgovora <> Nedefinirano Potem GeneralPurposeClientServer.NotifyUser("Status Code"+ResponseStructure.StatusCode); Neskončno; Konec postopka

Namen tega postopka je preverjanje storitve in ali je uporabnik pravilno vnesel parametre povezave. Če želite to narediti, preprosto izvedite zahtevo GET:
HTTPConnection.CallHTTPMethod( "DOBITI", Zahteva HTTP);
z uporabo naslova vira:
ResourceAddress =BaseName+ /odata/standard.odata/ “;
Storitev lahko preverite tudi v brskalniku z uporabo
URL
http://host/WebBuh/odata/standard.odata. Rezultat takšne poizvedbe je le seznam entitet. Za pridobitev popolnega opisa standardnega vmesnika OData (seznam razpoložljivih entitet, njihovih atributov in funkcij v obliki XML-
dokument.) morate izvesti zahtevo GET z uporabo parametra $metapodatki. URL http://host/WebBuh/odata/standard.odata/$metadata. Natančen opis Dokument je na voljo na http://www.odata.org/documentation/ (v angleščini).
Odgovore lahko prejmete v formatu Atom/XML ali JSON. Statusne kode odziva HTTP si lahko ogledate Odgovori v obsegih:

  • 100-199 – informativne odgovore, ki izkazujejo, da je naročnikova zahteva sprejeta in je v obdelavi.
  • 200-299 – pomeni, da je bila zahteva stranke uspešno obdelana.
  • 300-399 pomeni, da zahteva ni bila dokončana in mora stranka izvesti nekaj dejanj, da ugodi zahtevi.
  • 400-499 – obvešča o napakah na strani odjemalske aplikacije. Te kode lahko tudi nakazujejo, da se od stranke zahtevajo dodatne informacije.
  • 500-599 - Obvešča o napaki na strani strežnika, kar pomeni, da je strežnik naletel na napako in verjetno ne bo mogel izpolniti odjemalčeve zahteve.

1.2 Iskanje predmeta po ID-ju

Naslednja funkcija je zasnovana za iskanje imenika ali dokumenta po enoličnem identifikatorju na strežniku. Če je predmet najden, potem funkcija vrne vrednost niza identifikatorja (Ref_Key), sicer vrne nedoločeno. V funkcijo se posredujejo naslednji parametri:

  • HTTPConnection – Objekt tipa HTTPConnection
  • PublicationName – Ime objavljene baze podatkov strežnika
  • Element – ​​identifikator entitete objekta, na primer Katalog_organizacij ali Dokument_- imenik organizacije.
  • Identifikator – Identifikator predmeta, ki ga je treba iskati na strežniku, npr. Organisation.UniqueIdentifier()
Funkcija &OnServer SearchObjectByGUID (HTTPConnection,PublicationName,Element,UniqueIdentifier) GUID = String(UniqueIdentifier); // pretvori v niz ResourceAddress = + Element+ "(guid""+ GUID+ "")?$format=json" ; Struktura odgovora = BPokličite HTTPMethodOnServer("DOBITI" , HTTPConnection, ResourceAddress) ; če Struktura odgovora .StatusCode >= 400 Nato //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Vrnitev nedefinirana; EndIf ; Ujemanje = Struktura odgovora. ReplyServer a; Niz = Ujemanje ["vrednost"]; If Array = Undefined Then Return Match["Ref_Key"] Else Return Array["Ref_Key"]; endIf; EndFunction

Parameter ResourceAddress uporablja za dostop do storitve REST. Če želite preveriti delovanje storitve, lahko vir v brskalniku določite takole

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Element)?(Parametri) ,Kje

  • Naslov spletnega strežnika– Naslov spletnega strežnika, na katerem je storitev objavljena, na primer Localhost
  • NamePublikacije- Ime informacijsko bazo naveden ob objavi odločbe
  • /odata/standard.odata/ – Znak za dostop do standardnega vmesnika OData
  • Element – identifikator vira ali vnaprej določeni viri. Na primer Catalog_Account(guid'value').
  • Opcije– parametri virov. Uporablja se na primer za izbiro na sprejet način za zahteve HTTP: ?key=value&key2=value2

1.3 Iskanje predmeta z uporabo iskalnih polj

Naslednja uporabniško definirana funkcija je namenjena iskanju predmeta po iskalnih poljih v primeru, da je predmet po identifikacijski številki. Niz funkcijskih objektov Ref_Key –identifikacijsko številko.

Funkcija &na strežniku P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields) Pogoj = "" ; Za vsako ključno vrednost iz zanke iskalnega polja Pogoj = Pogoj + KeyValue.Key+ "eq"" + KeyValue.Value+ "" in "; EndCycle; Besedilo zahteve =Lev(Pogoj, StrLength(Pogoj)-5); // odstrani zadnjih 5 znakov ResourceAddress= PublicationName+ "/odata/standard.odata/" +Element+ "?$filter=" + Besedilo zahteve+ "&$format=json& $select=Ref_Key" ; //Pokliči mojo funkcijo po meri Struktura odgovora= CallHTTPMethodOnServer( "DOBITI",HTTPConnection,ResourceAddress);če Struktura odgovora .StatusCode >= 400 Nato //Splošni namenClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //Splošni namenClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Vrni nedefinirano; endIf; Ujemanje = Struktura odgovora. ReplyServer a; Niz = Ujemanje ["vrednost" ]; If Array = Undefined Then Return Match ["Ref_Key" ] Else Return Array ["Ref_Key" ]; endIf; EndFunction

Kot je razvidno iz telesa postopka p searchObjectBySearchFields, se izbor začne s ključno besedo$filterv naslovu vira. Formalni parameterIskalna polja –to je korespondenca, ki vsebuje imena in vrednosti podrobnosti.

Upoštevajte, da imena podrobnosti včasih niso očitna. Zapomniti si je treba, da za referenčne knjige:

  • Koda - koda,
  • Opis – ime
  • DeletionMark – oznaka za izbris,
  • IsFolder – znak skupine,
  • Parent_Key – nadrejeni.
  • Če je atribut referenčnega tipa, je treba njegovemu imenu dodati pripono _Key, na primer Account_Key.

Za dokumente:

  • Številka – številka dokumenta,
  • Datum – datum dokumenta.

Logične izbirne operacije

  • eq - enako; /Catalog_Cities?$filter=Name eq 'Main';
  • ne – ni enako; /Catalog_Cities?$filter=Ime ne 'Perm';
  • gt - Več; /Catalog_Products?$filter= Cena gt 10;
  • ge - Večje ali enako; /Catalog_Products?$filter=Cena ge 10;
  • lt - Manj; /Catalog_Products?$filter=Cena lt 10;
  • le - manj kot ali enako; /Catalog_Products?$filter=Cena le 10;
  • ali - logični ALI; /Katalog_ Izdelki ?$filter= Cena lt 10 ali Cena gt 100;
  • in - logični IN; / Katalog _Izdelki?$ filter =Cena g t 10 in Cena l t 100;
  • ne - Negacija; /Catalog_ Products ?$filter=not (Price eq 10);

Upoštevajte tudi, da je vrednost dejanskega parametra Element(ali entiteta)), ki jo posredujem funkciji se oblikuje po naslednjem pravilu:

Ime Prefix_ConfigurationObjectName_Name Pripona.

Z uporabo standardnega vmesnika OData lahko dostopate do naslednjih objektov ( Predpona imena):

  • imenik - katalog;
  • Dokument - dokument;
  • Dnevnik dokumentov - DocumentJournal;
  • Konstanta - Konstanta;
  • Načrt izmenjave - ExchangePlan;
  • Kontni načrt - ChartOfAccounts
  • Grafikon tipov izračuna - ChartOfCalculationTypes;
  • Characteristic type chart - ChartOfCharacteristicTypes;
  • Informacijski register - InformationRegister;
  • Register akumulacije - AccumulationRegister;
  • Register izračunov - CalculationRegister;
  • Računovodski register - AccountingRegister;
  • Poslovni proces - BusinessProcess;
  • Naloga - Naloga.

ConfigurationObjectName- lastnost “Ime” konfiguracijskega objekta, kot je določeno v konfiguratorju.

Pripona imena- potrebno za pojasnitev imena vira, neobvezno, lahko sprejme naslednje vrednosti:

  • Ime tabelarnega dela predmeta;
  • Ime virtualna miza objekt;
  • RowType - vrstica tabelarnega dela predmeta;
  • RecordType - ločen vnos v register.

Parametri za dostop do virov

Po oblikovanju imena vira morate določiti parametre za dostop do vira, npr. ?$filter= Pomen &$format=json& $izberi= Ref_Key ,

  • $filter- izbira ob prejemu podatkov
  • $format- označuje obliko vrnjenih podatkov,
  • $izberi- navajanje lastnosti entitete, ki bodo vključene v rezultat poizvedbe;
  • $metapodatki- vrne opis standardnega vmesnika OData (uporabljen brez podajanja pripone imena, primer na eni od zgornjih slik);
  • $top- omejitev števila vrnjenih zapisov;
  • $preskoči- odstrani določeno število zapisov iz rezultata poizvedbe;
  • $count- vrne število zapisov v izboru poizvedbe;
  • $inlinecount=allpage(=brez)- rezultatu poizvedbe doda informacijo o številu zapisov
  • $orderby=<Реквизит1>vzpon,<Реквизит2>desc- razvrščanje rezultatov poizvedbe
  • dovoliSamo- samo dovoljene (uporabljajo se brez znaka “$”).

1.4 Pridobite niz vnosov v register informacij

Oglejmo si primer pridobivanja niza vnosov v register za informacije o polnih imenih posameznikov, na primer zgodovino sprememb polnih imen posameznika

NamePublikacije = "WebBuh"; Element = "InformationRegister_Name of Individuals"; Obdobje = Nedefinirano; Podatki ReferenceType= nova struktura(); D DataReferenceType.Insert("Posameznik",Posameznik_Key); DataNON-ReferenceType= nova struktura(); DataNON-ReferenceType.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") Array = GetRegisterInfoSet(HTTP povezava, ime objave, element, obdobje, DimensionsReferenceType, Razsežnosti nereferenčnega tipa)

Telo funkcije GetInfoRegisterRecordSet, ki je klicana v tem primeru, je prikazano spodaj

Funkcija &OnServer GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Nedefinirano, DimensionsReferenceType= Nedefinirano Razsežnosti nereferenčnega tipa= Nedefinirano) RequestText = "" ;Če Pika<>Nedefinirano Potem FormattedPeriod= Oblika (Pika,"DF=llll-MM-ddTHH:mm:ss"); RequestText = "Period = datetime"" + FormattedPeriod + """ ; endIf; če DimensionsReferenceType <>Nedefinirano Nato za vsako ključno vrednost DimensionsReferenceType Cikel napajanja =? ( ValueFilled(Besedilo poizvedbe), "," ,""); RequestText = Besedilo zahteve+ Vklopljen + KeyValue.Key+ "=guid(""+ KeyValue.Value+ "")"; EndCycle; EndIf; If Razsežnosti nereferenčnega tipa<> Nedefinirano Potem Za vsak ključni pomen Razsežnosti nereferenčnega tipa Cikel Vprašano =? ( ValueFilled(Besedilo poizvedbe), "," ,""); Besedilo poizvedbe = Besedilo poizvedbe + Fed+ K keyMeaning.Key + "=" + KeyValue.Value; EndCycle; endIf; ResourceAddress=PublicationName + " /odata/standard.odata/" + Element + "("+ Besedilo poizvedbe + + ") ?$format=json"; //Pokliči mojo funkcijo po meri Struktura odgovora = Pokličite HTTPMethodOnServer("GET", povezava HTTP, naslov vira); če Struktura odgovora.StatusCode >= 400 Nato//Splošni namenClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //Splošni namenClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Vrni nedefinirano; endIf; Ujemanje = 0

Od druge različice 8 platforme imajo uporabniki in razvijalci možnost uporabe http zahteve neposredno v 1C. Program podpira dve vrsti poizvedb:

  • POST zahteve;
  • GET zahteve.

Tako je nastalo dokaj priročno orodje za izmenjavo podatkov in interakcijo s spletnimi storitvami in storitvami, ki delujejo prek http.

GET zahteva

Seveda najenostavnejši primeri uporabe poizvedb veliko bolje ponazarjajo njihove zmožnosti kot mnoge vrstice opisa. Poskusimo torej:

  1. Pridobimo telo glavne strani našega spletnega mesta;
  2. Delali bomo na preusmeritvi zahteve;
  3. Vzemimo sliko s spletnega mesta.

Pridobivanje telesa spletnega mesta

Začnimo z nečim preprostim. Na sliki ..

Rezultat izvajanja tega odseka kode je precej veliko besedilo, katerega končni del je prikazan na sliki 2.

Slika 2

V prvi vrstici kode ustvarimo objekt za povezavo z virom http. Objekt lahko vsebuje naslednje lastnosti:

  • Strežnik - povezovalni niz, ki vsebuje naslov strežnika;
  • Vrata – vsebuje številko, ki označuje vrata strežnika; privzeto lahko glede na vrsto povezave določite 80 za nezaščitene povezave ali 443 za zaščitene SSL.
  • Uporabniško ime – označeno, če je potrebna avtorizacija na strežniku;
  • Geslo – uporabniško geslo na določenem viru;
  • Proxy – lahko vsebuje objekt tipa InternetProxy, označen, ko se za komunikacijo s strežnikom uporablja proxy;
  • Varna povezava – privzeta vrednost je FALSE, preklop na TRUE pomeni uporabo protokola https.

Poleg tega ima objekt HTTPConnection svoje metode, klicanje katerih vam omogoča popolnejši opis algoritma izvajanja obdelovalca:

  • CallHTTPmethod – vsebuje dva obvezna parametra, HTTPmethod in HTTPrequest, podpira možnost pisanja telesa odgovora v datoteko, določeno v tretjem parametru;
  • Write – z zahtevo PUT pošlje podatke strežniku;
  • Spremeni – spremeni objekt z obdelavo zahtev PATCH;
  • SendForProcessing – metoda, ki označuje uporabo zahteve POST, mora tako kot vse prejšnje metode vsebovati besedilo zahteve, lahko pa posreduje tudi naslov odzivne datoteke za zapis podatkov;
  • Prejemanje - o tem bomo podrobneje razpravljali v nadaljevanju;
  • GetHeadings je še ena metoda, ki bo uporabljena v članku;
  • Izbriši je pravzaprav zahteva za brisanje, ki iz strežnika odstrani vir, posredovan v zahtevi.

V drugi vrstici ustvarimo zahtevo za izbrano spletno stran, besedilo naše zahteve vsebuje eno poševnico, kar pomeni, da želimo prejeti domača stran. Če bi poševnici sledil kateri koli izraz, na primer »stran2« ali »novice«, bi dobili drugo stran.

Tretja vrstica izvrši našo zahtevo do strežnika.

V četrtem pokažemo rezultat.

Obravnava preusmeritve zahtev http

Predstavljajmo si situacijo, ko moramo programsko pridobiti rezultat iskanja prek katerega koli iskalnik s tipko “Zahteve v 1s”. Del kode, ki je potreben za dostop do GOOGLE, je prikazan na sliki 3

Slika 3

Tukaj so poleg struktur, ki jih že poznamo, še glave in statusna koda. Ukvarjajmo se z njimi.

Statusna koda – standardna vrednost, določena v »Zahtevi za komentarje«, ima lahko naslednje vrednosti:

  1. Če je vse v redu, se bo vrednost vrnila v območju od 100 do 299;
  2. V primeru preusmeritve bo vrnjena koda v območju od 300 do 399, v našem primeru bo uspešno trajno preusmeritev na vir določena s kodo 301;
  3. Če so v zahtevi napake, bo parameter imel vrednost od 400 do 499;
  4. Vrednost v območju 500–599 kaže na težave s strežnikom.

Vsaka stran ima naslov, v besedilu katerega je mogoče razlikovati več parametrov (slika 4):

  1. Shema povezave (vse, kar je pred dvema poševnicama “//”);
  2. Naslovna vrstica povezave;
  3. uporabniško ime in geslo;
  4. Vrata in gostitelj za povezavo.

To delitev izvede funkcija SplitAddressLine. Ko je tako prejel nov naslov, lahko stran shranimo na svoj računalnik in jo odpremo v privzetem brskalniku (postopek GetPage).

Slika 5

Tukaj ni novih funkcij ali načinov za delo z zahtevami, pravzaprav ustvarjamo Besedilni dokument iz telesa mesta in zaženite stran v brskalniku.

Datoteko postavimo v koren pogona D in jo imenujemo test.

Sliko vzamemo s spletnega mesta

Postavlja se naravno vprašanje: če ne potrebujemo celotne strani, ampak moramo pridobiti le njene posamezne elemente, ali je to mogoče storiti in kako? Ja lahko. Programska koda, ki vam to omogoča, je predstavljena na sliki 6

Slika 6

Kot lahko vidite na sliki, imamo v telesu zahteve kodo elementa strukture spletnega mesta, ki ga moramo prejeti. Ta del ni bil v našem prejšnjem opisu in o tem se moramo podrobneje posvetiti.

Uporabili smo brskalnik Opera za dostop do spletnega mesta. Za nas ima eno pomembno orodje: ko z desno miškino tipko kliknete element, lahko prikličete kontekstni meni, katerega eden od elementov je »Ogled kode elementa«.

Zahvaljujoč njemu lahko pridobimo naslov, ki bo uporabljen v zahtevi, slika 7.

POST zahteva

Za razliko od preprostih zahtev Get imajo http zahteve POST telo besedila, ki ga je mogoče shraniti kot običajno besedilna oblika, in v obliki datotek s končnico xml, soap, json. V omrežju je precej orodij za ustvarjanje besedil zahtev, ki vam omogočajo odpravljanje napak in spremljanje izvajanja določenih zahtev.

V 1C za zagon zahteve z določenim besedilom ima objekt zahteve HTTP postopek SetBodyFromString.