1c 8.3 nosūtīt pieprasījumu saņemt pasūtījumus. http pieprasījuma pāradresācijas apstrāde

Radās uzdevums par datu pārsūtīšanu starp 1C (izstrāde un konfigurācija tika ārpakalpojumā), kuru plānots izmantot kā galveno elektronisko dokumentu pārvaldības sistēmu (EDF) un B2B sistēmu (iekšējā izstrāde), kas rakstīta PHP (Symfony) un veic primārās informācijas ievades funkcijas uzņēmumos.

Man jau bija pieredze B2B integrēšanā ar citu B2B. Ideja bija pārsūtīt JSON, izmantojot cURL. Tad radās uzdevums integrēt Borlas sistēmu, kuras pamatā ir Oracle, kur šī pieeja arī tika piemērota. Tomēr Oracle pusē viņi izmantoja savu pakotni - cURL analogu PHP (ja ir interese, varu to aprakstīt jaunā rakstā).

Kā noskaidroju, 1C 8.2 var nosūtīt arī GET un POST pieprasījumus. Es pieņēmu, ka, ja viss jau ir konfigurēts un darbojas ar citām sistēmām, tad tam vajadzētu darboties arī šeit. 1C izstrādātāji noraidīja JSON, sakot, ka formāts nav piemērots un viņi atpazina tikai XML. Komentāri, ka tādējādi mums tiktu nodrošināts minimāls datu pārsūtīšanas apjoms, bet mēs faktiski saņēmām daudz datu, tika noraidīti. Rezultātā mēs sākām sagatavot 2 uz XML balstītas sistēmas.

No savas puses es uzrakstīju pieprasījuma akceptoru no 1C un atgriezu rezultātus. Funkcija mainīgā saņemšanai POST, kurā 1Sniki bija jāaizstāj XML.
Formāts ir aptuveni šāds:

123ABC456//autorizācijas atslēga saņemt_pēdējos_pasūtījumus//operācija, ko viņi vēlas veikt 4000//ierakstu ierobežojums, ko viņi vēlas atlasīt

Apdarinātājs, kas atgriež ierakstus, kas jau ir atlasīti atbilstoši nosacījumiem, un ģenerē XML, piemēram:

1 O.P.S. 4853352 01.01.2013 1 Augšupielādēts no b2b SNILS 999999999 Klienta pilns vārds Mihailovs Mihails Jevgeņevičs Iesniegšanas datums 01.01.2013 ...

Datus var pārsūtīt tikai, izmantojot HTTPS savienojumu.

No pirmā acu uzmetiena viss šķiet vienkāršs, taču procesā radās vairākas problēmas:
1) ārpakalpojumu sniedzēji ziņoja, ka viņiem šāda veida pieprasījumi nav pazīstami, un mēģināja piedāvāt vecu pārbaudītu shēmu:
1. importēt failu no B2B,
2. ielādēšana 1C,
3. Eksportējiet failu, kurā norādīts, ko varēja apstrādāt, kas nebija no 1C,
4. Importēt uz B2B,
5. un no paša sākuma...
Shēma tika noraidīta, jo tas bija jādara ātri, bez cilvēka iejaukšanās un jebkādām "pogām".

Tad viņi lūdza koda piemēru. Internetā meklēju šādu piemēru:

Serveris = "test.com"; Ports = "443"; HTTPTry = jauns HTTP savienojums (serveris, ports, patiess); Else HTTP = jauns HTTP savienojums (serveris, ports); endIf; ScriptAddress = "/gateway/GetData1C/"; Mēģināt HTTP.SendForProcessing(SendFileName, ScriptAddress, ResponseFileName, HTTP Header); Izņēmuma ziņojums("Savienojuma mēģinājums neizdevās: " + ErrorDescription()); ElseLogRecord("HTTPConnection", LogLevel.Error, "Savienojuma mēģinājums neizdevās: " + ErrorDescription()); EndIf Return; EndAttempt;

Dati sāka ienākt serverī, taču tas bija tukšs, tas ir, GET un POST bija tukši. Es pievienoju ierakstu žurnāliem un veiksmīgi aizmirsu par to. Pēc 4 mēnešiem man tika dots steidzams uzdevums - novest integrāciju līdz rezultātam (tā kā pagājis daudz laika, 1C izstrādātāji strādā un strādā, bet nekas neatsaucas). Viņi man uzstādīja 1C, un es sāku bakstīt apkārt.

Pirmkārt, es nolēmu instalēt Fiddler, lai saprastu, kas notiek. Es pamanīju, ka savienojums notiek, izmantojot HTTP, un pēc tam serveris novirza uz HTTPS. Es pieņēmu, ka šī iemesla dēļ dati ir tukši. Es mēģināju to reproducēt pārlūkā Chrome un saņēmu apstiprinājumu, ka POST pieprasījumā norādītie dati ir zaudēti novirzīšanas laikā.

Tā kā strādāt caur HTTP nav iespējams, sāku pētīt, kāpēc, jo norādīts, ka:

HTTP = jauns HTTP savienojums (serveris, ports, patiess); Parametrs “True” nozīmē izmantot HTTPS, un tad atklājās, ka HTTP = jauns HTTP savienojums (serveris, ports);

Rezultātā šis “Citādi” tika izmests, un saņēmu kļūdu, ka sertifikāts ir nepareizs. Sertifikāts tika parakstīts pats. Integrācijas izstrāde tika veikta iekšējos serveros, kur oficiāli tika iegādāts sertifikāts no “Thawte SSL CA”, atšķirībā no PROD servera. Sertifikāta importēšana visos iespējamajos veikalos nedeva rezultātus.

Meklēšana resursos noveda pie tā, ka 1C ir savi saknes sertifikāti, un, pamatojoties uz tiem, tas jau pārbauda citus. Tie ir testa formā failā “cacert.pem”, kas atrodas mapē “bin”, kur atrodas 1C. Importēšana nav tik vienkārša, kā izrādījās.

Pirmkārt, mums nepieciešamais sertifikāts ir jāeksportē uz failu (man tas jau bija manā personīgajā krātuvē). Palaižot “certmgr.msc”, pēc sertifikāta atrašanas mēs to eksportējam uz *.cer failu.

C:\OpenSSL-Win64\bin>openssl x509 -inform der -in C:\fiddler.cer -out C:\fiddler.pem -text -fingerprint -md5 BRĪDINĀJUMS: nevar atvērt konfigurācijas failu: /usr/local/ ssl/openssl.cnf MD5 pirkstu nospiedums=13:BF:73:43:BB:69:19:BA:22:5D:C7:2E:44:85:91:7F
Mēs saglabājam MD5, mums tas būs vajadzīgs.
Pēc tam atveriet failu “cacert.pem”.
Mēs ejam līdz pašai apakšai un vispirms pievienojam MD5 un pēc tam visu saturu, kas tika parādīts failā “fiddler.pem”.
Saglabājiet failu.
Mēs restartējam 1C (varbūt tas nav nepieciešams, bet tas man nedarbojās, tāpēc es visu restartēju.

Avota failam 1C tika piešķirta šāda forma:

Procedūra SendRequestPress(Element) Connection = GetHTTPConnection(); If Connection = Undefined Then Report("Nevarēja izveidot savienojumu ar apmaiņas iestatījumos norādīto serveri! Apstrāde tika pārtraukta!"); Citādi Source = FileAddress; endIf; Faila nosaukums = faila rezultāts; PostFileName = PostFile; PostFile = Jauns fails(PostFileName); SubmissionFileSize = XMLString(SubmissionFile.Size()); Virsraksti = New Match(); Headers.Insert("Content-Type", "application/x-www-form-urlencoded"); Headers.Insert("Content-Lenght", SubmissionFileSize); Mēģināt izveidot savienojumu. SendForProcessing(PostFileName, Source, FileName, Headers); Izņēmuma ziņojums(ErrorDescription()); EndAttempts EndProcedures Funkcija GetHTTPConnection() Export AttemptConnection = Jauns HTTPSavienojums(HTTPServer,"443",True); Izņēmuma ziņojums(ErrorDescription()); Savienojums = Nedefinēts; EndAttempt; Atgriešanās savienojums; EndFunctions procedūra OnOpen() HTTPServer = "test.com"; FileAddress = "/gateway/GetData1C"; PostFile = "C:\POST_1C\post.txt"; FileResult = "C:\POST_1C\result.xml"; Procedūras beigas

Pēc noklikšķināšanas uz pogas tika nosūtīts pieprasījums, izmantojot HTTPS, un kā izvade tika saņemts pareizais XML.

Es meklēju, kā 1C darbojas, izmantojot HTTPS, daudz materiālu, bet nevarēju atrast, kā strādāt, izmantojot pašparaksta sertifikātu.

Izstrādājot procedūru informācijas nosūtīšanai no 1C uz vietni ar platformas versiju 8.3.9.2170, es saskāros ar problēmu: vietnes izstrādātājs man nodrošināja iespēju ierakstīt nepieciešamo informāciju, tikai izmantojot HTTP pieprasījumu, izmantojot PUT metodi.

Divreiz nedomājot, es ieskicēju vienkāršu kodu:

Savienojums = jauns HTTP savienojums ("www.mysite.ru"); Virsraksti = Jauna atbilstība; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Pieprasījums = jauns HTTP pieprasījums("/api/order_items/93076?order_item=30", galvenes); Connection.Write(Request);

Pamatojoties uz izpildes rezultātiem, noliktavā saņemto preču daudzums bija jāievada attiecīgajā pircēja pasūtījuma rindā vietnē.

Tomēr, kā jūs droši vien jau sapratāt, nekas nenotika. Kad es pārliecinājos, ka vietnē nav kļūdu (nosūtot līdzīgu pieprasījumu, izmantojot Chrome spraudni), es to palaidu savā lokālais dators tīmekļa serveri un sāka eksperimentēt.

Tūlīt kļuva skaidra dīvaina lieta: Iepriekš minētais kods neģenerē PUT, bet gan HEAD pieprasījumu!

Apache žurnālos es redzēju sekojošo:

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

Es biju nedaudz pārsteigts (galu galā rokasgrāmatā bija melns un balts PUT), taču es neapjuku - jūs varat izsaukt metodi tieši:

Connection.CallHTTPMethod("PUT",Pieprasījums);

Žurnāli parāda to pašu:

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

"Varbūt es kaut ko daru nepareizi?" - Es uzdevu sev jautājumu. Bet ne internetā, ne rokasgrāmatās nebija nekādu mājienu. Nu neviens vēl nav atcēlis zinātniskās bakstīšanas metodi. Sākumā es mēģināju izdarīt šo:

Connection.CallHTTPMethod("fyvfyv",Request);

Saņemtajos žurnālos:

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

Interesanti, ka tas nozīmē, ka 1C īpaši aizstāj PUT metodi (kāpēc 1C tas nepatika?).

Pēc vēl dažiem mēģinājumiem es nonācu pie šī:

Connection.CallHTTPMethod("PUT",Pieprasījums);

Saņemtajos žurnālos:

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

Un šī iespēja vietnē jau ir darbojusies, un visi bija apmierināti.

Viņš ieteica pareizāku problēmas risinājumu: jānorāda pieprasījuma pamatteksts, jebkura struktūra, pat tukša. Piemēram, šī opcija darbosies:

Savienojums = jauns HTTP savienojums ("www.mysite.ru"); Virsraksti = Jauna atbilstība; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Pieprasījums = jauns HTTP pieprasījums("/api/order_items/93076?order_item=30", galvenes); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Request);

Un droši vien ir diezgan pareizi nodot pašas parametru vērtības pieprasījuma pamattekstā.

Secinājums ir šāds: 1C platforma uzskata, ka PUT pieprasījums bez pamatteksta ir kļūdains un aizstāj metodi ar HEAD.

Interesanti, ka 1C neizseko POST pieprasījumu bez korpusa un nepārvērš to par GET, es to pārbaudīju sava prieka pēc.

Kā no slavenā joku teiktu pazīstamā Vovočka: "Kur ir loģika?"

Es ceru, ka mana publikācija kādam izglābs vairākas dzīves stundas atbildes meklējumos. =)))

Drukāt (Ctrl+P)

Var noskatīties otro daļu

Galvenā informācija

Platformas versijā 8.3.5.1068 , publicēts 2015. gada septembrī, mehānisms 1C integrēšanai ar ārējās programmas izmantojot tehnoloģiju REST interfeiss. Platforma izmanto OData protokolu kā piekļuves protokolu. Tas ir atvērts tīmekļa protokols datu vaicāšanai un atjaunināšanai. Tas ļauj manipulēt ar datiem, izmantojot HTTP komandas kā pieprasījumus. Versijā 8.3.5.1068 atbildes bija iespējams saņemt tikai formātā Atoms/XML . Tomēr, sākot ar izlaidumu 8.3.8.1652 2017. gada augustā, parādījās otra iespēja saņemt datus JSON (JavaScript Object Notation) formātā. . Salīdzinot ar XML, tas ir viegli lasāms cilvēkiem un aizņem mazāk vietas. Turklāt visās pārlūkprogrammās ir iebūvēti rīki darbam ar JSON.

Darbu ar OData protokolu platformā 1C: Enterprise var atrast grāmatas 1C: Izstrādātāja rokasgrāmata 17. nodaļā. Interneta pakalpojumu mehānismi, paragrāfs 17.2.1. Standarta OData interfeiss. Varat arī apskatīt OData protokola atbalsta paplašināšanas piemērus,

Lietošanas priekšrocība REST interfeiss. secina, ka, lai piekļūtu sistēmas datiem no ārējas aplikācijas, nav nepieciešama aplikācijas risinājuma koda modifikācija (piemēram, ja tiek atbalstīts aplikācijas risinājums). Lai iegūtu šo piekļuvi, lietojumprogramma ir jāpublicē tīmekļa serverī noteiktā veidā un jānorāda, kuri konfigurācijas objekti tiks izmantoti šādā veidā. Pēc tam trešo pušu sistēmas var piekļūt jūsu lietojumprogrammai, izmantojot HTTP pieprasījumus.

Standarta OData interfeisa publicēšana tiek veikta, izmantojot publicēšanas dialoglodziņu tīmekļa serverī (Administrēšana - Publicēšana tīmekļa serveris) un aprakstīts grāmatā 1C:Uzņēmums 8.3. "Administratora rokasgrāmata".
Svarīgs! Lai konfigurācijas objekti būtu pieejami, izmantojot standarta OData saskarni, tas ir jāiespējo, izmantojot globālā konteksta metodi Iestatīt standarta interfeisaOdatu() sastāvu.
Mehānismu pieejamo objektu sastāva iestatīšanai, izmantojot standarta OData saskarni, var veikt formā ārējā apstrāde. Tas neprasa modificēt lietojumprogrammas risinājumu.

Lai mijiedarbotos ar ārēju REST tīmekļa serveri no 1C:Enterprise, mēs izmantojam platformā pieejamos rīkus darbam ar HTTP: objektiem. HTTP Connection, HTTPRequest un HTTPResponse.

Šajā rakstu sērijā es parādīšu piemērus tipiskām darbībām, izmantojot atbilstošo HTTP metodi;

  • Datu saņemšanas metode GŪT;
  • Objekta izveide - metode POSTĪT;
  • Atjaunināt datus: metode PLĀKSTS– šajā gadījumā var norādīt tikai tos rekvizītus, kas ir jāatjaunina; metodi PUT– šajā gadījumā ir jānorāda visas entītijas īpašības;
  • Datu dzēšana - metode DZĒST.

1. Datu iegūšanas piemēri. HTTP GET metode

Serveris būs datu bāze, kas publicēta tīmekļa serverī ar nosaukumu WebBuh(Demo datubāze “Uzņēmuma grāmatvedība 3.0”). Kā datu apmaiņas formātu izmantošu JSON formātu. Plašāka informācija par darbu ar JSON ir rakstīta pieejamajā dokumentācijā. Lai saņemtu datus no servera, izmantojot HTTP GET metodi, ir jāizveido objekts JSON lasīšana lai secīgi nolasītu JSON datus no faila vai virknes. Lai organizētu secīgu objektu un tekstu ierakstīšanu serverī, izmantojot metodi HTTP POST PATCH PUT, jums ir jāizveido objekts JSON ieraksts.Ņemiet vērā, ka DELETE metodei nav nepieciešams JSON.

Lai ilustrētu JSON lasīšanas un rakstīšanas plūsmu, piekļūstot REST interfeisam, es izsaukšu šādu pielāgoto funkciju vispārīgs mērķis Zvaniet uz HTTPMethodOnServer :

&Serverī // <Описание функции>// // Opcijas: // - Virkne, kas satur pieprasījuma HTTP metodes nosaukumu ("POST"."PATCH", "PUT" "GET","DELETE" // - HTTP savienojuma objekts //<АдресРесурса>- http resursa virkne, uz kuru tiks nosūtīts HTTP pieprasījums. //<ОтправляемыеДанные>- Struktūra vai atbilstība, kas satur datus, kas nosūtīti uz norādīto adresi apstrādei // serverī, izmantojot norādīto HTTP metodi "POST" vai "PATCH" vai "PUT" // Atgriešanas vērtība: // Servera atbildes struktūra atkarībā no HTTP metode// Funkcija Izsaukt HTTPMethodOnServer(HTTPMethod, HTTP Connection, ResourceAddress, SentData = Nenoteikts ) // Izveidojiet HTTP pieprasījumu Galvenes = new Match(); Virsraksti.Ievietot("Content-Type", "application/json"); HTTP pieprasījums = jauns HTTP pieprasījums ( Resursa adrese, galvenes ); // Rakstiet Json, lai izveidotu un atjauninātu datus Ja HTTPMethod = "POST" vai HTTPMethod = "PATCH" vai HTTPMethod = "PUT", tad JSON ieraksts = jauns JSON ieraksts ; ParametriJSON = jauns ParametriRecordsJSON(Line WrapJSON.Auto,"",True); RecordJSON.SetString(ParametriJSON); WriteJSON(WriteJSON, Nosūtītie dati ); // Nosūtītie datišajā gadījumā ir nepieciešami LineForBody = IerakstītJSON.Aizvērt(); RequestHTTP.SetBodyFromString(StringForBody, TextEncoding.UTF8, UsingByteOrderMark.Neizmantojiet); endIf; // Izsauciet HTTP savienojuma metodi ResponseHTTP = HTTPConnection.CallHTTPMethod(HTTPMethod, HTTPRequest) ; Atbildes struktūra= Jauna struktūra ; Atbildes struktūra.Insert("Statusa kods", ResponseHTTP.StatusCode); // Lasiet JSON tikai GET metodei Ja HTTPMethod="GET" Tad TryReadJSON = NewReadJSON ; ServerResponse = ResponseHTTP.GetBodyAsString("UTF-8"); ReadJSON.SetString(ServerResponse); Atbilstība = ReadJSON(ReadJSON,Tiesa); Atbildes struktūra.Insert("Servera atbilde",Sarakste) ; Atbildes struktūra.Ievietot (" Servera atbilde nav atšifrēta", ServerResponse); Izņēmums Pārskats (kļūdas apraksts()); Atgriezties Undefined; EndAttempt; EndIf ; Atgriezties Atbildes struktūra ; EndFunction // Izsaukt HTTPMethodOnServer()

Lai saņemtu no servera iekšā JSON formātā piekļūstot lietojumprogrammas risinājuma REST interfeisam, ir jānorāda resursa adrese $formāts=json. Vai arī norādiet MIME veidu "aplikācija/json" virsrakstā:

Galvenes = new Match(); Headings.Insert("Content-Type", "aplikācija/json") ; ResourceAddress = " WebBuh/odata/standard.odata/ ?$format=json" RequestHTTP = jauns HTTP pieprasījums (resursa adrese, galvenes);

Globālā konteksta iezīme ReadJSON (ReadJSON, True)

  • Ja otrais parametrs ir iestatīts uz True, nolasiet objektu JSON gadā tiks pabeigts Sarakste Ja iestatīts uz False, objekti tiks nolasīti par objekta tipa Struktūra.
  • Deserializējot JSON objektus struktūrā, jums ir jāapzinās struktūras galvenās prasības. Ja, deserializējot objektu, tiek atrasts rekvizīta nosaukums, kas nav derīgs struktūras atslēgai, tiks izmests izņēmums.

1. 1 HTTP savienojuma parametru konfigurēšana

Lai organizētu klienta daļu mijiedarbībā ar ārējo REST tīmekļa serveri, es no jauna izveidoju klienta konfigurāciju, pamatojoties uz BSP. Izmantojot šo konfigurāciju, es izveidoju atsauci savienojuma parametru iestatīšanai (skat. 1. att.)

1. att. Katalogs parametru iestatīšanai HTTP savienojumam ar ārējo informācijas drošību, izmantojot pārējo interfeisu

Pēc pogas nospiešanas Pārbaudiet servera atbildi, tiek izsaukta procedūra, kurā klients mēģinās saņemt atbildi no servera. Programmas kods Procedūra ir uzrakstīta zemāk:

&OnClient procedūra Check Connection(Command) Adrese = Object.ServerAddress; Lietotājs = Objekts.Lietotājs; Parole = Object.Password; Datu bāzes nosaukums = Objekts.Vārds; Ports =? (Object.Port<>0,Object.Port,80); HTTPSavienojums = jauns HTTP savienojums (adrese, ports, lietotājs, parole); ResourceAddress = DatabaseName + "/odata/standard.odata/ $metadati "; //Zvanīt pielāgota funkcija Atbildes struktūra= B Zvaniet uz HTTPMethodOnServer("GŪT" , HTTP savienojums, resursa adrese) ; Ja Atbildes struktūra <> Undefined Tad General PurposeClientServer.NotifyUser ("Statusa kods"+Atbildes struktūra. Statusa kods); Bezgalīgs; Procedūras beigas

Šīs procedūras mērķis ir pārbaudot servisu un vai lietotājs pareizi ievadījis savienojuma parametrus. Lai to izdarītu, vienkārši izpildiet GET pieprasījumu:
HTTPConnection.CallHTTPMethod( "GŪT", HTTP pieprasījums);
izmantojot resursa adresi:
Resursa adrese =Pamatnosaukums+ /odata/standard.odata/ “;
Varat arī pārbaudīt pakalpojumu savā pārlūkprogrammā, izmantojot
URL
http://host/WebBuh/odata/standard.odata. Šāda vaicājuma rezultāts ir tikai entītiju saraksts. Lai iegūtu pilnu standarta OData interfeisa aprakstu (pieejamo entītiju, to atribūtu un funkciju saraksts XML formātā
dokuments.) jums ir jāveic GET pieprasījums, izmantojot parametru $metadati. URL http://host/WebBuh/odata/standard.odata/$metadata. Detalizēts apraksts Dokumentu var iegūt vietnē http://www.odata.org/documentation/ (angļu valodā).
Jūs varat saņemt atbildes formātā Atoms/XML vai JSON. HTTP atbildes statusa kodus var skatīt Atbildes diapazonos:

  • 100-199 – informatīvas atbildes, kas norāda, ka klienta pieprasījums ir pieņemts un tiek apstrādāts.
  • 200-299 – nozīmē, ka klienta pieprasījums tika veiksmīgi apstrādāts.
  • 300-399 nozīmē, ka pieprasījums netika pabeigts un klientam ir jāveic dažas darbības, lai pieprasījumu apmierinātu.
  • 400-499 – informē par kļūdām klienta lietojumprogrammas pusē. Šie kodi var arī norādīt, ka klientam ir nepieciešama papildu informācija.
  • 500-599 - informē par servera puses kļūdu, norādot, ka serveris ir saskāries ar kļūdu un, visticamāk, nevarēs izpildīt klienta pieprasījumu.

1.2 Objekta meklēšana pēc ID

Nākamā funkcija ir paredzēta, lai meklētu direktoriju vai dokumentu pēc unikāla identifikatora serverī. Ja objekts tiek atrasts, funkcija atgriež identifikatora virknes vērtību (Ref_Key), pretējā gadījumā tā atgriež nenoteikts. Funkcijai tiek nodoti šādi parametri:

  • HTTPSavienojums — HTTP Connection tipa objekts
  • PublicationName — publicētās servera datu bāzes nosaukums
  • Elements - objekta entītijas identifikators, piemēram, Katalogs_Organizācijas vai Document_- organizācijas direktorijs.
  • Identifikators – serverī meklējamā objekta identifikators, piem. Organization.UniqueIdentifier()
&OnServer funkcija SearchObjectByGUID (HTTP savienojums, publikācijas nosaukums, elements, unikālais identifikators) GUID = virkne (unikālais identifikators); // konvertēt uz virkni ResourceAddress = + Element+ "(guid""+ GUID+ "")?$format=json" ; Atbildes struktūra = BZvaniet uz HTTPMethodOnServer("GŪT" , HTTP savienojums, resursa adrese) ; Ja Atbildes struktūra .StatusCode >= 400 Tad //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode+ //GeneralPurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Atgriezties nedefinēts; EndIf ; Atbilstība = Atbildes struktūra. Atbildes serveris a; Masīvs = Atbilst ["vērtība"]; Ja masīvs = Nedefinēts, tad Atgriezties Match["Ref_Key"] Cits Return Array["Ref_Key"]; endIf; EndFunction

Parametrs Resursa adrese izmanto, lai piekļūtu REST pakalpojumam. Lai pārbaudītu pakalpojuma darbību, varat norādīt resursu pārlūkprogrammā šādi

http://(WebServerAddress)/(PublicationName)/odata/standard.odata/(Elements)?(Parametri) , Kur

  • Tīmekļa servera adrese– tā tīmekļa servera adrese, kurā pakalpojums ir publicēts, piemēram, Localhost
  • Nosaukums Publikācijas- Vārds informācijas bāze norādīts, publicējot lēmumu
  • /odata/standard.odata/ – Piekļuves zīme standarta OData interfeisam
  • Elements – resursa identifikators vai iepriekš noteikti resursi. Piemēram, Catalog_Account(guid’value’).
  • Iespējas– resursu parametri. Izmanto, piemēram, atlasei HTTP pieprasījumiem pieņemtajā veidā: ?key=value&key2=value2

1.3 Objekta meklēšana, izmantojot meklēšanas laukus

Sekojošā lietotāja definētā funkcija ir paredzēta, lai meklētu objektu pēc meklēšanas laukiem, ja objekts ir pēc identifikācijas numura. Funkciju objektu virkne Ref_Key —identifikācijas numurs.

&OnServer funkcija P SearchObjectBySearchFields (HTTP Connection, Publication Name, Element, Search Fields) Stāvoklis = "" ; Katrai atslēgas vērtībai no meklēšanas lauka cilpas Stāvoklis = Stāvoklis + KeyValue.Key+ "ekv."" + KeyValue.Value+ "" un "; EndCycle; Pieprasīt tekstu =Lev(stāvoklis, stiprums(stāvoklis)-5); // noņemiet pēdējās 5 rakstzīmes Resursa adrese= Publikācijas nosaukums+ "/odata/standard.odata/" +Element+ "?$filter=" + Pieprasīt tekstu+ "&$format=json& $select=Ref_Key" ; //Izsaukt manu pielāgoto funkciju Atbildes struktūra= Call HTTPMethodOnServer( "GŪT",HTTPConnection,ResourceAddress); Ja Atbildes struktūra .StatusCode >= 400 Tad //General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Atgriezties nenoteikts; endIf; Atbilstība = Atbildes struktūra. Atbildes serveris a; Masīvs = Atbilst ["vērtība"]; Ja masīvs = Nedefinēts, tad Atgriezt atbilst ["Ref_Key" ] Citādi Return Array ["Ref_Key"]; endIf; EndFunction

Kā redzams no procedūras korpusa P searchObjectBySearchFields, atlase sākas ar atslēgvārdu$filtrsresursa adresē. Formālais parametrsMeklēšanas lauki -šī ir sarakste, kurā ir detaļu nosaukumi un vērtības.

Lūdzu, ņemiet vērā, ka detaļu nosaukumi dažkārt nav acīmredzami. Jāatceras, ka atsauces grāmatām:

  • Kods - kods,
  • Apraksts - Vārds
  • deletionMark — dzēšanas atzīme,
  • IsFolder - grupas zīme,
  • Parent_Key — vecāks.
  • Ja atribūtam ir atsauces veids, tā nosaukumam jāpievieno sufikss _Key, piemēram, Account_Key.

Dokumentiem:

  • Numurs – dokumenta numurs,
  • Datums – dokumenta datums.

Loģiskās atlases darbības

  • eq — vienāds; /Catalog_Cities?$filter=Nosaukums eq ‘Galvenais’;
  • ne - nav vienāds; /Catalog_Cities?$filter=Nosaukums ne ‘Perma’;
  • gt — vairāk; /Katalogs_Produkti?$filter= Cena gt 10;
  • ge — lielāks vai vienāds ar; /Catalog_Products?$filter=Cena ge 10;
  • lt — mazāk; /Katalogs_Produkti?$filter=Cena lt 10;
  • le — mazāks par vai vienāds ar; /Catalog_Products?$filter=Cena le 10;
  • vai - loģisks VAI; /Katalogs_ Produkti ?$filter= Cena lt 10 vai cena gt 100;
  • un - loģiskais UN; / Katalogs _Produkti?$ filtrs =Cena g t 10 un Cena l t 100;
  • nav - noliegums; /Katalogs_ Produkti ?$filter=not (Price eq 10);

Ņemiet vērā arī to, ka faktiskā parametra vērtība Elements(vai entītija)), ko es nododu funkcijai tiek veidota saskaņā ar šādu noteikumu:

Name Prefix_ConfigurationObjectName_Name Sufikss.

Izmantojot standarta OData saskarni, varat piekļūt šādiem objektiem ( Vārda prefikss):

  • Katalogs - Katalogs;
  • Dokuments - dokuments;
  • Dokumentu žurnāls - DocumentJournal;
  • Constant - Constant;
  • Apmaiņas plāns - ExchangePlan;
  • Kontu plāns - kontu diagramma
  • Aprēķinu veidu diagramma - ChartOfCalculationTypes;
  • Raksturīgo tipu diagramma - ChartOfCharacteristicTypes;
  • Informācijas reģistrs - Informācijas reģistrs;
  • Uzkrāšanas reģistrs - Uzkrāšanas reģistrs;
  • Aprēķinu reģistrs - Aprēķinu reģistrs;
  • Grāmatvedības reģistrs - Grāmatvedības reģistrs;
  • Biznesa process - BusinessProcess;
  • Uzdevums - Uzdevums.

ConfigurationObjectName- konfigurācijas objekta rekvizīts “Nosaukums”, kā tas norādīts konfiguratorā.

Vārda sufikss- nepieciešams, lai precizētu resursa nosaukumu, pēc izvēles, var būt šādas vērtības:

  • Objekta tabulas daļas nosaukums;
  • Vārds virtuālais galds objekts;
  • RowType - objekta tabulas daļas rinda;
  • RecordType - atsevišķs reģistra ieraksts.

Parametri piekļuvei resursiem

Pēc resursa nosaukuma izveidošanas jums ir jādefinē parametri piekļuvei resursam, piemēram, ?$filtrs= Nozīme &$ formātā=json& $select= Ref_Key ,

  • $filtrs- atlase, saņemot datus
  • $ formātā- norāda atgriezto datu formātu,
  • $select- entītijas rekvizītu uzskaitījums, kas tiks iekļauts vaicājuma rezultātā;
  • $metadati- atgriež standarta OData interfeisa aprakstu (izmanto, nenorādot vārda sufiksu, piemērs vienā no iepriekš redzamajiem attēliem);
  • $top- ierobežojot atgriezto ierakstu skaitu;
  • $izlaist- no vaicājuma rezultāta noņem norādīto ierakstu skaitu;
  • $count- atgriež ierakstu skaitu vaicājuma atlasē;
  • $inlinecount=visa lapa(=nav)- vaicājuma rezultātam pievieno informāciju par ierakstu skaitu
  • $orderby=<Реквизит1>asc,<Реквизит2>desc- vaicājuma rezultātu kārtošana
  • tikai atļaut- tikai atļautie (izmanto bez “$” zīmes).

1.4. Iegūstiet virkni informācijas reģistra ierakstu

Apskatīsim piemēru reģistra ierakstu masīva iegūšanai informācijai par personu pilniem vārdiem, piemēram, pilno vārdu izmaiņu vēsturi. individuāls

Nosaukums Publikācijas = "WebBuh"; Element = "Informācijasreģistra_nosaukums personām"; Periods = nenoteikts; Atsauces tipa dati= jauna struktūra(); D DataReferenceType.Insert("Individual",Individual_Key); DataNON-ReferenceType= jauna struktūra(); DataNON-ReferenceType.Insert("Individuālais_tips", "StandartaODATA.Katalogs_Individuāli") Masīvs = GetRegisterInfoSet(HTTPConnection,PublicationName,Element,Period, DimensionsReferenceType, Izmēri, kas nav atsauces tipa izmēri)

Šajā piemērā izsauktās funkcijas GetInfoRegisterRecordSet pamatteksts ir parādīts zemāk

&OnServer funkcija GetSetRecordRegisterInformation(HTTPConnection,PublicationName,Element,Period =Nav definēts, DimensionsReferenceType= Nedefinēts Izmēri, kas nav atsauces tipa izmēri= Nedefinēts) RequestText = "" ; Ja Periods<>Undefined Tad FormattedPeriod= Formāts (Periods,"DF=gggg-MM-ddTHH:mm:ss"); RequestText = "Periods = datetime"" + FormattedPeriod + """ ; endIf; Ja DimensionsReferenceType <>Undefined Tad par katru KeyValue Of DimensionsReferenceType Cikla barošana = ? ( ValueFilled(QueryText), "," ,""); RequestText = RequestText+ Ieslēgts + KeyValue.Key+ "=guid(""+ KeyValue.Value+ "")"; EndCycle; EndIf; If Izmēri, kas nav atsauces tipa izmēri<> Undefined Tad Katrai atslēgas nozīmei Izmēri, kas nav atsauces tipa izmēri Cikls Jautāja =? ( ValueFilled(QueryText), "," ,""); QueryText = QueryText + Fed+ K taustiņšNozīme.Taustiņš + "=" + KeyValue.Value; EndCycle; endIf; ResourceAddress=Publikācijas nosaukums + " /odata/standard.odata/" + Elements + "("+ Vaicājuma teksts + + ") ?$format=json"; //Izsaukt manu pielāgoto funkciju Atbildes struktūra = Zvaniet uz HTTPMethodOnServer("GET", HTTP savienojums, resursa adrese); Ja Atbildes struktūra.StatusCode >= 400 Tad//General PurposeClientServer.NotifyUser(Element+ "Error"+ResponseStructure.StatusCode); //General PurposeClientServer.NotifyUser(ResponseStructure.ServerResponseUndecrypted); Atgriezties nenoteikts; endIf; Atbilstība = 0

Sākot ar platformas otro versiju 8, lietotājiem un izstrādātājiem ir iespēja izmantot http pieprasījumu tieši 1C. Programma atbalsta divu veidu pieprasījumus:

  • POST pieprasījumi;
  • IEGŪT pieprasījumus.

Tādējādi tika izveidots diezgan ērts rīks datu apmaiņai un mijiedarbībai ar tīmekļa pakalpojumiem un pakalpojumiem, kas darbojas, izmantojot http.

SAŅEMT pieprasījumu

Protams, vienkāršākie vaicājumu izmantošanas piemēri daudz labāk ilustrē to iespējas nekā daudzas apraksta rindas. Tātad, mēģināsim:

  1. Iegūsim mūsu vietnes galvenās lapas pamattekstu;
  2. Mēs strādāsim pie pieprasījuma novirzīšanas;
  3. Ņemsim attēlu no vietnes.

Vietnes pamatteksta iegūšana

Sāksim ar kaut ko vienkāršu. attēlā..

Šīs koda sadaļas izpildes rezultāts ir diezgan liels teksts, kura pēdējā sadaļa ir parādīta 2. attēlā.

2. att

Pirmajā koda rindā mēs izveidojam savienojuma objektu ar http resursu. Objektam var būt šādas īpašības:

  • Serveris - savienojuma virkne, kas satur servera adresi;
  • Ports – satur skaitli, kas norāda servera portu; pēc noklusējuma atkarībā no savienojuma veida varat norādīt 80 nedrošiem savienojumiem vai 443 SSL aizsargātiem savienojumiem.
  • Lietotājvārds – norāda, ja nepieciešama autorizācija serverī;
  • Parole – lietotāja parole norādītajā resursā;
  • Starpniekserveris – var saturēt InternetProxy tipa objektu, kas norādīts, kad saziņai ar serveri tiek izmantots starpniekserveris;
  • Drošs savienojums — noklusējuma vērtība ir FALSE, pārslēgšana uz TRUE norāda uz https protokola izmantošanu.

Turklāt HTTPConnection objektam ir savas metodes, kuru izsaukšana ļauj pilnīgāk aprakstīt apdarinātāja izpildes algoritmu:

  • CallHTTPmethod – satur divus obligātos parametrus, HTTPmethod un HTTPrequest, atbalsta iespēju rakstīt atbildes pamattekstu trešajā parametrā norādītajā failā;
  • Rakstīt – izmantojot PUT pieprasījumu, nosūta datus uz serveri;
  • Modificēt – pārveido objektu, apstrādājot PATCH pieprasījumus;
  • SendForProcessing – metodei, kas norāda uz POST pieprasījuma izmantošanu, tāpat kā visās iepriekšējās metodēs, jāsatur pieprasījuma teksts, kā arī var pārsūtīt atbildes faila adresi datu ierakstīšanai;
  • Saņemt - tas tiks apspriests sīkāk tālāk;
  • GetHeadings ir vēl viena metode, kas tiks izmantota rakstā;
  • Dzēšana faktiski ir Delite pieprasījums, kas no servera noņem pieprasījumā nodoto resursu.

Otrajā rindā mēs izveidojam pieprasījumu atlasītajai vietnei, mūsu pieprasījuma teksts satur vienu slīpsvītru, kas nozīmē, ka mēs vēlamies saņemt mājas lapa. Ja slīpsvītrai sekotu kāda izteiksme, piemēram, “page2” vai “news”, mēs iegūtu citu lapu.

Trešā rinda izpilda mūsu pieprasījumu serverim.

Ceturtajā rādām rezultātu.

http pieprasījuma pāradresācijas apstrāde

Iedomāsimies situāciju, kad mums programmatiski jāiegūst meklēšanas rezultāts, izmantojot jebkuru meklētājs ar taustiņu “Pieprasījumi 1 s”. Koda sadaļa, kas nepieciešama, lai piekļūtu GOOGLE, ir parādīta 3. attēlā

3. att

Šeit papildus mums jau pazīstamajām struktūrām ir galvenes un statusa kods. Tiksim ar viņiem galā.

Statusa kods – standarta vērtība, kas norādīta sadaļā “Pieprasījums komentēt”, var būt šādas vērtības:

  1. Ja viss ir kārtībā, vērtība atgriezīsies diapazonā no 100 līdz 299;
  2. Pāradresācijas gadījumā tiks atgriezts kods diapazonā no 300 līdz 399, mūsu gadījumā veiksmīgu pastāvīgu novirzīšanu uz kādu resursu noteiks kods 301;
  3. Ja pieprasījumā ir kļūdas, parametrs saņems vērtību no 400 līdz 499;
  4. Vērtība diapazonā no 500 līdz 599 norāda uz problēmām ar serveri.

Katrai lapai ir virsraksts, kura tekstā var atšķirt vairākus parametrus (4. att.):

  1. Savienojuma shēma (viss, kas ir pirms divām slīpsvītrām “//”);
  2. Adreses josla savienojumi;
  3. Lietotājvārds un parole;
  4. Ports un resursdators, ar kuru izveidot savienojumu.

Tieši šo sadalīšanu veic funkcija SplitAddressLine. Tā saņēmusi jauna adrese, mēs varam saglabāt lapu savā datorā un atvērt to noklusējuma pārlūkprogrammā (GetPage procedūra).

5. att

Šeit nav jaunu funkciju vai veidu, kā strādāt ar pieprasījumiem, mēs faktiski veidojam Teksta dokuments no vietnes pamatteksta un palaidiet lapu pārlūkprogrammā.

Mēs ievietojam failu diska D saknē un saucam to par testu.

Mēs ņemam attēlu no vietnes

Rodas dabisks jautājums: ja mums nav vajadzīga visa vietne, bet jāiegūst tikai atsevišķi tās elementi, vai to var izdarīt un kā? Jā tu vari. Programmas kods, kas ļauj to izdarīt, parādīts 6. att

6. att

Kā redzams attēlā, pieprasījuma pamattekstā mums ir jāsaņem vietnes struktūras elementa kods. Šī daļa nebija mūsu iepriekšējā aprakstā, un mums ir jāpakavējas pie šī punkta sīkāk.

Mēs izmantojām pārlūkprogrammu Opera, lai piekļūtu vietnei. Tam ir viens mums svarīgs rīks: ar peles labo pogu noklikšķinot uz elementa, varat izsaukt konteksta izvēlni, kuras viens no vienumiem ir “Skatīt elementa kodu”.

Pateicoties viņam, mēs varam iegūt adresi, kas tiks izmantota pieprasījumā 7. att.

POST pieprasījums

Atšķirībā no vienkāršiem Get pieprasījumiem, POST http pieprasījumiem ir teksta pamatteksts, ko var saglabāt kā parasto teksta forma, un failu veidā ar paplašinājumu xml, soap, json. Tīklā ir diezgan daudz rīku, lai izveidotu pieprasījumu tekstus, kas ļauj atkļūdot un uzraudzīt noteiktu pieprasījumu izpildi.

1C, lai palaistu pieprasījumu ar noteiktu tekstu, HTTP pieprasījuma objektam ir procedūra SetBodyFromString.