1s 8.3 odošlite požiadavku na príjem objednávok. Spracovanie presmerovania požiadavky http

Vznikla úloha prenosu dát medzi 1C (vývoj a konfigurácia bola outsourcovaná), ktorý sa plánuje používať ako hlavný elektronický systém správy dokumentov (EDF) a B2B systémom (interný vývoj), ktorý je napísaný v PHP (Symfony) resp. plní funkcie primárneho informačného vstupu do spoločností.

Už som mal skúsenosti s integráciou B2B s iným B2B. Myšlienkou bolo preniesť JSON pomocou cURL. Potom vyvstala úloha integrovať systém Borlas, založený na Oracle, kde bol tento prístup tiež aplikovaný. Na strane Oracle však použili vlastný balík - analóg cURL v PHP (ak by bol záujem, môžem ho popísať v novom článku).

Ako som zistil, 1C 8.2 vie posielať aj požiadavky GET a POST. Predpokladal som, že ak je už všetko nakonfigurované a funguje s inými systémami, tak by to malo fungovať aj tu. JSON vývojári 1C odmietli s tým, že formát je nevhodný a rozpoznali iba XML. Pripomienky, že by nám to poskytlo minimálny prenos dát, ale v skutočnosti sme dostali veľa dát, boli zamietnuté. V dôsledku toho sme začali pripravovať 2 systémy založené na XML.

Z mojej strany som napísal akceptor žiadosti od 1C a vrátil som výsledky. Funkcia na príjem premennej v POST, v ktorej musel 1Sniki nahradiť XML.
Formát je približne nasledovný:

123ABC456//autorizačný kľúč get_last_orders//operácia, ktorú chcú vykonať 4000//limit záznamov, ktoré chcú vybrať

Obslužný program, ktorý vracia záznamy, ktoré už boli vybraté podľa podmienok a generuje XML ako:

1 O.P.S. 4853352 01.01.2013 1 Nahrané z b2b SNILS 999999999 Celé meno klienta Michailov Michail Evgenievič Dátum aplikácie 01.01.2013 ...

Dáta je možné prenášať iba prostredníctvom pripojenia HTTPS.

Na prvý pohľad sa všetko zdá jednoduché, ale v procese sa vyskytlo niekoľko problémov:
1) zadávatelia uviedli, že nepoznajú požiadavky tohto druhu, a pokúsili sa ponúknuť starú osvedčenú schému:
1. importovať súbor z B2B,
2. Načítanie do 1C,
3. Exportujte súbor s uvedením toho, čo bolo možné spracovať, čo nebolo z 1C,
4. Import do B2B,
5. a od začiatku...
Schéma bola zamietnutá, pretože to bolo potrebné urobiť rýchlo a bez ľudského zásahu a akýchkoľvek „tlačidiel“.

Potom požiadali o príklad kódu. Vyhľadal som na internete nasledujúci príklad:

Server = "test.com"; Port = "443"; HTTPTry = Nové pripojenie HTTP (Server, Port, True); Else HTTP = Nové pripojenie HTTP (Server, Port); koniec Ak; ScriptAddress = "/gateway/GetData1C/"; Attempt HTTP.SendForProcessing(SendFileName, ScriptAddress, ResponseFileName, HTTPHeader); Výnimka Report("Pokus o pripojenie zlyhal: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "Pokus o pripojenie zlyhal: " + ErrorDescription()); EndIf Return; EndPokus;

Dáta začali prichádzať na server, ale boli prázdne, to znamená, že GET a POST boli prázdne. Pridal som záznam do logov a úspešne som naň zabudol. Po 4 mesiacoch som dostal naliehavú úlohu - doviesť integráciu k výsledku (keďže uplynulo veľa času, vývojári 1C pracujú a pracujú, ale nič nereaguje). Nainštalovali mi 1C a začal som sa hrabať.

Najprv som sa rozhodol nainštalovať Fiddler, aby som pochopil, čo sa deje. Všimol som si, že pripojenie je cez HTTP a potom sa server presmeruje na HTTPS. Predpokladal som, že z tohto dôvodu sú údaje prázdne. Pokúsil som sa to reprodukovať v prehliadači Chrome a dostal som potvrdenie, že údaje v požiadavke POST sa počas presmerovania stratia.

Keďže nie je možné povoliť prácu cez HTTP, začal som študovať prečo, pretože sa uvádza, že:

HTTP = Nové pripojenie HTTP (Server, Port, Pravda); Parameter „True“ znamená použiť HTTPS a potom vyšlo najavo, že HTTP = New HTTPConnection (Server, Port);

V dôsledku toho bolo toto „Inak“ vyhodené a zobrazila sa chyba, že certifikát je nesprávny. Certifikát bol vlastnoručne podpísaný. Vývoj integrácie prebiehal na interných serveroch, kde bol na rozdiel od PROD servera oficiálne zakúpený certifikát od „Thawte SSL CA“. Import certifikátu do všetkých možných obchodov nepriniesol žiadne výsledky.

Prehľadávanie zdrojov viedlo k tomu, že 1C má svoje vlastné koreňové certifikáty a na základe nich už kontroluje ostatné. Sú v testovacej forme v súbore „cacert.pem“, ktorý sa nachádza v priečinku „bin“, kde sa nachádza 1C. Import nie je taký jednoduchý, ako sa ukázalo.

Najprv musíme vyexportovať certifikát, ktorý potrebujeme, do súboru (už som ho mal vo svojom osobnom úložisku). Spustením „certmgr.msc“ po nájdení certifikátu ho exportujeme do súboru *.cer.

C:\OpenSSL-Win64\bin>openssl x509 -informujte der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 UPOZORNENIE: Nedá sa otvoriť konfiguračný súbor: /usr/local/ ssl/openssl.cnf MD5 Fingerprint=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
Uložíme MD5, budeme ho potrebovať.
Ďalej otvorte súbor „cacert.pem“.
Ideme úplne dole a pridáme najprv MD5 a potom všetok obsah, ktorý vyšiel v súbore „fiddler.pem“.
Uložte súbor.
Reštartujeme 1C (možno to nie je potrebné, ale nefungovalo mi to, tak som všetko reštartoval.

Zdrojový súbor v 1C dostal túto formu:

Procedure SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefined Then Report("Nepodarilo sa pripojiť k serveru zadanému v nastaveniach výmeny! Spracovanie bolo prerušené!"); V opačnom prípade Source = FileAddress; koniec Ak; FileName = FileResult; PostFileName = PostFile; PostFile = Nový súbor (PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); Hlavičky = Nová zhoda(); Headers.Insert("Content-Type", "application/x-www-form-urlencoded"); Headers.Insert("Content-Lenght", SubmissionFileSize); Attempt Connection.SendForProcessing(PostFileName, Source, FileName, Headers); Správa o výnimke (ErrorDescription()); EndAttempts EndProcedures Funkcia GetHTTPConnection() Export AttemptConnection = New HTTPConnection(HTTPServer,"443",True); Správa o výnimke (ErrorDescription()); Pripojenie = Nedefinované; EndPokus; Spätné pripojenie; EndFunctions Procedure OnOpen() HTTPServer = "test.com"; FileAddress = "/gateway/GetData1C"; PostFile = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; EndProcedure

Po kliknutí na tlačidlo bola odoslaná požiadavka cez HTTPS a ako výstup bolo prijaté správne XML.

Hľadal som, ako funguje 1C cez HTTPS, veľa materiálu, ale nenašiel som, ako pracovať pomocou certifikátu s vlastným podpisom.

Pri vývoji postupu na odosielanie informácií z 1C na stránku s verziou platformy 8.3.9.2170 som narazil na problém: vývojár stránky mi dal možnosť zaznamenať potrebné informácie iba pomocou požiadavky HTTP pomocou metódy PUT.

Bez rozmýšľania som načrtol jednoduchý kód:

Connection = New HTTPConnection("www.mysite.ru"); Hlavičky = Nová zhoda; Hlavičky["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Hlavičky); Connection.Write(Žiadosť);

Na základe výsledkov vykonania malo byť množstvo tovaru prijatého na sklade zadané v príslušnom riadku objednávky kupujúceho na webovej stránke.

Ako ste však už zrejme pochopili, nič sa nestalo. Keď som sa uistil, že na stránke nie sú žiadne chyby (odoslaním podobnej žiadosti prostredníctvom doplnku Chrome), spustil som ju na svojom lokálny počítač webový server a začali experimentovať.

Okamžite sa vyjasnila zvláštna vec: Vyššie uvedený kód negeneruje PUT, ale požiadavku HEAD!

V protokoloch Apache som videl nasledovné:

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

Bol som trochu prekvapený (koniec koncov, v príručke bolo uvedené PUT čiernobielo), ale nebol som zmätený - metódu môžete zavolať priamo:

Connection.CallHTTPMetoda("PUT",Požiadavka);

Protokoly ukazujú to isté:

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

"Možno robím niečo zle?" - položil som si otázku. Ale na internete ani v manuáloch neboli žiadne náznaky. No metódu vedeckého tykania ešte nikto nezrušil. Na začiatok som sa pokúsil urobiť toto:

Connection.CallHTTPMetoda("fyvfyv",Požiadavka);

V protokoloch, ktoré som dostal:

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

Je zvláštne, že to znamená, že 1C nahrádza metódu PUT konkrétne (prečo sa to 1C nepáčilo?).

Po niekoľkých ďalších pokusoch som prišiel na toto:

Connection.CallHTTPMetoda("PUT",Požiadavka);

V protokoloch, ktoré som dostal:

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

A táto možnosť už na stránke fungovala a všetci boli spokojní.

Navrhol správnejšie riešenie problému: musíte zadať telo požiadavky, akékoľvek telo, dokonca aj prázdne. Napríklad táto možnosť bude fungovať:

Connection = New HTTPConnection("www.mysite.ru"); Hlavičky = Nová zhoda; Hlavičky["Content-Type"] = "application/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", Hlavičky); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Žiadosť);

A pravdepodobne je celkom správne odovzdať samotné hodnoty parametrov v tele žiadosti.

Záver je nasledovný: platforma 1C považuje požiadavku PUT bez tela za chybnú a nahrádza metódu HEAD.

Je zvláštne, že 1C nesleduje požiadavku POST bez tela a nezmení ju na GET, skontroloval som to pre zábavu.

Ako by povedal známy Vovochka zo známeho vtipu: "Kde je logika?"

Dúfam, že moja publikácia niekomu ušetrí niekoľko hodín života pri hľadaní odpovede. =)))

Tlačiť (Ctrl+P)

Môžete si pozrieť druhú časť

Všeobecné informácie

Vo verzii platformy 8.3.5.1068 , zverejnený v septembri 2015, mechanizmus na integráciu 1C s externé programy prostredníctvom technológie REST rozhranie. Platforma používa protokol OData ako prístupový protokol. Je to otvorený webový protokol na vyhľadávanie a aktualizáciu údajov. Umožňuje vám manipulovať s údajmi pomocou príkazov HTTP ako požiadaviek. Vo verzii 8.3.5.1068 bolo možné prijímať odpovede len vo formáte Atom/XML . Počnúc vydaním 8.3.8.1652 v auguste 2017 sa však objavila druhá možnosť pre príjem údajov vo formáte JSON (JavaScript Object Notation). . V porovnaní s XML je ľahko čitateľný a zaberá menej miesta. Všetky prehliadače majú navyše vstavané nástroje na prácu s JSON.

Prácu s protokolom OData na platforme 1C: Enterprise nájdete v knihe 1C: Developer's Guide v kapitole 17 Mechanizmy internetových služieb, odsek 17.2.1 Štandardné rozhranie OData. Môžete si tiež pozrieť príklady rozšírenia podpory pre protokol OData,

Výhoda použitia REST rozhranie. dochádza k záveru, že na získanie prístupu k systémovým údajom z externej aplikácie nie je potrebná úprava kódu aplikačného riešenia (napríklad ak je aplikačné riešenie podporované). Ak chcete získať tento prístup, musíte aplikáciu publikovať na webovom serveri špecifickým spôsobom a špecifikovať, ktoré konfiguračné objekty sa budú týmto spôsobom používať. Systémy tretích strán potom môžu pristupovať k vašej aplikácii pomocou požiadaviek HTTP.

Publikovanie štandardného rozhrania OData sa vykonáva pomocou publikačného dialógu na webovom serveri (Administrácia - Publikovanie na webový server) a popísané v knihe 1C:Enterprise 8.3. „Príručka správcu“.
Dôležité! Aby boli konfiguračné objekty prístupné cez štandardné rozhranie OData, musí to byť povolené pomocou metódy globálneho kontextu SetComposition of StandardInterfaceOData().
Mechanizmus nastavenia zloženia objektov dostupných pomocou štandardného rozhrania OData je možné vykonať vo formulári externé spracovanie. To si nevyžaduje úpravu aplikačného riešenia.

Na interakciu s externým webovým serverom REST od 1C:Enterprise používame nástroje dostupné v platforme na prácu s objektmi HTTP: HTTPConnection, HTTPRequest a HTTPResponse.

V tejto sérii článkov ukážem príklady typických operácií pomocou zodpovedajúcej metódy HTTP;

  • Prijímanie údajov – spôsob GET;
  • Vytvorenie objektu - metóda POST;
  • Aktualizácia údajov: metóda ZÁPLATA– v tomto prípade môžete zadať iba tie vlastnosti, ktoré je potrebné aktualizovať; metóda PUT– v tomto prípade je potrebné uviesť všetky vlastnosti entity;
  • Vymazanie údajov - metóda VYMAZAŤ.

1. Príklady získavania údajov. Metóda HTTP GET

Server bude databáza zverejnená na webovom serveri s názvom WebBuh(Ukážková databáza “Enterprise Accounting 3.0”). Ako formát výmeny údajov použijem formát JSON. Viac informácií o práci s JSON je napísaných v dostupnej dokumentácii. Ak chcete prijímať údaje zo servera pomocou metódy HTTP GET, musíte vytvoriť objekt Čítanie JSON na sekvenčné čítanie údajov JSON zo súboru alebo reťazca. Ak chcete organizovať sekvenčné nahrávanie objektov a textov na serveri pomocou metódy HTTP POST PATCH PUT, musíte vytvoriť objekt Vstup JSON. Všimnite si, že metóda DELETE nevyžaduje JSON.

Na ilustráciu toku čítania a zápisu JSON pri prístupe k rozhraniu REST zavolám nasledujúcu vlastnú funkciu všeobecný účel ZavolajteHTTPMethodOnServer :

&Na serveri // <Описание функции>// // Možnosti: // - Reťazec obsahujúci názov metódy HTTP pre požiadavku ("POST"."PATCH", "PUT" ,,GET","DELETE" // - objekt HTTPConnection //<АдресРесурса>- Reťazec http zdroja, na ktorý bude odoslaná HTTP požiadavka. //<ОтправляемыеДанные>- Štruktúra alebo zhoda obsahujúca údaje odoslané na zadanú adresu na spracovanie // na server pomocou zadanej metódy HTTP "POST" alebo "PATCH" alebo "PUT" // Návratová hodnota: // Štruktúra odpovede servera v závislosti od metóda HTTP// Funkcia Zavolajte HTTPMethodOnServer(HTTPMethod, HTTPConnection, ResourceAddress, SentData = Nedefinované) // Vytvorenie požiadavky HTTP Hlavičky = new Match(); Nadpisy.Vložiť("Typ obsahu", "aplikácia/json"); Požiadavka HTTP = Nová požiadavka HTTP ( ResourceAddress, hlavičky ); // Napíšte Json na vytvorenie a aktualizáciu údajov Ak HTTPMethod = "POST" alebo HTTPMethod = "PATCH" alebo HTTPMethod = "PUT" Potom JSON Record = Nový JSON záznam ; ParametreJSON = Nové ParametersRecordsJSON(Line WrapJSON.Auto,"",True); RecordJSON.SetString(ParametreJSON); WriteJSON(WriteJSON, SentData ); // SentData sú v tomto prípade povinné LineForBody = RecordJSON.Close(); RequestHTTP.SetBodyFromString(StringForBody, Kódovanie textu.UTF8, UsingByteOrderMark.Nepoužívať); koniec Ak; // Volanie metódy HTTPConnection Method ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMmethod, HTTPRequest) ; Štruktúra odpovede= Nová štruktúra; Štruktúra odpovede.Insert("StatusCode", ResponseHTTP.StatusCode); // Čítanie JSON iba pre metódu GET Ak HTTPMethod="GET" Potom TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Zápas = ReadJSON(ReadJSON,Pravda); Response Structure.Insert("ServerResponse",Korešpondencia) ; Štruktúra odpovede.Vložte (" Odozva servera nedešifrovaná", ServerResponse); Výnimka Správa(ErrorDescription()); Return Undefined; EndPokus; Koniec Ak ; Návrat Štruktúra odpovede ; EndFunction // Volanie HTTPMethodOnServer()

Na príjem zo servera v formát JSON pri prístupe k rozhraniu REST aplikačného riešenia musíte zadať adresu zdroja $format=json. Alebo zadajte typ MIME "application/json" v názve:

Hlavičky = new Match(); Headings.Insert("Content-Type", "application/json") ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" RequestHTTP = Nové HTTPRequest(ResourceAddress, Headers);

Charakteristika globálneho kontextu ReadJSON(ReadJSON, True)

  • Ak je druhý parameter nastavený na hodnotu True, prečítajte si objekt JSON bude dokončená v Korešpondencia.Ak je nastavené na False, objekty budú načítané do objektu typu Štruktúra.
  • Pri deserializácii objektov JSON do štruktúry si musíte byť vedomí požiadaviek na kľúč štruktúry. Ak sa pri deserializácii objektu nájde názov vlastnosti, ktorý nie je platný pre kľúč štruktúry, bude vyvolaná výnimka.

1. 1 Konfigurácia parametrov pripojenia HTTP

Na organizáciu klientskej časti interakcie s externým webovým serverom REST som od začiatku vytvoril konfiguráciu klienta založenú na BSP. Pomocou tejto konfigurácie som vytvoril referenciu pre nastavenie parametrov pripojenia (pozri obr. 1)

Obr 1 Adresár pre nastavenie parametrov pre HTTP pripojenie k externej informačnej bezpečnosti cez ostatné rozhranie

Po stlačení tlačidla Skontrolujte odpoveď servera, volá sa procedúra, v ktorej sa klient pokúsi prijať odpoveď zo servera. Programový kód Postup je napísaný nižšie:

&OnClient Postup CheckConnection(Command) Address = Object.ServerAddress; Používateľ = Objekt.Používateľ; Heslo = Objekt.Heslo; Názov databázy = Object.Name; Port = ? (Object.Port<>0,Object.Port,80); HTTPConnection = Nové HTTP pripojenie (adresa, port, používateľ, heslo); ResourceAddress = Názov databázy + "/odata/standard.odata/ $metadata "; //Zavolajte vlastná funkcia Štruktúra odpovede= B Zavolajte HTTPMethodOnServer("GET", HTTPConnection,ResourceAddress) ; Ak Štruktúra odpovede <> Nedefinované Potom General PurposeClientServer.NotifyUser("Status Code"+Response Structure.Status Code); Nekonečné; EndProcedure

Účelom tohto postupu je kontrola služby ači používateľ správne zadal parametre pripojenia. Ak to chcete urobiť, stačí vykonať požiadavku GET:
HTTPConnection.CallHTTPMmethod( "GET", požiadavka HTTP);
pomocou adresy zdroja:
ResourceAddress =BaseName+ /odata/standard.odata/ “;
Službu môžete skontrolovať aj vo svojom prehliadači pomocou
URL
http://host/WebBuh/odata/standard.odata. Výsledkom takéhoto dotazu je iba zoznam entít. Získať úplný popis štandardného rozhrania OData (zoznam dostupných entít, ich atribútov a funkcií vo forme XML-
dokumentu.) musíte vykonať požiadavku GET pomocou parametra $metadata. URL http://host/WebBuh/odata/standard.odata/$metadata. Detailný popis Dokument je možné získať na http://www.odata.org/documentation/ (v angličtine).
Odpovede môžete dostávať vo formáte Atom/XML alebo JSON. Stavové kódy odpovede HTTP je možné zobraziť Odpovede v rozsahoch:

  • 100-199 – informačné odpovede naznačujúce, že žiadosť klienta bola prijatá a spracováva sa.
  • 200-299 – znamená, že požiadavka klienta bola úspešne spracovaná.
  • 300-399 znamená, že požiadavka nebola dokončená a klient musí vykonať nejakú akciu na uspokojenie požiadavky.
  • 400-499 – informuje o chybách na strane klientskej aplikácie. Tieto kódy môžu tiež naznačovať, že sa od klienta vyžadujú dodatočné informácie.
  • 500-599 - Informuje o chybe na strane servera, čo naznačuje, že server narazil na chybu a pravdepodobne nebude schopný splniť požiadavku klienta.

1.2 Vyhľadávanie objektu podľa ID

Ďalšia funkcia je určená na vyhľadávanie adresára alebo dokumentu podľa jedinečného identifikátora na serveri. Ak sa objekt nájde, funkcia vráti hodnotu reťazca identifikátora (Ref_Key), inak vráti nedefinované. Funkcii sa odovzdajú nasledujúce parametre:

  • HTTPConnection – Objekt typu HTTPConnection
  • PublicationName – názov databázy publikovaného servera
  • Element – ​​identifikátor entity objektu, napr. Katalóg_Organizácií alebo Document_- adresár organizácie.
  • Identifikátor – Identifikátor objektu, ktorý sa má hľadať na serveri, napr. Organization.UniqueIdentifier()
&Funkcia na serveri SearchObjectByGUID (HTTPConnection,PublicationName,Element,UniqueIdentifier) GUID = String(UniqueIdentifier); // prevod na reťazec ResourceAddress = + Element+ "(guid""+ GUID+ "")?$format=json" ; Štruktúra odpovede = BZavolajte HTTPMethodOnServer("GET" , HTTPConnection,ResourceAddress) ; Ak Štruktúra odpovede .StatusCode >= 400 Potom //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Návrat nedefinovaný; Koniec Ak ; Zápas = Štruktúra odpovede. ReplyServer a; Pole = Zhoda["value"]; If Array = Undefined Then Return Match["Ref_Key"] Inak Return Array["Ref_Key"]; koniec Ak; EndFunction

Parameter ResourceAddress slúži na prístup k službe REST. Ak chcete skontrolovať fungovanie služby, môžete v prehliadači zadať zdroj takto

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Element)?(Parametre) ,Kde

  • Adresa webového servera– Adresa webového servera, na ktorom je služba zverejnená, napríklad Localhost
  • Názov Publikácie- Názov informačnú základňu uvedené pri zverejnení rozhodnutia
  • /odata/standard.odata/ – Označenie prístupu k štandardnému rozhraniu OData
  • Element – identifikátor zdroja alebo preddefinované zdroje. Napríklad Catalog_Account(guid’value’).
  • možnosti– parametre zdrojov. Používa sa napríklad na výber, akceptovaným spôsobom pre požiadavky HTTP: ?key=value&key2=value2

1.3 Vyhľadávanie objektu pomocou vyhľadávacích polí

Nasledujúca užívateľom definovaná funkcia je určená na vyhľadávanie objektu podľa vyhľadávacích polí v prípade, že je objekt podľa identifikačného čísla. Reťazec funkčných objektov Ref_Key –identifikačné číslo.

&Funkcia na serveri P searchObjectBySearchFields(HTTPConnection,PublicationName,Element,SearchFields) Podmienka = "" ; Pre každú kľúčovú hodnotu zo slučky vyhľadávacieho poľa Podmienka = Podmienka + KeyValue.Key+ "ekv"" + KeyValue.Value+ "" a "; EndCycle; Text dopytu =Lev(stav, StrLength(stav)-5); // odstránenie posledných 5 znakov ResourceAddress= PublicationName+ "/odata/standard.odata/" +Element+ "?$filter=" + Text dopytu+ "&$format=json& $select=Ref_Key" ; //Zavolajte moju vlastnú funkciu Štruktúra odpovede= CallHTTPMethodOnServer( "GET",HTTPConnection,ResourceAddress); Ak Štruktúra odpovede .StatusCode >= 400 Potom //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Návrat nedefinovaný; koniec Ak; Zápas = Štruktúra odpovede. ReplyServer a; Pole = Zhoda["value" ]; If Array = Undefined Then Return Match ["Ref_Key" ] Inak Return Array ["Ref_Key" ]; koniec Ak; EndFunction

Ako je možné vidieť z tela postupu P searchObjectBySearchFields, výber začína kľúčovým slovom$filterv adrese zdroja. Formálny parameterVyhľadávacie polia –toto je korešpondencia, ktorá obsahuje názvy a hodnoty podrobností.

Upozorňujeme, že názvy podrobností niekedy nie sú zrejmé. Je potrebné si uvedomiť, že pre referenčné knihy:

  • Kód - kód,
  • Popis – Názov
  • DeleteMark – značka vymazania,
  • IsFolder – znak skupiny,
  • Parent_Key – rodič.
  • Ak je atribút referenčného typu, k jeho názvu by sa mala pridať prípona _Key, napríklad Account_Key.

Pre dokumenty:

  • Číslo – číslo dokladu,
  • Dátum – dátum dokladu.

Operácie logického výberu

  • eq - Rovná sa; /Catalog_Cities?$filter=Name eq ‘Hlavné’;
  • ne - nerovná sa; /Catalog_Cities?$filter=Name ne ‘Perm’;
  • gt - Viac; /Catalog_Products?$filter= Cena 10 gt;
  • ge - väčšie alebo rovné; /Catalog_Products?$filter=Cena ge 10;
  • lt - Menej; /Catalog_Products?$filter=Cena lt 10;
  • le - menšie alebo rovné; /Catalog_Products?$filter=Cena le 10;
  • alebo - logické ALEBO; /Katalóg_ Produkty ?$filter= Cena lt 10 alebo Cena 100 gt;
  • a - logické AND; / Katalóg _Produkty?$ filter =Cena g t 10 a Cena l t 100;
  • nie - Negácia; /Katalóg_ Produkty ?$filter=not (cena rovná 10);

Všimnite si tiež, že hodnota skutočného parametra Element(alebo entity)), ktoré odovzdávam funkcii sa tvorí podľa nasledujúceho pravidla:

Názov Prefix_ConfigurationObjectName_Name Prípona.

Pomocou štandardného rozhrania OData máte prístup k nasledujúcim objektom ( Predpona mena):

  • Adresár - Katalóg;
  • Dokument - Dokument;
  • Dokumentový denník - DocumentJournal;
  • Konštantný - Konštantný;
  • Výmenný plán - Výmenný plán;
  • Účtová osnova - ChartOfAccounts
  • Tabuľka typov výpočtov - ChartOfCalculationTypes;
  • Tabuľka charakteristických typov - ChartOfCharacteristicTypes;
  • Register informácií - InformationRegister;
  • Register akumulácie - Register akumulácie;
  • Register výpočtov - CalculationRegister;
  • Účtovný register - Účtovný register;
  • Obchodný proces - BusinessProcess;
  • Úloha – Úloha.

ConfigurationObjectName- vlastnosť „Name“ konfiguračného objektu, ako je špecifikovaná v konfigurátore.

Prípona mena- potrebné na objasnenie názvu zdroja, voliteľné, môže mať nasledujúce hodnoty:

  • Názov tabuľkovej časti objektu;
  • názov virtuálny stôl objekt;
  • RowType - riadok tabuľkovej časti objektu;
  • RecordType - samostatný záznam registra.

Parametre pre prístup k zdrojom

Po vytvorení názvu zdroja je potrebné definovať parametre pre prístup k zdroju, napr. ?$filter= Význam &$ formát=json& $select= Ref_Key ,

  • $filter- výber pri príjme dát
  • $ formát- označuje formát vrátených údajov,
  • $vybrať- výpis vlastností entity, ktoré budú zahrnuté vo výsledku dotazu;
  • $metadata- vráti popis štandardného rozhrania OData (použité bez zadania prípony názvu, príklad na jednom z obrázkov vyššie);
  • $top- obmedzenie počtu vrátených záznamov;
  • $preskočiť- odstráni zadaný počet záznamov z výsledku dotazu;
  • $počet- vráti počet záznamov vo výbere dotazu;
  • $inlinecount=allpage(=none)- k výsledku dotazu pridá informáciu o počte záznamov
  • $orderby=<Реквизит1>vzostupne,<Реквизит2>desc- triedenie výsledku dotazu
  • len povoliť- iba povolené (používané bez znaku „$“).

1.4 Získajte pole položiek registra informácií

Pozrime sa na príklad získania radu záznamov v registri pre informácie o celých menách jednotlivcov, napríklad históriu zmien celých mien. individuálne

Názov Publikácie = "WebBuh"; Element = "InformationRegister_Meno jednotlivcov"; Obdobie = nedefinované; Údaje o type referencie= new Structure(); D DataReferenceType.Insert("Jednotlivec",Jednotlivý_kľúč); DataNON-ReferenceType= new Structure(); DataNON-ReferenceType.Insert("Individual_Type", "StandardODATA.Catalog_Individuals") Pole = GetRegisterInfoSet(HTTPConnection,PublicationName,Element,Period, RozmeryReferenčnýTyp, Rozmery nereferenčného typu)

Telo funkcie GetInfoRegisterRecordSet, ktorá sa volá v tomto príklade, je zobrazené nižšie

&Funkcia na serveri GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Nedefinované, RozmeryReferenčnýTyp= Nedefinované Rozmery nereferenčného typu= Nedefinované) Text žiadosti = "" ; Ak Obdobie<>Nedefinované Potom FormattedPeriod= Formát (Obdobie,"DF=rrrr-MM-ddTHH:mm:ss"); RequestText = "Obdobie = dátum a čas"" + FormattedPeriod + """ ; koniec Ak; Ak RozmeryReferenčnýTyp <>Nedefinované potom pre každú kľúčovú hodnotu RozmeryReferenčnýTyp Cyklicky zapnuté = ? ( ValueFilled(QueryText), "," ","); RequestText = RequestText+ Zapnuté + KeyValue.Key+ "=guid(""+ KeyValue.Value+ "")"; EndCycle; EndIf; If Rozmery nereferenčného typu<> Nedefinované Potom Pre každý kľúč Význam Rozmery nereferenčného typu Cyklus Spýtal sa = ? ( ValueFilled(QueryText), "," ","); QueryText = QueryText + Fed+ K keyMeaning.Key + "=" + KeyValue.Value; EndCycle; koniec Ak; ResourceAddress=PublicationName + " /odata/standard.odata/" + Prvok + "("+ Text dopytu + + ") ?$format=json"; //Zavolajte moju vlastnú funkciu Štruktúra odpovede = ZavolajteHTTPMethodOnServer("GET",HTTPConnection,ResourceAddress); Ak Štruktúra odpovede.StatusCode >= 400 Potom//General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Návrat nedefinovaný; koniec Ak; Zápas = 0

Od druhej verzie 8 platformy majú používatelia a vývojári možnosť použiť požiadavku http priamo v 1C. Program podporuje dva typy požiadaviek:

  • požiadavky POST;
  • žiadosti GET.

Vznikol tak celkom pohodlný nástroj na výmenu dát a interakciu s webovými službami a službami fungujúcimi cez http.

žiadosť GET

Samozrejme, najjednoduchšie príklady použitia dotazov ilustrujú ich možnosti oveľa lepšie ako mnohé riadky popisu. Tak skúsme:

  1. Zoberme si telo hlavnej stránky nášho webu;
  2. Budeme pracovať na presmerovaní požiadavky;
  3. Zoberme si obrázok zo stránky.

Získava sa telo stránky

Začnime niečím jednoduchým. Na obr.

Výsledkom vykonania tejto časti kódu je pomerne veľký text, ktorého záverečná časť je znázornená na obr.

Obr.2

V prvom riadku kódu vytvoríme objekt pripojenia k zdroju http. Objekt môže obsahovať nasledujúce vlastnosti:

  • Server - reťazec pripojenia obsahujúci adresu servera;
  • Port – štandardne obsahuje číslo označujúce port servera, v závislosti od typu pripojenia môžete zadať 80 pre nezabezpečené pripojenia alebo 443 pre zabezpečené SSL.
  • Používateľské meno – uvádza sa, ak sa vyžaduje autorizácia na serveri;
  • Heslo – heslo používateľa na zadanom zdroji;
  • Proxy – môže obsahovať objekt typu InternetProxy, ktorý sa označuje, keď sa na komunikáciu so serverom používa proxy;
  • Zabezpečené pripojenie – predvolená hodnota je FALSE, prepnutie na TRUE znamená použitie protokolu https.

Okrem toho má objekt HTTPConnection svoje vlastné metódy, ktoré vám umožňujú úplnejšie opísať algoritmus vykonávania obslužného programu:

  • CallHTTPmethod – obsahuje dva požadované parametre, HTTPmethod a HTTPrequest, podporuje možnosť zapísať telo odpovede do súboru špecifikovaného v treťom parametri;
  • Write – pomocou požiadavky PUT odošle dáta na server;
  • Modify – modifikuje objekt spracovaním PATCH požiadaviek;
  • SendForProcessing – metóda označujúca použitie požiadavky POST, tak ako všetky predchádzajúce metódy, musí obsahovať text požiadavky a môže tiež prenášať adresu súboru odpovedí na zaznamenanie údajov;
  • Prijať - to bude podrobnejšie popísané nižšie;
  • GetHeadings je ďalšia metóda, ktorá bude použitá v článku;
  • Delete je v skutočnosti požiadavka na odstránenie, ktorá odstráni zdroj odovzdaný v požiadavke zo servera.

V druhom riadku vytvoríme požiadavku na vybranú stránku, text našej požiadavky obsahuje jednu lomku, čo znamená, že chceme dostávať domovskej stránke. Ak by za lomkou nasledoval akýkoľvek výraz, napríklad „strana2“ alebo „novinky“, dostali by sme inú stránku.

Tretí riadok vykoná našu požiadavku na server.

Vo štvrtom ukazujeme výsledok.

Spracovanie presmerovania požiadavky http

Predstavme si situáciu, že potrebujeme programovo dostať výsledok hľadania cez ktorýkoľvek vyhľadávač tlačidlom „Požiadavky za 1 s“. Časť kódu potrebná na prístup k GOOGLE je znázornená na obr. 3

Obr.3

Okrem štruktúr, ktoré už poznáme, sú tu hlavičky a stavový kód. Poďme sa s nimi vysporiadať.

Stavový kód – štandardná hodnota špecifikovaná v „Žiadosti o komentáre“, môže nadobudnúť nasledujúce hodnoty:

  1. Ak je všetko v poriadku, hodnota sa vráti v rozsahu od 100 do 299;
  2. V prípade presmerovania sa vráti kód v rozsahu od 300 do 399, v našom prípade úspešné trvalé presmerovanie na zdroj určí kód 301;
  3. Ak sú v požiadavke chyby, parameter nadobudne hodnotu od 400 do 499;
  4. Hodnota v rozsahu 500-599 označuje problémy so serverom.

Každá strana má nadpis, v texte ktorého možno rozlíšiť niekoľko parametrov (obr. 4):

  1. Schéma pripojenia (všetko, čo je pred dvoma lomkami „//“);
  2. Adresný riadok spojenia;
  3. Používateľské meno a heslo;
  4. Port a hostiteľ na pripojenie.

Práve toto rozdelenie vykonáva funkcia SplitAddressLine. Takto prijatý Nová adresa, môžeme si stránku uložiť do počítača a otvoriť ju v predvolenom prehliadači (postup GetPage).

Obr.5

Nie sú tu žiadne nové funkcie ani spôsoby práce s požiadavkami, my vlastne tvoríme Textový dokument z tela stránky a spustite stránku v prehliadači.

Súbor umiestnime do koreňového adresára jednotky D a nazveme ho test.

Obrázok berieme zo stránky

Vzniká prirodzená otázka: ak nepotrebujeme celú stránku, ale potrebujeme získať iba jej jednotlivé prvky, dá sa to urobiť a ako? Áno môžeš. Programový kód, ktorý vám to umožňuje, je uvedený na obr

Obr.6

Ako vidíte na obrázku, v tele požiadavky máme kód prvku štruktúry lokality, ktorý potrebujeme prijať. Táto časť nebola v našom predchádzajúcom popise a musíme sa pri tomto bode zastaviť podrobnejšie.

Použili sme prehliadač Opera na prístup na stránku. Má pre nás jeden dôležitý nástroj: kliknutím pravým tlačidlom myši na prvok môžete vyvolať kontextové menu, ktorého jednou z položiek je „Zobraziť kód prvku“.

Práve vďaka nemu môžeme získať adresu, ktorá bude použitá v požiadavke Obr.

POST žiadosť

Na rozdiel od jednoduchých požiadaviek Get majú požiadavky POST http textové telo, ktoré možno uložiť ako bežné textová forma a vo forme súborov s príponou xml, soap, json. V sieti je pomerne veľa nástrojov na vytváranie textov požiadaviek, ktoré umožňujú ladiť a monitorovať vykonávanie určitých požiadaviek.

V 1C má objekt požiadavky HTTP na spustenie požiadavky so špecifickým textom procedúru SetBodyFromString.