Ako funkcija implementira web. Rješavanje problema dugotrajnih operacija i interaktivnog prikaza statusa operacije u toku u PHP-u

25.06.2023

Alexey Bagryantsev 3. oktobar 2012

U procesu rada više puta smo se susreli sa problemom izbora rješenja za određeni problem. Ponekad možete, bez mnogo boli, prihvatiti najočitiju i uobičajenu metodu, kako kažu, „rešavanje stvari direktno“. U većini slučajeva, ovaj pristup će dati rezultate na ovaj ili onaj način, ali može zahtijevati značajna mentalna i vremenska ulaganja od vas.

Stoga, u situaciji u kojoj ste suočeni s nestandardnim zadatkom, možda je vrijedno odmaknuti se od uobičajenih metoda i pokušati razmotriti nekoliko opcija, čak i ako u početku ne izgledaju vrlo uspješne ili jednostavno nerado pribjegavate njima, jer „mi to obično ne radimo“. Ovdje je glavna stvar da se ne bojite eksperimentirati, testirati svaku metodu i na kraju odabrati onu najprikladniju koja zadovoljava sve vaše potrebe i daje traženi rezultat.

Mi, programeri, često se suočavamo sa takvim problemima. O jednom tako složenom i dugotrajnom problemu, koji je zahtijevao korištenje nekoliko pristupa za njegovo rješavanje, biće riječi u nastavku.

Pozadina

Na jednom od PHP projekti srednje veličine bilo je problema povezanih sa izvođenjem teških operacija i interaktivnim prikazivanjem statusa operacije koja se izvršava. Osim što je blokirao izvršenje drugih zahtjeva i klikao na druge linkove portala, korisnik je bio u mraku i nije imao pojma šta se dešava u trenutno vrijeme kada će se operacija završiti, možda je došlo do greške itd. Projekat je u početku imao eksperimentalni status, zahtjevi za faze koje se izvode često su se mijenjali u hodu, mijenjali su se prioriteti i vektor razvoja sistema. Da formiram bolju ideju, želio bih opisati niz tehnologija korištenih na projektu:

  • MVC Framework CakePHP 2.1 (PHP5.3);
  • MySQL;
  • jQuery, jQuery UI, jQuery dodaci;
  • Selenium server, Snoopy simulator pretraživača na strani servera;
  • IMAP server, itd.

As operativni sistem je izabran: CentOS

Izbor okvira određen je iskustvom njegovog korištenja od strane razvojnog tima, dok je izbor MySQL relacionog DBMS-a kao skladišta podataka prilično standardno rješenje i posljedica je stabilnosti i raširene upotrebe ovog DBMS-a kao skladišta podataka. “motor”.

U fazi projektovanja sistema, odmah je bilo teško predvideti da će se u sistemu pojaviti veoma „teške“ operacije, čiji će proces izvršenja morati da se revidira, implementiraju dodatne komponente i generalno redizajnira arhitektura aplikacije. Pored toga, sistem je bio svojevrsni prototip, gde su se zahtevi često menjali, kao i gde će sistem rasti u budućnosti.

U jednoj fazi implementiran je niz operacija koje su se ispostavile kao prilično „teške operacije“ i ne samo da su blokirale izvršavanje drugih operacija u okviru iste sesije, već je generalno proces navigacije kroz sistemske veze postao nemoguć sve do “teška” operacija nije završena. Kada se problem pogleda na nižem nivou, ispostavilo se da je svaki zahtjev zaključavao datoteku sesije kada je otvorena, odnosno dok se operacija potpuno ne završi i proces isprazni podatke sesije u datoteku sesije i oslobodi je otpuštanjem zaključati, ostali zahtjevi će strpljivo čekati u redu. Zaista, PHP podrazumevano koristi datoteku kao mehanizam za skladištenje sesije. Kada se sesija otvori, aktivira se funkcija poput fopen() koja zaključava datoteku za čitanje i pisanje za druge procese. Odluka da se promijeni pohrana sesije radi uklanjanja zaključavanja se odmah nameće, ali o tome ćemo kasnije.

Prilazi

  1. Rastavljanje operacije na korake
  2. Ajax Polling
  3. Long Polling
  4. Zauvijek okvir
  5. Streaming
  6. Comet-server
  7. Web-utičnice

Razmotrimo ukratko svaki od ovih pristupa za rješavanje problema obavljanje teških operacija i interaktivno obavještavanje korisnika o napretku.

Rastavljanje operacije na korake

Prva stvar koja vam pada na pamet je da operaciju podijelite na korake. Nakon što završi sljedeći korak i pošalje odgovor korisnikovom pretraživaču, on sam pokreće sljedeći korak slanjem odgovarajućeg Ajax zahtjeva serveru.

U tekućem projektu ovaj pristup pokazalo se ne baš uspješnim zbog činjenice da su teške operacije bile praktično nedjeljive na korake. Osim toga, korišteni su servisi trećih strana koji su bili pokrenuti na serveru, za rad sa kojima je bilo potrebno kreirati i pripremiti odgovarajuće objekte tokom izvršavanja zahtjeva. Nakon izvršenja zahtjeva, koji je bio predstavljen 1 korakom operacije, objekti su "zakovani". Možda smo trebali razmišljati o njihovoj ponovnoj upotrebi, ali nismo stigli do toga.

Ajax Polling

Sljedeće rješenje koje vam pada na pamet je da pokrenete operaciju na serveru i stalno anketirate server o statusu operacije u toku slanjem niza Ajax zahtjeva u određenim intervalima. Na klijentu možete analizirati takav odgovor servera (na primjer, to može biti JSON koji sadrži “poruku”, “postotak”, “grešku” i “preusmjeravanje”) i nacrtati traku napretka koja prikazuje status trenutne operacije.

Bilo je pokušaja da se pristup anketiranju koristi na projektu sa dva na različite načine pohranjivanje rezultata operacije:

    Pohranjivanje rezultata izvršenja u fajl – +.txt

    Pohranjivanje rezultata u bazu podataka, u odgovarajuću tabelu – operacije velike_težine

Korisnik je pokrenuo operaciju koristeći ajax zahtjev, nakon čega je klijentska skripta periodično ispitivala server i primala status i napredak trenutne operacije - /operations/get_status/ .

Ali naišli smo na sljedeći problem: pokrenuta je dugotrajna operacija, ali je blokirala datoteku sesije, čime je eliminirana mogućnost izvršavanja paralelnih zahtjeva unutar iste sesije. Drugim riječima, nakon pokretanja dugotrajne operacije, svi zahtjevi koji prozivaju server otišli su u red čekanja i čekali trenutak kada glavni zahtjev oslobodi datoteku sesije.

Prvo rješenje problema bilo je oslobađanje datoteke sesije. Da bi to uradio, PHP obezbeđuje funkciju - session_write_close(), pomoću koje možete zatvoriti sesiju snimanja. Zaista, možete pokrenuti operaciju, pročitati podatke o sesiji, napraviti promjene u njima i zatvoriti sesiju radi pisanja.

Ali u stvarnosti projekta, uzimajući u obzir uspostavljenu arhitekturu, ovu odluku nije uspio primijeniti. Snimanje sesije je bilo potrebno na mnogim lokacijama tokom dugotrajne operacije. Štaviše, takvo rješenje se ne može nazvati „čistim“, jer korisnik će možda morati da "putuje" po lokaciji ili paralelno izvodi drugu tešku operaciju. Stoga je bila potrebna alternativa.

Rješenje je bilo promijeniti Session Storage, što je osiguralo rad sa sesijom bez blokiranja prilikom otvaranja. Možete odabrati jednu od sljedećih opcija kao novu pohranu sesije:

  • MySQL Database;
  • MongoDB;
  • Memcached;

Da biste promijenili Session Storage u PHP-u postoji funkcija - session.save_handler(), koji postavlja prilagođene funkcije skladištenje sesije. Koriste se za pohranjivanje i preuzimanje podataka povezanih sa sesijom. Možete pronaći mnoge primjere njegove upotrebe na Internetu, već postoje implementirane klase koje služe za prijenos sesije u bazu podataka ili memcached.

Napomena: Da bi funkcija radila, morate postaviti opciju session.save_handler u značenju korisnik u vašem konfiguracionom fajlu php.ini.

Projekat je koristio skladištenje sesija u mysql i mongodb kao eksperiment.

Napomena: Ako vam je potreban parametar koji je upravo upisan u sesiju da bi bio dostupan za druge zahtjeve, tada se sesija mora “isprazniti” u mysql ili mongodb da bi funkcija snimanja sesije radila. Da biste to učinili, morate ga zatvoriti radi snimanja i ponovo ga otvoriti:

Javna funkcija session_flush() ( session_write_close(); session_start(); )

Nakon implementacije odgovarajućih komponenti, sesija više nije bila blokirana i dozvoljeno je da se više zahtjeva povezanih s istom sesijom obrađuje istovremeno. Sada ne "gubi" ( lock), kao što je bio slučaj s datotekama, prilikom otvaranja datoteke pomoću funkcije fopen, plus brzina sesije se značajno povećala.

Napomena: Za upotrebu mongodb u PHP-u morate instalirati mongodb kao servis, kao i drajver za rad u PHP-u.

Primjer instalacije na CentOS :

  1. Kreirajte spremište

/etc/yum.repos.d/10gen.repo

  1. Ispunite sadržajem (ovisno o dubini bita OS)

name=10genRepository

baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64

  1. Zovi
  1. Sledeći

yum instaliraj mongo-10gen mongo-10gen-server

  1. Pokrenite "demon"

servis mongod start

  1. Instalirajte drajver

yum -y instalirati php-devel

sudo pecl install mongo

extension=mongo.so

Nakon toga možete bezbedno koristiti mongodb.

Kao primjer, prilažem popis CakePHP komponenti za prijenos Session Storage i MongoDB

Mongo = novi Mongo($connection_string);<= 3) { $this->/* indeksi */ $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)->ensureIndex("id", array("id" => 1));

$this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)->ensureIndex("id", array("id" => 1, "expires" => 1)); // Registrirajte ovaj objekt kao rukovalac sesije if ($this->forceSaveHandler) ( session_set_save_handler(array($this, "open"), array($this, "close"), array($this, "read"), array($this, "write"), array($this, "destroy"), array($this, "gc") ) $this->_timeout = Configure::read("Session.timeout") * 60;

Napomena) javna funkcija __destruct() ( pokušaj ( $this->mongo->close(); session_write_close(); ) catch (Izuzetak $e) ( ) ) javna funkcija open() ( vrati true; ) javna funkcija close() ( $probability = mt_rand(1, 150); gc();) return true;

) javna funkcija read($id) ( $cursor = $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)->find(array("id" => $id)); ako ($cursor->count() == 1) ( $cursor->next(); ) else (vrati false; ) $result = $cursor->current() if (!empty($result) && isset(); $result["data"])) ( return $result["data"]; ) ) javna funkcija write($id, $data) ( if (!$id) ( return false; ) $expires = time() + $this->_timeout = array("id" => $id, "data" => $data, "expires" => $options = array("safe" => true, "fsync); " => true,); $collection = $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION); ->findOne($filter) == null) (vrati $collection->insert (am(array("_id" => new MongoId($id)), $session), $options ) else (vrati $collection ->update($filter, array("$set" => $session)); , am($options, array("upsert" => false)) ) ) javna funkcija uništi($id) (vrati $this- >mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)-> remove(array("id" => $id), true);

Također možete dodati zaštitu za broj istovremenih zahtjeva unutar jedne sesije. U našem projektu to je uradila posebna komponenta odgovorna za teške operacije uopšte - HighWeightedOperationsComponent.php, koja je pratila broj operacija pokrenutih unutar jedne sesije i, u zavisnosti od podešavanja, dozvoljavala pokretanje strogo definisanog broja operacija.

rezultat:

    Promijenjeno skladište sesije. Nema više zaključavanja sesije.

    Ajax zahtjev za pokretanje operacije se pokreće na klijentu.

    Implementiran je niz Polling zahtjeva za ažuriranje statusa i trake napretka.

    Stvorena je komponenta upravljanja “teškim operacijama”.

Dugo glasanje

Pristup je sličan prethodnom, ali postoji značajna razlika: u prvom slučaju klijent sam proziva server za promjene, u istom slučaju se uspostavlja kontinuirana veza sa serverom i sam server signalizira pojavu promjene. Prednost ovog pristupa je smanjenje prometa između klijenta i servera.

Princip: klijentska skripta kontaktira server i kaže: „Ako imate podatke, spreman sam da ih preuzmem odmah, a onda ću se ponovo povezati.“ U nekim implementacijama servera postoji baferovanje, kada server ne šalje odmah podatke, već čeka: šta ako se sada pojavi nešto drugo, onda ću poslati sve odjednom. Ali takvo baferovanje je štetno, jer dovodi do kašnjenja, a mi to želimo da postignemo maksimalna brzina! Nakon prijema podataka, pretraživač bi trebao ponovo otvoriti novu vezu. Trajanje takve veze može se mjeriti satima, ali to je u teoriji. Obično je vrijeme mnogo manje, a maksimum doseže 5 minuta, nakon čega se jednostavno stvara nova veza. To je učinjeno jer serveri ne vole tako dugotrajne sesije, a sam HTTP protokol nije baš pogodan za takvu upotrebu.

Ovaj pristup nije korišten u projektu, ali je bilo diskusija.

Zauvijek IFrame

Ukratko: Na stranici se kreira skriveni iFrame koji postepeno prikazuje informacije o napretku operacije ili izvršava java skripte. Ali za ovo, HTTP server i PHP moraju biti konfigurisani tako da mogu vraćati podatke po komadima tokom operacije. O tome se detaljno govori u sljedećem paragrafu.

Dakle, pokrećemo operaciju preko iFrame elementa skrivenog na stranici. Na serveru, operacija izdaje poziv podataka po komadima i odmah šalje odgovor klijentu, IFrame pokušava izvršiti poslani odgovor:

Streaming

Pristup je eksperimentalno korišten na projektu.

Pojavila se ideja, šta ako pokušamo da pokrenemo izvršenje operacije sa ajax pozivom, a na serveru dajemo (stream) podatke klijentima deo po deo. Tada će se, možda, na klijentu, svaki put kada se primi sljedeći podatak, pokrenuti neki događaj prema kojem možemo ažurirati odgovarajući blok i prikazati status izvršenja.

Prvo smo morali pronaći i primijeniti odgovarajuća podešavanja za Apache server i PHP, što je dovelo do pretraživanja informacija na Internetu i niza testova. Kao rezultat, postavke izgledaju ovako:

Javna funkcija pripremi() ( // Isključi baferiranje izlaza ini_set("output_buffering", "off"); // Isključi kompresiju PHP izlaza ini_set("zlib.output_compression", false); // Implicitno isprazni međuspremnik(e) ini_set("implicit_flush", true ob_implicit_flush(true) // Očistite i isključite baferovanje dok (ob_get_level() > 0) ( // Dobijte trenutni nivo $level = ob_get_level(); // Završite baferovanje); ob_end_clean( // Ako se trenutni nivo nije promijenio, prekinuti if (ob_get_level() == $level) break ) // Onemogući apache izlazni bafer / kompresiju if (function_exists("apache_setenv")) ( apache_setenv("no); -gzip", "1"); apache_setenv("dont-vary", "1"); ) )

Napisana je komponenta koja u potpunosti implementira ovaj pristup. No, nakon dublje analize, pokazalo se da ovaj pristup nije primjenjiv, jer nema događaja na klijentu koji signaliziraju da je sljedeći dio podataka stigao iz prethodno poslanog ajax zahtjeva. Po događaju onSuccess Podaci stižu u cijelosti.

Comet server

Prema Wikipediji, Comet je bilo koji model web aplikacije u kojem trajna HTTP veza omogućava web serveru da šalje podatke pretraživaču bez dodatnog zahtjeva od pretraživača.

Zajednička karakteristika ovih modela je da su svi bazirani na tehnologijama koje direktno podržava pretraživač (na primjer, JavaScript), a ne na vlasničkim dodacima.

On ovaj projekat došlo je do pokušaja korištenja implementacije Comet servera Dklab Realplexor .

Dklab Realplexor je Comet server koji vam omogućava da istovremeno držite stotine hiljada dugotrajnih otvorenih HTTP veza sa korisničkim pretraživačima. JavaScript kod koji se pokreće u pretraživaču pretplaćuje se na jedan ili više Realplexor kanala i dodeljuje rukovaoca za prijem podataka. Server može u bilo kom trenutku da upiše poruku na jedan od ovih kanala, a ona će odmah biti prosleđena svim pretplatnicima (najmanje jednom, najmanje hiljadu), u realnom vremenu i uz minimalno opterećenje servera.

Web-utičnice

Razgovaralo se io mogućnosti korištenja WebSockets-a. Ali mi smo napustili ovaj pristup zbog „nepodržavanja“ starijih pretraživača.

WebSocket je full-duplex komunikacioni protokol preko TCP veze dizajniran za razmjenu poruka između pretraživača i web servera u realnom vremenu.

rezultat:

Kao rezultat toga, zadatak je implementiran korištenjem pristupa Polling, sa sesijama prebačenim u MongoDB. Ali naknadne rasprave, povećanje broja „teških“ zadataka i njihove složenosti doveli su do upotrebe standardnijeg i pouzdanijeg rješenja - implementacije reda izvršenih zadataka pomoću CRON planera. Zaista, nakon provjere svih prava na operaciju izvršavanja, možemo spremiti njen kontekst u bazu podataka (cron_taks tabela), nakon što smo je prethodno serijalizovali. Na serveru će se u određenim vremenskim intervalima pokretati CRON shell, koji će preuzeti sljedeći zadatak iz reda čekanja, promijeniti njegov status u IN_PROGRESS i prenijeti ga odgovarajućem rukovaocu (TaskDispatcherComponent). Rukovalac će uzeti deserializirani kontekst zakazanog zadatka i izvršiti ga u zasebnom procesu. Svi modeli i komponente sistema su mu dostupni. Da biste odredili status zadatka koji se izvršava, možete koristiti pristupe Polling i LongPolling, a također organizirati pregled vašeg reda zadataka na zasebnom ekranu. Ovaj pristup se pokazao pouzdanijim i razumljivijim, iako zahtijeva određene arhitektonske promjene u sistemu.

Dakle. Kod metode svake ws-operacije nalazi se u modulu web usluge kojem ova ws-operacija pripada. Modul web usluge se izvršava samo na Serveru.

Napomena 1: Nema smisla pisati kompilacijske direktive &Na serveru, &Na klijentu i drugima.

Za svaki poziv web operacije kreira se zasebna sesija s info bazom, tako da se svaki put kada se pozove web operacija inicijaliziraju parametri sesije. Inicijalizacija parametara sesije se dešava u modulu sesije u proceduri "SettingSessionParameters".

Napomena 2: Ne opterećujte ovu proceduru nepotrebnim koracima.

Lično, ja sam za dato u proceduru Prilikom prvog poziva inicijaliziram samo najčešće korištene parametre sesije. I samo ako su potrebni drugi parametri sesije, kada se ponovo pozovu, obrađujem navedene parametre.

Procedura SettingSessionParameters(SessionParametersNames)

//suština promjena je da ih dobijete odmah važnih parametara, a ako trebate više parametara, koristite BSP podsistem

Ako SessionParameterNames=Nedefinirano onda

Zahtjev = Novi zahtjev;

Request.Text =

"ODABIR VRH 1

|OD

|Directory.Users AS Korisnici

|WHERE

|Users.IBUserIdentifier = &IBUserIdentifier";

IBUserIdentifier = Korisnici baze podataka.TrenutniUser().UniqueIdentifier;

Request.Parameters.Insert("IB UserIdentifier", IBUserIdentifier);

ResultUsers = Query.Run();

SelectDetailRecords = Query.Run().Select();

Dok SelectDetailRecords.Next() Loop

SessionParameters.CurrentUser = SelectionDetailedRecords.Link;

EndCycle;

SessionParameters.CurrentAccount = SessionParameters.CurrentUser.Account;

Inače

StandardSubsystemsServer.SettingSessionParameters(SessionParametersNames);

endIf;

Kraj procedure


Ako pročitate članak 1C:Enterprise 8. Web usluge. Implementirajući vlastiti web servis, primijetili ste da se u stablu metapodataka parametar ws operacije zove “Param”, a u metodi koja ga implementira zove se “Parameter”. Činjenica je da ime operanda u metodi ws-operacije nije bitno. 1C zamjenjuje operande onim redoslijedom kojim su navedeni u stablu metapodataka ws-operacije. Na primjer, imamo operaciju Primjer1, u konfiguratoru smo naznačili da operacija ima dva parametra “param1” i “param2” i kreirali proceduru koja izlazi “param2”.

Ako nazovemo ws operaciju Primer1 i prosledimo param1=1, param2=2 kao parametre, onda će rezultat biti 2.

Ali ako promijenimo redoslijed operanada u konfiguratoru:

Tada će isti poziv vratiti 1.

Napomena 3: nakon promjene redoslijeda parametara ws operacije, ne zaboravite promijeniti njihov redoslijed u zaglavlju funkcije koja implementira ovu operaciju.

Napomena 4: Možete koristiti imena različita od onih navedenih u konfiguratoru kao operande ws operacije.

Ako neki od parametara ws operacije imaju označeno polje za potvrdu „Moguće prazna vrijednost“, tada ovaj parametar možda neće biti specificiran kada se pozove, ali ovdje postoji nekoliko nijansi. Kada koristite klijenta, na primjer SoapClient, prilikom prosljeđivanja parametra, ne možete jednostavno uzeti parametar i uopće ne specificirati parametar. na primjer:

$a=$client->Plus2();


Ova linija će uzrokovati grešku " Nepoznata greška. Nema dovoljno parametara operacije." To jest, sam parametar mora biti proslijeđen, specificirajući null vrijednost:

$zz=array("Param"=>null);

$a=$client->Plus2($zz);

Ali onda se postavlja pitanje kako će se ovaj prazan parametar prenijeti u 1C. Logično je da 1C programer želi da uradi sledeće u metodi rada na webu:

Funkcija Plus2(Parametar=0)

Povratni parametar+2;

EndFunction

To jest, naznačite vrijednost operanda ako nedostaje.

Sada trebamo pozvati našu web operaciju s praznom. Navest ću primjer xml sapunice sa nultom vrijednošću.


xsi:nil="true" - označava da ovaj parametar nema vrijednost. Da biste mogli specificirati null, morate dodatno povezati prefiks xsi s prostorom imena:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".


Ali ako pozove takvu ws operaciju s praznom vrijednošću, dobit će poruku o grešci:

Sapun: Klijent

Nepoznata greška.

zbog:

(WebService.WebService.Module(2)): Konverzija vrijednosti u tip Broj nije mogla biti izvedena

zbog:

(WebService.WebService.Module(2)): Konverzija vrijednosti u tip Broj nije mogla biti izvedena


To je zato što se proslijeđena null vrijednost konvertuje u vrijednost 1c - “Nedefinirano”. To možete provjeriti ako prepišete proceduru ovako.

Funkcija Plus2(Parametar=0)

Ako je parametar = nedefinirano onda

Rezultat = 1;

Inače

Rezultat = 2;

endIf;

Return Result;

EndFunction


Rezultat će biti - 1.

Napomena 5: nema smisla pisati zadanu vrijednost operanda ws (Funkcija Plus2(Parametar=0)). Za operande koji mogu uzeti praznu vrijednost, morate dodati provjeru jednakosti "Nedefinirano".


Napomena 6: Prilikom prosljeđivanja parametra tipa niza web operaciji, niz od jednog ili više razmaka se skraćuje na prazan niz.

Napomena 7: Prilikom prosljeđivanja parametra tipa datetime web operaciji koristeći format koji označava vremensku zonu, vrijeme se pretvara u vremensku zonu u kojoj se nalazi platforma 1c. Na primjer, ako operacija ima parametar "Date" tipa datetime, PC na kojem se nalazi 1c nalazi se u vremenskoj zoni +6, a onda kada se prenese vrijednost "2012-09-14T00:00:00.000+02:00 ” ovom parametru u kodu web operacije ovaj parametar će imati vrijednost "09/14/2012 4:00:00". Stoga, "+02:00" označava u kojoj se zoni nalazi pošiljalac. Ovo će vam omogućiti da ne razmišljate o promjeni vremena kada radite u više vremenskih zona.

Ovdje možete pročitati nešto više o web servisima, njihovoj implementaciji, testiranju itd.

Danas se WEB servisi koriste gotovo svuda – pružaju nam informacije o letovima aviona i voza, kursevima i vremenu. Nije iznenađujuće da 1C također ima mogućnost kreiranja vlastitih WEB usluga, što mu omogućava da djeluje i kao dobavljač i kao potrošač. Ovaj mehanizam je ugrađen u platformu 1C:Enterprise 8.3 i programeri ga mogu čak dodati tipična konfiguracija vlastiti objekti tipa “WEB usluge”. Njihova arhitektura je izgrađena na skupu usluga koje vam omogućavaju razmjenu informacija sa drugim softverom.

Kreiranje 1C web servisa

Jedna od glavnih prednosti 1C WEB usluga je odsustvo potrebe za pružanjem direktnog pristupa podacima o sigurnosti informacija. Ispravno konfigurirana 1C web usluga omogućava drugim aplikacijama da koriste funkcije izvana. U takvim slučajevima, sama funkcija treba da odredi pravo korištenja podataka prema navedenim parametrima prema pravilima koje je propisao programer.

Kako napraviti web uslugu u 1C?

Da bi određena funkcija 1C sistema postala dostupna vanjskom softveru, potrebno je izvršiti sljedeći algoritam radnji:

  1. Idite na konfiguraciju i dodajte objekt WEB usluge u određenu granu stabla;
  2. Opišite sve operacije koje naša funkcionalnost može izvršiti. Opis funkcija se vrši u modulu na ugrađenom 1C jeziku;
  3. Dodajte opis parametara funkcija web usluge. Imajte na umu da su tipovi podataka opisani uzimajući u obzir postojeće tipove XDTO mehanizma koji je uveden u verziji platforme 8.1;
  4. Objavite kreiranu WEB uslugu na serveru. Mehanizam ugrađen u 1C platformu podržava sljedeće standarde:
  • SSL/TLS
  • WS-I BP

Primjer kreiranja jednostavne WEB usluge

Da bismo što jasnije demonstrirali rad mehanizma WEB usluga, napravimo primjer - funkcionalnost koja određuje dužinu unesenog niza. Softverće proslijediti string kao parametar upita, a funkcija opisana u 1C će vratiti broj znakova. Prilikom kreiranja, morate imati na umu da će objavljivanje ovog mehanizma omogućiti pristup različitim softverima. Pošto nije svaki softver sposoban da prihvati ćirilično pismo, konfiguracioni objekti ćemo imenovati latiničnim znakovima.

Otvorite konfigurator, pronađite granu “WEB usluge” u stablu i dodajte nova usluga"wa_LengthString". Također morate dodati novu operaciju na kartici "Operacije". Nazovimo ga “CalcLengthString”, navedite tip povratne vrijednosti u svojstvima - int ili integer i kreirajte parametar “InputString” unutar njega. Ostavljamo tip vrijednosti kao string.

Sada morate registrirati akciju funkcije CalcLengthString u modulu WEB usluge. Da biste to učinili, otvorite svojstva kreirane funkcije i kliknite na dugme u obliku lupe na desnoj strani, pored polja za unos „Naziv postupka“. 1C će automatski kreirati funkciju u našem WEB servisnom modulu i otvoriti je tako da možemo opisati akciju CalcLengthString. Iskoristimo ovo i napišemo akciju funkcije - određivanje dužine ulaznog niza.


U stvari, ovo završava kreiranje jednostavne WEB usluge. Sada morate "objaviti" ovu uslugu u opšti pristup tako da softver treće strane ili drugi 1C sistemi mogu koristiti ovu funkcionalnost.

Da bismo mogli da objavimo kreirani web servis sa njegovom funkcionalnošću, potrebno je da imamo pristup sajtu. Prije nego počnemo objavljivati ​​uslugu, moramo provjeriti ime datoteke u svojstvima kreiranog modula wa_LengthString. Trebao bi biti jasan, jednostavan i imati ekstenziju “1cws”.


Sada je vrijeme da objavimo WEB servis koji smo kreirali na serveru. Ova funkcija se pojavila u verziji platforme 8.3 i mnoge kompanije su već shvatile sve prednosti ove funkcionalnosti. Da biste započeli sa objavljivanjem, potrebno je da u konfiguratoru otvorite obrazac “Administracija/Objavljivanje na web serveru...”.


U prozoru koji se otvori moramo konfigurirati 1C Web usluge i popuniti određena polja:

  • Ime. Određuje mapu na web serveru u kojoj će biti pohranjen opis naše web usluge. Budite oprezni sa velikim i malim slovima, jer ponekad serveri razlikuju velike i male znakove;
  • Web server. Morate odabrati server od onih instaliranih na vašem računaru;
  • Katalog. Morate odabrati putanju do mape u kojoj se pohranjuju podaci web servera za postavljanje veze. Koriste se samo latinična slova;
  • Dva znaka Bulovog tipa. Prvi će nam biti od koristi ako trebamo konfigurirati pristup konfiguraciji putem web klijenta. Da biste objavili 1C uslugu, morate označiti drugi okvir.

Ostaje samo provjeriti da li željeni WEB servis ima označeno polje za potvrdu u prvoj koloni i kliknuti na “Objavi”.


Budući da je ovaj mehanizam još uvijek prilično nov, možete naići na grešku poput „Došlo je do greške prilikom izvođenja operacije datoteke...“. U tom slučaju, samo trebate ponovo kliknuti na "Objavi". U većini slučajeva, ovo će pomoći i vidjet ćete poruku koja pokazuje da je web usluga objavljena.

<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl

Kao odgovor na takav zahtjev za adresu, pretraživač mora prikazati strukturu XML datoteke. Ako vidite praznu stranicu, greška ili čudni simboli(problemi sa kodiranjem), onda morate ponovo provjeriti sve korake. Takođe je dobra ideja da se uverite da je server ispravno konfigurisan i da imate pristup njemu. Nakon uspješne objave, 1C WEB uslugu moći će koristiti aplikacije trećih strana.

Web usluga je integracijski alat koji pruža koncept arhitekture usluge. To jest, 1C sistem se može predstaviti kao skup nezavisnih usluga za sisteme trećih strana, a zauzvrat može djelovati kao potrošač takvih usluga. Dijagram arhitekture:

Upravitelj web usluga, prikazan na dijagramu, obavlja sljedeće zadatke:

  • upravlja skupom veza s bazama podataka
  • podržava opis usluge u WSDL formatu (jezik opisa web usluga, jezik opisa web usluga baziran na XML-u)
  • implementira SOAP protokol (Simple Object Access Protocol), obezbjeđuje serijalizaciju poruka, pozivajući potrebne web servise

U konfiguraciji su web servisi implementirani kao zajednički objekti:

Za web servis određen je skup operacija, od kojih se svaka može karakterizirati određenim parametrima za prijenos podataka:

Web servis radi koristeći XML, tako da treba navesti šemu označavanja; Da biste to učinili, web usluga upućuje na paket XDTO:

Pitanje 08.42 ispita 1C: Platform Professional. Upravitelj WEB usluga rješava problem:

  1. upravljanje skupom veza sa infobazama
  2. podrška za opis WSDL servisa, implementacija SOAP protokola
  3. Podrška za WEB aplikacije
  4. tačni odgovori 1,2
  5. tačni odgovori 2,3
  6. tačni odgovori 1,2,3

Tačan odgovor je četvrti, web servis ne omogućava rad web aplikacije (pogledajte njene funkcije iznad).

Pitanje 08.43 ispita 1C: Platforma Professional. Konfiguracijski objekt "WEB servis" koristi se za:

  1. organiziranje pristupa web servisima putem statične veze
  2. izvozna funkcionalnost ovoga baza informacija

Tačan odgovor je treći - web servis specificira neku funkcionalnost kojoj se može pristupiti izvan ove baze podataka.

Pitanje 08.44 ispita 1C: Platforma Professional. Konfiguracijski objekt "WSLink" se koristi za:

  1. organiziranje dinamičkog pristupa web servisima
  2. organiziranje pristupa web servisima putem statične veze
  3. izvoz funkcionalnosti ove infobaze

Tačan odgovor je drugi. WS veza je zajednički konfiguracijski objekt dizajniran za pristup web uslugama trećih strana putem statičke veze. Veza se sastoji od modela podataka, u suštini paketa XDTO, i web servisa sa kojeg se link objavljuje:

Pitanje 08.45 ispita 1C: Platforma Professional. Ako funkcija koja implementira operaciju WEB usluge vraća vrijednost. Tada se takva vrijednost definira (prilikom postavljanja odgovarajućeg konfiguracijskog objekta) kao da ima tip:

  1. Linija
  2. Broj
  3. Boolean
  4. XML element
  5. XDTO objekt ili vrijednost
  6. tačni odgovori 1,2,3

Tačan odgovor je peti.

Pitanje 08.48 ispita 1C: Platforma Professional. Ako funkcija koja implementira operaciju WEB usluge uzima bilo koju vrijednost kao parametar. Tada se takva vrijednost definira (prilikom postavljanja odgovarajućeg konfiguracijskog objekta) kao da ima tip:

  1. Linija
  2. Broj
  3. Boolean
  4. XML element
  5. XDTO objekt ili vrijednost
  6. tačni odgovori 1,2,3

Tačan odgovor je isti kao i broj pet.

Pitanje 08.46 ispita 1C: Platforma Professional. Prilikom pristupanja WEB servisu putem statičke veze, slijed radnji je sljedeći:

  1. dobijanje wsdl opisa, postavljanje veze (kreiranje proxyja), pristup operaciji usluge
  2. postavljanje veze (kreiranje proxyja), pristup operaciji usluge
  3. pozivanje servisne operacije

Tačan odgovor je drugi - u slučaju statične veze, nema potrebe da svaki put primate wsdl opis.

Pitanje 08.47 ispita 1C: Platforma Professional. Prilikom pristupanja WEB servisu putem dinamičke veze, slijed radnji je sljedeći:

  1. dobijanje wsdl opisa, postavljanje veze (kreiranje proxyja), pristup operaciji usluge
  2. postavljanje veze (kreiranje proxyja), pristup operaciji usluge
  3. pozivanje servisne operacije

Tačan odgovor je prvi.

Ispis (Ctrl+P)

Web usluge

Mehanizam Web usluga vam omogućava da koristite 1C:Enterprise kao skup usluga u složenim distribuiranim i heterogenim sistemima, a takođe vam omogućava da integrišete 1C:Enterprise sa drugim industrijski sistemi koristeći uslužno orijentisanu arhitekturu.

Dodavanje web usluge

Da biste dodali Web servis u konfiguracijsko stablo, odaberite granu Općenito – Web usluge i pokrenite komandu kontekstni meni Dodaj .
Kao rezultat izvršavanja naredbe, otvorit će se prozor za uređivanje web usluge.

Na kartici Ostalo prozora za uređivanje web usluge postavite sljedeće parametre:
URI prostora imena– sadrži URI imenskog prostora Web usluge. Svaki Web servis može se jedinstveno identificirati svojim imenom i URI-jem imenskog prostora kojem pripada.
● XDTO paketi – lista XDTO paketa čiji se tipovi mogu koristiti kao tipovi povrata operacije i tipovi parametara operacije web usluge.
Naziv datoteke publikacije– naziv datoteke opisa web usluge koja se nalazi na web serveru.
Da biste dobili pristup web servisu, morate koristiti adresu koja se formira na sljedeći način: <Имя хоста веб-сервера>/<Имя виртуального каталога>/ws/<Имя Web-сервиса> ili <Имя хоста веб-сервера>/<Имя виртуального каталога>/ws/<Адрес Web-сервиса> .
Dakle, ako virtuelni direktorij ima ime DemoWS, ime web usluge u konfiguratoru je navedeno kao Demonstracija WorkWS-a, i DemoWorkWS je naveden kao adresa, tada se Web servisu može pristupiti istovremeno na dvije adrese (da bi se dobio pristup sa lokalnog stroja):
http://localhost/DemoWS/ws/Demonstration of WS ili http://localhost/DemoWS/ws/DemoWorkWS.
Dodatno, kartica sadrži dugme Modul, koje vam omogućava da otvorite modul Web usluge za uređivanje.

Hijerarhijska struktura web servisa

Svaka Web usluga opisana u stablu konfiguracije može sadržavati skup operacija. Svaka operacija mora odgovarati izvezenoj proceduri opisanoj u modulu Web usluge.


Opis web servisa

Zauzvrat, svaka operacija može sadržavati skup parametara, čija imena moraju odgovarati imenima parametara procedure koja opisuje ovu operaciju.

Operacije web servisa

Na kartici Operacije dodajete operaciju Web usluge. Uređivanje svojstava operacije vrši se u paleti svojstava.


Svojstva rada web usluge

Vrsta povratka– tip vrijednosti koju operacija Web usluge vraća. Može biti tip vrijednosti XDTO ili tip objekta XDTO.
Moguća prazna vrijednost– označava može li povratna vrijednost biti null.
U transakciji – označava hoće li se kod modula web usluge izvršiti u transakciji ili ne. Ako je svojstvo postavljeno, onda kada se pozove Web usluga, transakcija će automatski započeti, a kada se završi, transakcija će biti ili predana ili će se transakcija vratiti (u zavisnosti od rezultata izvršenja). Ako svojstvo nije postavljeno, transakcija neće biti pokrenuta kada modul Web usluge počne da se izvršava.
Naziv procedure – naziv eksportne procedure modula Web usluge koja će se izvršiti kada se pozove ovo svojstvo.
Data Lock Control Mode– određuje koja će se brava koristiti prilikom pristupa podacima.

Radni parametri

Na kartici Operacije, za navedenu operaciju, trebate postaviti parametre operacije Web usluge. Uređivanje svojstava parametara
izvedeno u paleti svojstava.


Svojstva parametra operacije

Tip vrijednosti—tip vrijednosti parametra operacije Web usluge. Može biti tip vrijednosti XDTO ili tip objekta XDTO.
Moguća prazna vrijednost– označava može li vrijednost parametra operacije uzeti nedefiniranu vrijednost.
Smjer prijenosa– određuje smjer prijenosa podataka koristeći ovaj parametar. Moguće vrijednosti:
● Unos – znači da se parametar može koristiti samo za prenos podataka na Web uslugu.
● Izlaz – znači da se parametar može koristiti samo za primanje podataka sa Web usluge.
Ulaz – Izlaz– znači da se parametar može koristiti i za prijenos podataka i za primanje od web usluge.

Specificiranje sistemski definiranih tipova

Da biste koristili tipove koje definiše sistem 1C:Enterprise u Web servisu (na primjer, u parametrima i povratnim vrijednostima operacija), potrebno je u konfiguraciji definirati XDTO pakete i za svaki paket navesti u svojoj listi uvezenih paketi (svojstvo Import Directives) skup paketa platforme u koje su uključeni ovi tipovi. URI prostora imena za određivanje tipa sadržan je u članku pomoćnika za sintaksu za objekt tog tipa.

Izdavačke web usluge

Zadatak objavljivanja se svodi na postavljanje datoteke publikacije u odgovarajući direktorij. Da biste objavili, trebate izvršiti naredbu menija “ Administracija – Objavljivanje na web serveru…“.

Kao rezultat izvršenja ove naredbe, otvorit će se prozor u kojem se objavljuje infobaza na lokalnom računalu.

Pažnja! Za izvođenje operacije potrebna su administratorska prava (za Windows OS) ili prava superkorisnika (za Linux OS) na računaru na kojem se vrši objavljivanje

Osnovne postavke za objavljivanje

na “ Basic” prikazuje podatke potrebne za završetak publikacije.

Ako objavljivanje nije ranije izvršeno, vrijednosti polja (postavke) se popunjavaju zadanim vrijednostima (ime se bira iz naziva baze podataka). Promijenite ove postavke ako je potrebno.
Ako je objava već obavljena, tada se odabiru postavke prema prethodno navedenim.
Ako sistem prilikom otvaranja dijaloga sa trenutnim postavkama pronađe publikaciju, ali se njeni podaci razlikuju od podataka postavki, izdaje se zahtjev za promjenu postavki.
Ako nije pronađena publikacija postavki, izdaje se upozorenje.

Odaberite web server i odredite direktorij u koji će biti upisana datoteka publikacije.
Lista web servera se generiše automatski na osnovu instaliranih web servera.

Ime publikacije mora pratiti URL pravila (standard RFC 1738).
Ako je web server Apache 2.2 ili Apache 2.4, tada treba koristiti američke ASCII znakove za ime direktorija.

Napomena. Kada koristite Apache web server, obje verzije web servera su dostupne za odabir u dijalogu postavki. Imajte na umu da postavke objavljivanja za Apache 2.2 i Apache 2.4 nisu međusobno kompatibilne. Stoga je potrebno pravilno odabrati verziju web servera u dijalogu.

Navedite potrebu za objavljivanjem tanki klijent i web klijent, kao i web i HTTP usluge.

Ako polje za potvrdu “ Objavite standardni ODATA interfejs” će biti objavljen ODATA servis koji vam omogućava da čitate i mijenjate podatke baze podataka koristeći HTTP zahtjeve.

na “ Web usluge"označi kutiju" Objavite web usluge” i kreirajte listu u tabeli tako što ćete označiti kućice za one Web usluge koje želite da objavite.

Ako polje za potvrdu “Objavi web usluge prema zadanim postavkama” je instaliran, tada će prilikom ažuriranja publikacije odabrani web servisi biti objavljeni automatski. U suprotnom, web servisi će biti označeni kao neobjavljeni.

Ako polje za potvrdu “Objavite web usluge ekstenzija prema zadanim postavkama” instaliran, tada će prilikom ažuriranja publikacije automatski biti objavljeni web servisi dodani ekstenzijama.