Shema rada 1C web usluge. Web usluge. Pružanje funkcionalnosti putem web servisa


Svrha ovog članka– pomoći u razumijevanju „kako“ su WEB usluge strukturirane u 1C, razumjeti „kako mehanizmi funkcioniraju“ i „za koje zadatke“ je racionalno koristiti ove mehanizme.

Karakteristika članka je li to:

  • Razmotrene su različite metode i tehnike koje se mogu koristiti pri integraciji 1C, WEB (php) i mobilnih (Ios, Android) aplikacija (i međusobno upoređivane);
U Različiti putevi imaju svoje prednosti i nedostatke, te je racionalno odabrati najjednostavniji, kompaktniji za određeni zadatak.
  • Istovremeno, dati su primjeri rješenja i na strani 1C i na strani WEB servera (PHP);
Primjeri rješenja mogu biti korisni i za 1C programere i za WEB stručnjake, one koji rade na raskrsnici područja.
  • Sve potrebne informacije su prikupljene zajedno ( upute korak po korak) da napravite „brzi početak“ i započnete razvoj. Odnosno, da ne gubite puno vremena na proučavanje i konfigurisanje WEB servera, windowsa, "borbe" sistemske greške itd.
Članak je naslovljen na:
  • 1C: Programeri i WEB stručnjaci koji proučavaju integraciju koristeći tehnologiju web usluga;
  • Dizajneri i IT analitičari moraju razumjeti „suštinu“ i napraviti racionalan izbor tehnologija prilikom kreiranja projekata.
U zaključku uvodnog dijela vrijedi reći da ako ste već imali iskustva u radu sa COM/Ole tehnologijama, onda će vam to pomoći u dobrom razumijevanju tehnologije WEB servisa.

1.1 Tehnološke mogućnosti, podrška od strane 1C platforme

1.2 Primjenjivost tehnologija za zadatke interakcije klijent-server.


2. Brzi početak. Gdje početi?


Tačka br. 0.
Prije svega, trebate odabrati (odlučiti) o tehnologiji integracije i razumjeti "suštinu" - odnosno kako će ona funkcionirati.
Drugim riječima, morate odgovoriti na dva pitanja:

  • Koja će 1C baza podataka (ili drugi program) djelovati kao klijent, a koja kao server;
Prilikom određivanja šta će biti klijent, a šta server, možete koristiti jednostavno pravilo: Klijent može "pozvati" (kontrolisati) server, ali povratni poziv nije moguć.
  • Koja tehnologija interakcije klijent-server je najprikladnija za vas i koja će se koristiti.
Gore sam iznio svoje preporuke za odabir tehnologije.

Tačka br. 1.
Dakle, "suština" interakcije klijent-server je shvaćena. Određena je tehnologija interakcije. Sada morate da napravite „poligon za testiranje“ gde će se odvijati razvoj.

U ovom članku će se govoriti o dvije tehnologije koristeći primjere:

Rad sa mehanizmom WEB servisa.

Razmotrit će se primjeri rada iz 1C 8 i PHP-a;

Rad sa mehanizmom http zahtjeva (REST Web servisi).

Razmotrit će se i primjeri rada iz 1C 8 i PHP-a;
U poslovima vezanim za WEB razvoj tradicionalno je prihvaćeno:

  • Stvorite „teren za testiranje“ za razvoj i otklanjanje grešaka na lokalnom WEB serveru programera (localhost);
  • Nakon završetka razvoja, rezultati se moraju prenijeti na “borbeni” WEB server.

U praksi (naročito kada počnete da se „upoznajete“ sa tehnologijom WEB servisa), prilikom kreiranja „poligona za testiranje“, kao i prilikom prenosa projekta na „borbeni“ server, nastaje mnogo „grabljanja“.

Dakle, kako ne biste “gubili” puno vremena na “borbu” sa postavkama IIS(Internet Information Server) / ovladavanje serverom apache, i postavljanje prava Windows pristup, preporucujem sledece:

  • (1) Kreirajte "Polygon" na vašoj lokalnoj radnoj mašini. Operativni sistem - Windows 7 (profesionalni ili maksimalni). Svi radovi moraju biti obavljeni ispod račun administrator.
  • (2) Postavite 1C 8 bazu podataka u klijent-server modu (MS SQL server, preporučujem 2008 R2). Korištenje 1C 8 u načinu klijent-server eliminiraće potrebu za dodatnim radom. podešavanja za prava pristupa bazi podataka 1C sa WEB servera.
  • (3) Instalirajte IIS, ako nedostaje. U Windows-u možete ga redovno "reinstalirati".

Potvrdni okviri za opcije instalacije za IIS komponente mogu se postaviti prema zadanim postavkama.
Važne stvari na koje morate obratiti pažnju su sljedeće opcije (ISAPI ekstenzije - ovo je potrebno da bi sapunske veze radile u WEB servisima, i CGI - ovo je potrebno da PHP radi)

Nakon završetka instalacije IIS Hajde da se uverimo da radi. Za ovo, u adresna traka WEB pretraživač unesite:

(4) Objavljivanje (povezivanje) 1C baze podataka na WEB serveru.

I tako, WEB server IIS instaliran i radi. Hajde da objavimo našu 1C bazu podataka i proverimo da li je sada moguć pristup i preko WEB klijenta.

Preporučljivo je objaviti na WEB serveru 1C bazu podataka koja omogućava rad u režimu upravljane aplikacije (tanki klijent).

Objavljivanje 1C baze podataka radi se na sljedeći način:
U modu konfiguratora, trebate pozvati stavku "Objavi na web serveru"

b) Navedite parametre objavljivanja:

Odnosno, u direktoriju (folder) wwwroot tvoj njegov IIS morate kreirati posebnu mapu (direktorij) za objavljivanje vaše 1C baze podataka.

wwwroot direktorij će biti kreiran automatski kada se IIS instalira
Napravimo i izaberemo takav folder (wsBase10), odredimo ime za publikaciju (također ćemo ga nazvati wsBase10).

Ako iznenada dobijete poruku kao odgovor,

onda se nemoj plašiti.

Mehanizam 1C objavljivanja je vrlo hirovit. Pokušajte ponovo kliknuti na "Objavi".

A ako kao rezultat dobijete poruku,

to znači da je sve funkcionisalo.

Vrlo je važno shvatiti da prilikom objavljivanja 1C baze podataka i njenih WEB usluga na "borbenom" serveru (na primjer, Windows 2008 R2), često dolazi do grešaka ako odlučite koristiti web server IIS.

savjet: nemojte instalirati na "borbeni" server IIS! Instaliraj apache.

Ovo će vas zaštititi od mnogih sistemskih grešaka. I objavljivanje (ponovno objavljivanje - sa promjenama u konfiguraciji) će se održati za apache glatko, bez potrebe za petljanjem sa vrd datotekama i postavkama IIS.

U ovom članku neću razmatrati proces instalacije i apache postavke. Postoje i drugi izvori na ovu temu.

Međutim, za saradnju apache sa 1C bazom podataka (i web servisima) postoji nekoliko vrlo važnih zahtjeva koje trebate znati (donesite ovo svom administratoru sistema).

1. Prilikom instaliranja apache Obavezno omogućite podršku za ISAPI ekstenzije.

2. Omogućite podršku za cgi-bin ako ćete raditi sa PHP-om;

3. Morat ćete unijeti posebnog "korisnika" u 1C bazu podataka...

Ovaj korisnik mora imati autentifikaciju operativni sistem. I potrebno je navesti korisnika pod čijim imenom se pokreće apache.

... Završili smo sa apacheom i vratimo se ponovo na naš "Poligon".

Evo vidimo - 1C počinje. WEB server zajedno sa 1C radi.
4. Instalirajte PHP servis za WINDOWS.

Trebat će vam ako, kao dio vašeg zadatka, trebate razviti klijent (web stranice za pristup 1C) ili server (scenariji za obradu http zahtjeva iz 1C) u PHP-u.

5 Dodajmo direktorij wsClient10 u IIS, u kojem će se izvoditi naše PHP skripte.

PHP skripte koje ćemo koristiti:

  • Kreirati klijentski dio prilikom razvoja 1C WEB usluga;
  • Za razvoj serverskog dijela, prilikom razvoja REST web servisa (http zahtjevi).

6. Hajde da instaliramo program Notepap++. Ovaj kompaktni i pogodan program Preporučujem da ga koristite za uređivanje PHP skripti.

Nakon što instaliramo Notepad++, odmah ćemo provjeriti radi li PHP za nas. Kreirajmo jednostavnu hello.php skriptu za ovo. Postavimo ga u direktorij wsClient i pokrenimo skriptu iz pretraživača:

Sve OK. PHP radi. Testno mjesto je potpuno spremno.

3. Kreiranje WEB servisa, sapun zahtjeva, XDTO i JSON. Primjeri 1C i PHP. U ovoj fazi trebalo bi da imate spreman “Polygon” i možete započeti razvoj WEB servisa.

- Gdje početi proučavati ovu tehnologiju? Naravno, sa klasičnim problemom kao što je “Zdravo riječ”!

1. Zadatak stvaranja najjednostavnijeg WEB usluga. Pogledajmo primjere u 1C i PHP-u.

1.1. Dodajmo bazi podataka (wsBase10) web servis "_Obračun po tarifama"

Postavimo naziv datoteke publikacije na "calcOrder10.1cws". URI imenski prostor također mora biti specificiran. U principu, možete odrediti bilo koje ime.

1.2. Dodajmo operaciju "getHello" unutar web servisa "_Izračuni po tarifama".

Suština operacije će biti najjednostavnija - uzeti tri parametra (nizovi, brojevi) kao ulaz (od klijenta) i vratiti mu objedinjujući niz (kao rezultat). Tip povratne vrijednosti će biti primitivan - string.

Nećemo označiti potvrdni okvir „U transakciji“, jer operacija neće promijeniti podatke u samoj bazi podataka 1C.

Ako bi naša operacija promijenila podatke u bazi podataka 1C, onda bi označivanje ovog okvira imalo smisla.
Ime metode (funkcije) koja će obraditi dolazne podatke (i vratiti rezultat) će biti “getHello”.

1.3. Dodajmo dolazne parametre za operaciju "getHello".

Smjer prijenosa je "ulaz". Odnosno, oni se prenose sa klijenta na server.

1.4. Napišimo rukovalac za operaciju "getHello" u modulu web usluge
///////////////////

Funkcija getHello(strParametar, floatParametar, integerParametar)
vrati strParametar+string(floatParametar+integerParametar)
EndFunction

////////

1.5. U ovom trenutku rad na kreiranju jednostavnog WEB servisa je završen. A sada treba da objavite WEB servis "_Obračun po tarifama".

Prije objavljivanja web servisa na probnoj stranici, sve korisnike ćemo ukloniti sa liste naših korisnika baza informacija. Odnosno, spisak korisnika ćemo učiniti „praznim“.

- Zašto ovo radiš?

Na testnoj lokaciji samo će programer moći da se poveže na WEB servise, pa stoga nema smisla pružati autentifikaciju korisnika prilikom povezivanja na WEB servis.

Odnosno, namjerno ćemo pojednostaviti naš rad sa WEB servisima na testnoj lokaciji.

Nećemo morati da navodimo login i lozinku prilikom uspostavljanja veze.
Ali na "borbenom" serveru, naravno, moraćete da obezbedite autentifikaciju.
Da biste to učinili (kao što je ranije rečeno), morat ćete posebno kreirati korisnika u bazi podataka „borbe“, u čije ime će se pokrenuti sam WEB server. A zatim, prilikom uspostavljanja veze sa WEB uslugom (sapun veza), morat ćete također navesti login i lozinku ovog korisnika.

1.6. I tako, objavimo WEB servis:

Imajte na umu da ne moramo označiti polje za potvrdu "Koristi provjeru autentičnosti operativnog sistema na web serveru". To je zato ovaj način rada predviđeno samo za WEB server IIS, a na "borbenom" serveru će raditi Apache.

1.7. Kreirajmo klijentski dio i testiramo rad WEB servera.

A) Prvo, pozovimo klijenta iz 1C.

Uradimo to jednostavno. Mi ćemo kreirati bilo koju drugu 1C bazu podataka koju imate eksterna obrada. U ovoj obradi ćemo se povezati na WEB servis, koristiti operaciju “getHello”, tamo proslediti parametre i dobiti odgovor od servera.
Kod za "1C" će biti otprilike ovako:

/////

&OnClient
Procedura Izvrši upit 10 (naredba)
// Ubacite sadržaj rukovaoca.
LineResult = SERVER_ExecuteWSQuery10();
Upozorenje(StringResult);
Kraj procedure
&Na serveru bez konteksta
Funkcija SERVER_RunWSRequest10()
// Nećemo izvršiti autentifikaciju na mjestu testiranja!
Korisničko ime = nedefinirano;
Lozinka = nedefinisana;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",Korisničko ime,Lozinka);
Proxy.User = Korisničko ime;
Proxy.Password = Nedefinisano;
strResult = Proxy.getHello("Ivanov",100.35,20);
return strResult;
EndFunction ///////////////////////////////////////////////////////////////////////////////////////

Testirajmo rad funkcije SERVER_ExecuteWSRequest10().

UREDU. Works!
b) Sada napravimo klijentski poziv web servisu iz PHP-a.
PHP kod skripte će biti otprilike ovako:

/
//////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // 1. Onemogućite nepotrebne poruke
// 2. Onemogući keširanje za SOAP. Ako se to ne uradi,


// 3. Uspostavite vezu sa sapunom
$client = novi SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
niz (
"login" => null, //login, nećemo izvršiti autentifikaciju
"password" => null, //password
"trace" => istina,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"compression" =>
);
// 4. Popunjavanje niza proslijeđenih parametara
$params["strParametr"] = "test_Soap10:";
$params["floatParametar"] = 10.34;
$params["integerParametar"] = 12;
// 5. Izvedite operaciju getHello
$result = $client->getHello($params);
// 6. Prikažite rezultat na ekranu
var_dump($rezultat);
?>

////
///

Pozovimo skriptu iz pretraživača i provjerimo njen rad:

Sve je u redu, pozivanje 1C sa WEB stranice radi!

Sumiramo neke rezultate:
Problem jednostavnog WEB servisa je riješen. I sada možete početi kreirati složenije WEB usluge.

A komplikacija će biti u tome što smo (do sada) radili samo s primitivnim tipovima podataka. Naravno, morat ćemo također prenijeti/primiti objektne (agregirane) tipove podataka.

2. Zadatak kreiranja WEB servisa koristeći XDTO pakete.

Kao i ranije, pogledajmo primjere u 1C i PHP-u.

Postavimo sebi sledeći zadatak: WEB servis bi nam trebao vratiti ne string, već podatke o objektu - „tabelu vrijednosti“ (tačnije, to će biti niz objekata!).

Da bi se opisale različite strukture podataka (koje će biti potrebne prilikom prijema/prenosa na WEB server), 1C:8 platforma pruža mehanizam za XDTO pakete.

One. Prvo opišemo sve tipove podataka koji su nam potrebni, a zatim naznačimo:

  • S kojim XDTO paketima može da radi naš WEB servis (možete navesti ili jedan ili listu paketa);
  • Za svaki parametar operacije i rezultat koji vraća, možete odrediti koji će tip podataka (iz XDTO paketa) biti.
Zatim ćemo pogledati rad sa XDTO na primjeru primanja određene "tarifne tablice" sa servera:

Kreirajmo operaciju GetTzTariffs_0, koja će vratiti podatke tipa tzTariffs.

Slika pokazuje da tzTarife uključuje neograničen broj el objekata. Zapravo, tzTarife je tabela objekata tipa el.

- Kako to videti?

  • Ako je parametar "maksimum" naveden kao "-1", tada broj ovih objekata nije ograničen (tabela sa neograničenim brojem redova);
  • Ako nam ne treba tabela, već nam je potrebna samo struktura (jedan red), tada maksimalne i minimalne vrijednosti treba navesti jednake "1".
  • Zauzvrat, el objekt je struktura koja sadrži atribut tipa objekta (eTariff) i atribut primitivnog tipa (cPrice, comment).

Krećući se niz hijerarhiju, možete vidjeti da je tip tarife struktura (maksimalna i minimalna količina = 1), čiji jedan od detalja uključuje tip kindOfTariff.

Ukupno: XDTO paket vam omogućava da jasno opišete hijerarhiju tipova podataka koji će se dalje koristiti prilikom interakcije sa WEB uslugom.

Savjet: Bolje je koristiti jedan XDTO paket za web uslugu kako biste izbjegli složenost i greške u dizajnu.
Idemo dalje... Nakon:

  • XTDO paket je kreiran;
  • Opisani su svi tipovi podataka;
  • Za WEB uslugu je naznačeno korištenje ovog paketa;
  • Za parametre i rezultate operacija biraju se odgovarajući tipovi (iz XDTO paketa)
onda možete preći na “punjenje” objekata (struktura, nizova struktura) podacima.

U našem primjeru, operacija GetTzTariffs_0 bi trebala vratiti niz stringova koji sadrže Tariffs objekte.

////////////////

Funkcija GetTzTariffs_0()
// Ubacite sadržaj rukovaoca.
Vrati GetTZTariffs_0();
EndFunction

Funkcija GetTZTariffs_0()


// Ispunjavanje tehničkih specifikacija
// 1. red

kindOfTariff.active = false;


tariff.kind = kindOfTariff;

elementTZ.eTariff = tarifa;
elementTZ.cPrice = 100;

//
// 2. red
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);

tarifa = FactoryXDTO.Create(tarifaType);
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 200;
// Dodajte 2. red u tabelu
tzTarife.el.Add(elementTZ);
Povratak tzTarife;
EndFunction

//////////
Zatim dajemo primjer pozivanja operacije "GetTzTariffs_0" sa strane klijenta, iz 1C.

&OnClient
Procedura Izvrši upit 20 (naredba)
// Ubacite sadržaj rukovaoca.
Upozorenje(SERVER_ExecuteWSQuery20());
Kraj procedure
&Na serveru bez konteksta
Funkcija SERVER_ExecuteWSRequest20()
Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
Proxy = novi WSProxy(Definicije,"www.URI.com","_Izračuni po tarifama","_Izračuni po tarifamaSoap");
XDTResult = Proxy.GetTzTariffs_0();
// Pristupimo liniji na indeksu nula, zatim atributu eTariff, zatim vrsti ugniježđenog atributa, pa nazivu ugniježđenog atributa.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sličan poziv iz PHP-a i obrada XDTO rezultata bi izgledao ovako:
////////////////////////////////////////////////////////////////////////////////////



// funkcije web servisa neće raditi ispravno.
ini_set("soap.wsdl_cache_enabled", "0");
$client = novi SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
$result = $client->GetTzTariffs_0();
$mResult = $rezultat->povratak->el;
// mResult - niz objekata. Prođimo kroz elemente niza i prikažimo rezultate na ekranu
za ($i=0; $i {
eho"
";
$eTariff = iconv("utf-8","cp1251",$mResult[$i]->eTariff->fullName);
var_dump($eTariff);
$cPrice = $mResult[$i]->cPrice;
var_dump($cPrice);
$cComment = $mResult[$i]->cComment;
var_dump($cComment);
eho"
";
}
?>

//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

Sad Zakomplikujmo zadatak još više. Prenesite isti tip podataka objekta sa klijenta na WEB servis (kao parametar). Neka bude tzKind.
Da bismo to učinili, prvo opišemo ovaj tip u paketu dataTariffs, a zatim dodamo operaciju GetTzTariffs_1.

Naznačimo tip parametra tzKind.

Primjer kako WEB usluga radi s dolaznim XDTO parametrom:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Funkcija GetTZTariffs_1(tzKind)
tzTariffsType = FactoryXDTO.Type(" ", "tzTariffs");
tzTariffs = FactoryXDTO.Create(tzTariffsType);
elementTZType = FactoryXDTO.Type(" ", "elementTZ");
tariffType = FactoryXDTO.Type(" ", "tarifa");
kindOfTariffType = FactoryXDTO.Type(" ", "kindOfTariff");
// Ispunjavanje tehničkih specifikacija
// 1. red
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Transport";
kindOfTariff.active = false;
tarifa = FactoryXDTO.Create(tarifaType);
tariff.fullName = "Tarifa 1";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 100;
elementTZ.comment = "Opis tarife 1";
// Dodajte 1. red u tabelu
tzTarife.el.Add(elementTZ);
// 2. red
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Isporuka";
kindOfTariff.active = istina;
tarifa = FactoryXDTO.Create(tarifaType);
tariff.fullName = "Tarifa 2";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 200;
elementTZ.comment = "Opis tarife 2";
// Dodajte 3. red u tabelu (popunite je ulaznim podacima)
tzTarife.el.Add(elementTZ);
// 3. red
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
tarifa = FactoryXDTO.Create(tarifaType);
tariff.fullName = "Tarifa 3";
tariff.begdate = CurrentDate();
tariff.kind = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 300;
elementTZ.comment = "Opis tarife 3";
// Dodajte 3. red u tabelu
tzTarife.el.Add(elementTZ);
Povratak tzTarife;
EndFunction

//////////////////////////////////////////////////////////////////////////////////
Sa 1C klijentske strane trebat ćemo pripremiti podatke tipa tzKind i prenijeti ih na WEB servis.

Evo primjera takvog poziva:
/////////////////////////////////////////////////////////////////////////////////

&OnClient
Procedura Izvrši upit 30 (naredba)
// Ubacite sadržaj rukovaoca.
Upozorenje(SERVER_ExecuteWSQuery30());
Kraj procedure
&Na serveru bez konteksta
Funkcija SERVER_ExecuteWSRequest30()
Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl");
Proxy = novi WSProxy(Definicije,"www.URI.com","_Izračuni po tarifama","_Izračuni po tarifamaSoap");
// Kreirajte tablicu parametara proslijeđenih WS-u
tzKindType = Proxy.FactoryXDTO.Type(" ", "tzKind");
tzKind = Proxy.FactoryXDTO.Create(tzKindType);
kindOfTariffType = Proxy.FactoryXDTO.Type(" ", "kindOfTariff");
kindOfTariff = Proxy.XDTO Factory.Create(kindOfTariffType);
kindOfTariff.name = "Test tarifnog tipa";
kindOfTariff.active = false;
elementKindType = Proxy.FactoryXDTO.Type(" ", "elementKind");
elementKind = Proxy.XDTO Factory.Create(elementKindType);
elementKind.eKind = kindOfTariff;
elementKind.qty = 10;
// Dodaj red u tablicu
tzKind.el.Add(elementKind);
XDTOResult = Proxy.GetTzTzriffs_1(tzKind);
ExampleResult_Name tipa tarife = XDTOResult.el.eTariff.kind.name;
Vratite ExampleResult_Name tipa tarife;
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Skrenuo bih vašu pažnju na dizajn: Proxy.FactoryXDTO.Type("...

To jest, kada kreiramo XDTO objekt paketa na klijentu, moramo pristupiti ne našoj vlastitoj XDTO! fabrici, već preko proxyja. Odnosno, u fabriku servera XDTO.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sada je vrijeme da postavite pitanje:postoji li alternativa XDTO objektima ?

Da li je moguće uopšte "ne komunicirati" sa fabrikom XDTO, prenositi/primati sa WEB servisa na neki drugi način.. (naročito ako klijent nije 1C, već npr. WEB stranica, aplikacija na Androidu, iOS-u , itd.).

Odgovor je- da, možeš!
Na primjer, možete koristiti string kao tipove parametara. I „upakovati“ (serijalizirati) strukture podataka u njega.

Ova tehnologija u WEB programiranju je dugo razvijena i zove se JSON.
Takođe je velika pomoć što se u PHP-u pakovanje/izvlačenje bilo koje strukture/niza niza vrši u jednom koraku!
Primjer u PHP-u pakovanja objekata u JSON/izdvajanje, prijenos/prijem na WEB servis:

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

// serijalizirati mDelivery niz u string i smjestiti ga u parametar isporuke
// * Prvo, hajde da opišemo strukturu isporuke
dostava razreda (
var $id;
var $checked;
var $value;
}
// Popuni strukturu nekim podacima
$sDostava = nova isporuka;
$sDelivery->id = "000000005";
$sDelivery->checked = TRUE;
$sDostava->vrijednost = 0;
// Dodajte ga u niz objekata mDelivery
$mDostava = $sDostava;
// Konvertujte niz mDelivery u JSON string i postavite rezultat u parametar isporuke
$params["delivery"] = json_encode($mDelivery);
// Pozovite operaciju ExitCalcOrder na WEB servisu i proslijedite joj parametar (string - isporuka);
$result = $client->ExitCalcOrder($params);
// Dobivamo rezultat operacije ExitCalcOrder u varijablu jsCalcResult (string)
$jsCalcResult = $rezultat->povratak;
// Izvršite obrnutu transformaciju: iz stringa jsCalcResult u objekt (niz objekata, podudaranje tipa) arrCalcResult
$arrCalcResult = json_decode($jsCalcResult);
// Prikaz informacija na ekranu o objektu arrCalcResult
var_dump($arrCalcResult);

////////////////////////////////////////////////////////////////////////////////

Ali kako izvršiti JSON konverzije u 1C?
1C 8 platforma ne podržava JSON standard, ali to nije problem.
Obrada JSON konverzije/vađenja postoji, dostupna je i odlično funkcionira
// Copyright © 2010-2012 Alexander Pereverzev
// 1C:JSON . Parser i serijalizator JavaScript notacije objekata.

Dakle, samo stavite ovu obradu u svoju konfiguraciju i lako možete izvršiti naprijed i nazad JSON konverzije:
Primjer serijalizacije 1C objekat na JSON string:

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

CargoData = nova struktura;
CargoData.Insert("code",CargoCode);
CargoData.Insert("broj",Broj tereta);
CargoData.Insert("plan", Plan količine);
CargoData.Insert("karakter",CargoCharacter);
CargoData.Insert("pakovanje", Pakovanje);
CargoData.Insert("oštećenje",Oštećenje ambalaže);
CargoData.Insert("volumen",Volume);
CargoData.Insert("weight",Weight);
CargoData.Insert("status",Status);
jsResult = JSON.WriteJSON(LoadData); //Pretvorite rezultat u JSON
return jsResult;

Ekstrakt primjer objekat u 1C iz JSON niza:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. Vratite objekte iz JSON-a
JSON = Process.JSON.Create();
mdelivery = JSON.ReadJSON(dostava);
// kao rezultat toga, mdelivery je niz. Element niza - podudaranje.
// To jest, na primjer, mdelivery.["id"] će sadržavati "000000005"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
U zaključku ću dati primjer pozivanja 1C web servisa iz PHP-a, primanja vraćene JSON strukture njene obrnute transformacije u PHP objekte.

Obratimo pažnju na transformacije iconv("cp1251","utf-8","
i iconv("utf-8","cp1251", koji će biti potreban (prilikom interakcije sa PHP-om - 1 C) za konvertovanje ćiriličkih nizova iz cp 1251 kodiranja u utf -8 i nazad.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

error_reporting(E_ERROR); // Onemogući poruke
// Onemogući keširanje za SOAP. Ako se to ne uradi,
// funkcije web servisa neće raditi ispravno.
ini_set("soap.wsdl_cache_enabled", "0");
$client = novi SoapClient("http://localhost/wsBase10/ws/wsQuery.1cws?wsdl");
$params["fname"] = iconv("cp1251","utf-8","dataFreight");
$params["param1"] = iconv("cp1251","utf-8",$_GET["code"]);
$params["param2"] = iconv("cp1251","utf-8",$_GET["broj"]);
$result = $client->executeQuery($params);
$jsResult = $result->return;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////

Vjerovatni scenario je: udaljeni korisnik iz nekog svog programa (npr. sa WEB stranice, mobilne aplikacije i sl.) poziva vaš WEB servis i... ne prima rezultate.. Ili ga prima, ali nešto nije u redu.

Pitanje: - Kako saznati za takve greške i otkloniti greške na WEB servisu?
Preporučujem da koristite dnevnik za praćenje grešaka (i prikupljanje dolaznih parametara „šta je dovelo web uslugu do greške“).

One. na mjestu gdje se mogu pojaviti logičke greške, programski sačuvati informacije o ulaznim parametrima u dnevnik registracije (LogRecord)

Ako se „borite“ sa „greškama u izvođenju“, onda ih možete presresti (pokušaj je izuzetak) i „tačku po tačku“ evidentirati cijelu situaciju.

Kao rezultat toga, koristeći dnevnik, moći ćete vidjeti informacije o greškama, reproducirati parametre pojavljivanja i "pobijediti" ga u interaktivnom načinu, u programu za otklanjanje grešaka.

Hajde da rezimiramo: Razmatraju se primjeri rada sa WEB servisima iz 1C i PHP-a. Za prijenos objektnih struktura podataka između klijenta i servera koristili smo dvije tehnologije:

  • (1) XDTO paketi
  • (2) JSON objekti.

4. Alternativa - REST Web servisi (http zahtjevi). Primjeri implementacije u 1C i PHP-u.
U prethodnom dijelu smo detaljno ispitali tehnologiju WEB servisa. U ovom dijelu ćemo razmotriti alternativnu tehnologiju, tzv. REST Web usluge.

Postavlja se pošteno pitanje: - Zašto?

WEB usluge su potpuno funkcionalne i omogućavaju vam rješavanje problema bilo koje složenosti.

Da bismo razumjeli "zašto", hajde da formulišemo osnovne razlike između ovih tehnologija.

Tehnologija WEB usluga zasniva se na 2 tačke:

  • (1) Koristi se SOAP veza. Drugim riječima, napravljen je SOAP zahtjev.
U "1C" sapunu veza se formira na sljedeći način:
/////////////////////////////////////////////////////////////////////////////////////////

Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl", Korisničko ime, Lozinka);
Proxy = novi WSProxy(Definicije,"www.URI.com","_Izračuni po tarifama","_Izračuni po tarifamaSoap");

/////////////////////////////////////////////////////////////////////////////////////////

U PHP-u je ovako:

/////////////////////////////////////////////////////////////////////////////////////////

$client = novi SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
niz (
"login" => login, //login,
"password" => prolaz, //lozinka
"trace" => istina,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"compression" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);

/////////////////////////////////////////////////////////////////////////////////////////

  • (2) Za obradu sapune veze u serverskom modu, 1C 8 platforma pruža posebne WEB usluge za objekt metapodataka.

Štaviše, ako u vašem zadatku "1C" mora djelovati kao server, onda ne postoji alternativa tehnologiji 1C WEB usluge.

- Kada je moguća alternativa?

  • Prvo, kada 1C djeluje samo kao klijent;
  • Drugo, kada server sa kojim trebate raditi (na primjer, web stranica ili neka vrsta WEB aplikacije), nije planirano da podržava SOAP vezu.
- Koja je alternativa SOAP vezi moguća?

Veoma popularna opcija - http veza.

U web baziranim sistemima (PHP, Android, iOS) lakše je raditi sa http zahtjevima nego sa SOAP zahtjevima. A za ne baš složene projekte, tehnologija http zahtjeva je sasvim prikladna.

Klasično rješenje (koristeći metodu http zahtjeva) je zadatak integracije 1C baze podataka i WEB stranice. Na primjer, informacije o asortimanu i cijenama se prenose na stranicu, a informacije o prihvaćenim narudžbama se vraćaju sa stranice.

Tipično je da se u tipičnim 1C konfiguracijama integracija sa lokacijama implementira pomoću http zahtjeva.
Dakle, pogledajmo tehnologiju http zahtjevi Na primjer interakcija između 1C (klijent, 1C 8) i WEB sajta (PHP, server).

1. Uspostavljanje veze i metode za prosljeđivanje parametara u http zahtjevu

Primjer uspostavljanja veze sa serverom sa strane 1C:
/////////////////////////////////////////////////////////////////////////////

zaštićeno = lažno;
HTTPConnect = novi HTTPConnect("localhost/wsClient10/json/testHTTPQuery11.php", Zaštićeno);

////////////////////////////////////////////////////////////////////////////
Kao što znate, postoje dvije metode za prijenos parametara sa klijenta na server putem http protokola:

(1) Metoda "dobi";

Parametri (kao što su ime i lozinka) su navedeni direktno u URL-u poziva servera.

Odnosno, interaktivni poziv skripti (direktno iz WEB pretraživača) bi izgledao ovako:

U 1C:8, za programsko pozivanje servera (i prosljeđivanje parametara metoda Get), predviđena je metoda "Get".

primjer:
zaštićeno = lažno;
HTTPConnect = novi HTTPConnect("localhost", Secure);
HTTPConnect.Get("wsClient10/json/testHTTPQuery11.php?nameVasya&password=123",OutputFileName);

gdje OutputFileName: Ime datoteke u koju su smješteni podaci vraćeni sa servera.
Odnosno, kao rezultat obrade zahtjeva, server vraća rezultat u 1C, a zatim (automatski) se generiše datoteka koja sadrži rezultat.

Shodno tome, nakon toga, u "1C" je potrebno (programski) pročitati ovu datoteku i izvući iz nje dobiveni rezultat. To je sve.

(2) "post" metoda;

U ovoj opciji, parametri se ne postavljaju u URL, već se prenose zasebno, u tijelu http veze.

Jasno je da je ključno ograničenje metode dobiti je obim i sadržaj prenetih podataka. Odnosno uz pomoć dobiti Mogu se proslijediti samo znakovi, a dužina URL niza je ograničena.

Metoda pošta Možete prenositi podatke različitog sadržaja, uklj. i proizvoljnih fajlova.
dakle, pošta za integracijske zadatke je funkcionalniji i nastavit ćemo raditi s njim.

Za primanje/prenos podataka između 1C i WEB stranice koristit ćemo tekstualne datoteke.
A mi ćemo “pakirati/izvući” podatke iz fajlova koristeći nam već poznatu JSON tehnologiju! Ovo će nas praktično spasiti od potrebe da "raščlanimo" fajl na strani 1C i na strani PHP.

Za pozivanje servera i prijenos parametara na njega pomoću metode "post", 1C:8 pruža metodu: SendForProcessing

I tako, dajmo primjer u kojem na strani 1C izvode se svi koraci obrade http zahtjev:

Prvo, zapišimo akcioni plan (uvećan):

A sada njegova softverska implementacija u 1C:8

////////////////////

// 1. Popuniti strukturu prenesenih podataka
postDataToPHP = nova struktura;
postDataToPHP.Insert("param1","ivanon");
postDataToPHP.Insert("param2","ivan");
postDataToPHP.Insert("param3","ivanovich");

// 2. Pretvorite podatke u JSON string
JSON = Process.JSON.Create();
jsPostDataToPHP = JSON.WriteJSON(postDataToPHP);


// 3. Kreirajte privremenu odlaznu poruku (prenosi se na server pomoću POST metode)
// datoteku, stavi JSON string u nju.
tFile = novi tekstualni dokument;
stringData = jsPostDataToPHP;
tFile.AddLine(stringData);


// 4. Dobiti ime za privremeni odlazni fajl. Sadržat će odlazne podatke u obliku JSON stringa
OutgoingFileName = GetTemporaryFileName(".txt");

tFile.Write(OutgoingFileName,TextEncoding.UTF);

// 5. Dobiti ime za privremeni ulazni fajl. Dobit će JSON string: odgovor PHP servera
InputFileName = GetTemporaryFileName(".txt");


// 6. Uspostavite HTTP vezu sa serverom
zaštićeno = lažno;
HTTPConnect = novi HTTPConnect("localhost/wsClient10/json/testHTTPQuery10.php", Zaštićeno);


// 7. Izvršimo HTTP zahtjev. Prebacimo odlazni fajl na server (fajl sadrži JSON objekat, tj. izlazne parametre)


HTTPConnect.SendForProcessing(OutgoingFileName,"/json/",IncomingFileName);


// I mi ćemo dobiti odgovor od servera (dolazni fajl). Datoteka sadrži //JSON objekt (tj. podatke vraćene sa servera)

// 8. Izvadite podatke primljene sa servera iz dolazne datoteke
ResponseFile = novi tekstualni dokument;
ResponseFile.Read(InputFileName,TextEncoding.UTF);
json_Data = ResponseFile.GetString(1);
mData = JSON.ReadJSON(json_Data);


// 9. Prikaži primljene podatke za korisnika
Izvještaj(mData["v1"]);
Izvještaj(mData["v2"]);


// 10. Izbrišite korištene (više nisu potrebne) privremene datoteke.
DeleteFiles(OutgoingFileName);
DeleteFiles(InputFileName);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

I na kraju, primjer u PHP-u za obradu zahtjeva na strani servera:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. Dobiti niz podataka iz dolaznog fajla
$json_filedata = file_get_contents("php://input");
// 2. Odrežite sve nepotrebno (dodata su 2 servisna znaka), što // ometa konverziju iz JSON-a
$jsData = trim(ltrim($json_filedata));
$dlinaStr = strlen($jsData);
$_jsData = "";
$i=1;
dok ($i<$dlinaStr) {
ako ($i>2) (
$_jsData = $_jsData.substr($jsData, $i, 1);
}
$i++;
}
// 3. Pretvorite podatke iz JSON-a u objekt (strukturu)
$mData = json_decode($_jsData);
// 4. Kreirajmo drugu strukturu koju ćemo ispuniti podacima i // vratiti u 1C
klasa returnData(
var $v1;
var $v2;
}
$sReturnData = novi returnData;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. Pretvorite podatke strukture u JSON string
$json_returnData = json_encode($sReturnData);
// 6. Vratite podatke u 1C (izlazni podaci će biti preusmjereni u datoteku, koja će biti vraćena u 1C)
echo $json_returnData;
?>

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

To je sve. Kompaktan i funkcionalan!

5. Zadaci na zahtjev (projektni slučajevi)

U zaključku ću navesti one koji su de facto sada najtraženiji od strane kupaca, a koji se rješavaju korištenjem WEB servisa i http zahtjeva.

Naslov teme je zaista pitanje, jer... Ni sam ne znam šta je to i po prvi put ću pokušati s tim raditi u okviru ovog članka. Jedina stvar koju mogu garantirati je da će kod predstavljen u nastavku raditi, ali moje fraze će biti samo pretpostavke i nagađanja o tome kako ja sam sve ovo razumijem. Dakle, idemo...

Uvod

Moramo početi od toga zašto je nastao koncept web servisa. U vrijeme kada se ovaj koncept pojavio u svijetu, već su postojale tehnologije koje su omogućavale interakciju aplikacija na daljinu, gdje je jedan program mogao pozvati neku metodu u drugom programu, koji bi mogao biti pokrenut na računaru koji se nalazi u drugom gradu ili čak državi. Sve ovo je skraćeno RPC (Remote Procedure Calling). Primjeri uključuju CORBA tehnologije, a za Javu - RMI (Remote Method Invoking). I čini se da je sve u njima dobro, pogotovo u CORBI, jer... Možete raditi s njim u bilo kojem programskom jeziku, ali nešto je ipak nedostajalo. Vjerujem da je nedostatak CORBA-e to što radi preko nekih vlastitih mrežnih protokola umjesto jednostavnog HTTP-a, koji će stati kroz svaki firewall. Ideja web servisa je bila da kreira RPC koji bi se ubacivao u HTTP pakete. Tako je započeo razvoj standarda. Koji su osnovni koncepti ovog standarda:
  1. SOAP. Prije pozivanja udaljene procedure, trebate opisati ovaj poziv u XML datoteci u SOAP formatu. SOAP je jednostavno jedna od mnogih XML oznaka koje se koriste u web servisima. Sve što želimo da negdje pošaljemo putem HTTP-a prvo se konvertuje u XML SOAP opis, zatim se ubacuje u HTTP paket i šalje na drugi računar na mreži putem TCP/IP-a.
  2. WSDL. Postoji web servis, tj. program čije metode se mogu pozvati na daljinu. Ali standard zahtijeva da ovaj program bude popraćen opisom koji kaže da "da, u pravu ste - ovo je zaista web servis i iz njega možete pozvati takve i takve metode." Ovaj opis je predstavljen drugom XML datotekom, koja ima drugačiji format, odnosno WSDL. One. WSDL je samo XML datoteka koja opisuje web servis i ništa više.
Zašto tako kratko pitate? Zar ne možete biti konkretniji? Vjerovatno je moguće, ali da biste to učinili, morat ćete se obratiti knjigama kao što je T. Mashnin, “Java Web Services”. Tamo, na prvih 200 stranica, nalazi se detaljan opis svake oznake SOAP i WSDL standarda. Vrijedi li to raditi? Po mom mišljenju ne, jer... sve se to kreira automatski u Javi, a vi samo trebate napisati sadržaj metoda koje bi trebalo da budu pozvane na daljinu. Dakle, API kao što je JAX-RPC pojavio se u Javi. Ako neko ne zna, kada kažu da Java ima takav i takav API, to znači da postoji paket sa skupom klasa koje inkapsuliraju dotičnu tehnologiju. JAX-RPC se vremenom razvijao od verzije do verzije i na kraju postao JAX-WS. WS je očigledno skraćenica za WebService i mogli biste pomisliti da je ovo jednostavno preimenovanje RPC-a u popularnu riječ ovih dana. Ovo nije tačno, jer Sada su web servisi odmakli od prvobitne ideje i omogućavaju vam ne samo pozivanje udaljenih metoda, već i jednostavno slanje poruka dokumenata u SOAP formatu. Još ne znam zašto je to potrebno; malo je vjerovatno da će ovdje odgovor biti „za svaki slučaj da bude potrebno“. I sam bih volio da učim od iskusnijih drugova. I na kraju, tada se pojavio JAX-RS za takozvane RESTful web servise, ali to je tema posebnog članka. Uvod se ovdje može završiti, jer... Zatim ćemo naučiti raditi sa JAX-WS.

Opšti pristup

U web servisima uvijek postoje klijent i server. Server je naš web servis i ponekad se naziva krajnja tačka (kao u krajnjoj tački do koje dolaze SOAP poruke od klijenta). Moramo uraditi sljedeće:
  1. Opišite sučelje našeg web servisa
  2. Implementirajte ovaj interfejs
  3. Pokrenite našu web uslugu
  4. Napišite klijenta i daljinski pozovite željenu metodu web usluge
Web servis možete pokrenuti na različite načine: ili opisati klasu s main metodom i pokrenuti web uslugu direktno kao server, ili je postaviti na server kao što je Tomcat ili bilo koji drugi. U drugom slučaju, mi sami ne pokrećemo novi server i ne otvaramo drugi port na računaru, već jednostavno kažemo Tomcat servlet kontejneru da „mi smo ovde napisali klase veb servisa, molimo vas da ih objavite tako da svi koji vas kontaktiraju mogu koristite našu web uslugu." Bez obzira na način pokretanja web servisa, mi ćemo imati istog klijenta.

Server

Pokrenimo IDEA i kreirajmo novi projekat Kreirajte novi projekat. Naznačimo ime HelloWebService i pritisnite dugme Sljedeći, zatim dugme Završi. U folderu src kreirajmo paket ru.javarush.ws. U ovom paketu ćemo kreirati sučelje HelloWebService: paket ru. javarush. ws; // ovo su napomene, tj. način da označimo naše klase i metode, // u vezi s tehnologijom web usluga import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. sapun. SOAPBinding; // kažemo da će naš interfejs raditi kao web servis@WebService // kažemo da će se web servis koristiti za pozivanje metoda@SOAPBinding (style = SOAPBinding. Style. RPC) javni interfejs HelloWebService ( // kažemo da se ova metoda može pozvati na daljinu@WebMethod public String getHelloString(String name) ; ) U ovom kodu, klase WebService i WebMethod su takozvane napomene i ne rade ništa osim što označavaju naš interfejs i njegov metod kao web servis. Isto se odnosi i na klasu SOAPBinding. Jedina razlika je u tome što je SOAPBinding napomena s parametrima. U ovom slučaju se koristi parametar stila sa vrijednošću koja pokazuje da web servis neće raditi kroz poruke dokumenta, već kao klasični RPC, tj. za pozivanje metode. Hajde da implementiramo logiku našeg interfejsa i kreiramo klasu HelloWebServiceImpl u našem paketu. Inače, napominjem da je završetak klase sa Impl-om konvencija u Javi, prema kojoj se tako označava implementacija interfejsa (Impl - od riječi implementacija, tj. implementacija). Ovo nije uslov i slobodno možete da imenujete klasu kako god želite, ali to zahtevaju dobri maniri: paket ru. javarush. ws; // ista napomena kao kod opisa interfejsa, import javax. jws. WebService; // ali ovdje se koristi s parametrom endpointInterface, // označavajući puni naziv klase sučelja našeg web servisa@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") javna klasa HelloWebServiceImpl implementira HelloWebService ( @Override public String getHelloString (ime stringa) ( // samo vrati pozdrav return "Zdravo, " + ime + "!" ; ) ) Pokrenimo naš web servis kao samostalan server, tj. bez učešća Tomcata i aplikacijskih servera (ovo je tema za posebnu raspravu). Da biste to učinili, u strukturi projekta u mapi src Kreirajmo paket ru.javarush.endpoint, iu njemu ćemo kreirati HelloWebServicePublisher klasu sa main metodom: package ru. javarush. krajnja tačka; // klasa za pokretanje web servera sa web servisima import javax. xml. ws. Endpoint; // klasa našeg web servisa import ru. javarush. ws. HelloWebServiceImpl; javna klasa HelloWebServicePublisher ( public static void main (String... args) ( // pokretanje web servera na portu 1986 // i na adresu navedenu u prvom argumentu, // pokreće web servis proslijeđen u drugom argumentu Krajnja tačka. objaviti ( "http://localhost:1986/wss/hello", novi HelloWebServiceImpl () ) ; ) ) Sada pokrenimo ovu klasu klikom Shift+F10. Ništa se neće pojaviti u konzoli, ali server radi. Ovo možete provjeriti tako što ćete upisati liniju http://localhost:1986/wss/hello?wsdl u svoj pretraživač. Stranica koja se otvara, s jedne strane, dokazuje da imamo web server (http://) koji radi na portu 1986 na našem računaru (localhost), a sa druge strane pokazuje WSDL opis našeg web servisa. Ako zaustavite aplikaciju, opis će postati nedostupan, kao i sam web servis, tako da to nećemo raditi, nego ćemo prijeći na pisanje klijenta.

Klijent

U fascikli projekta src Kreirajmo paket ru.javarush.client i u njemu klasu HelloWebServiceClient sa glavnim metodom: paket ru. javarush. klijent; // potreban za dobivanje wsdl opisa i kroz njega // doći do samog web servisa import java. net. URL; // ovaj izuzetak će se dogoditi kada radite s URL objektom import java. net. MalformedURLException; // klase za raščlanjivanje xml-a sa wsdl opisom // i dođemo do servisne oznake u njoj import javax. xml. imenskog prostora. QName; import javax. xml. ws. Service; // sučelje našeg web servisa (treba nam više) import ru. javarush. ws. HelloWebService; javna klasa HelloWebServiceClient (javni statički void main (String args) izbacuje MalformedURLException ( // kreiramo vezu do wsdl opisa URL url = novi URL ( "http://localhost:1986/wss/hello?wsdl") ; // Gledamo parametre sljedećeg konstruktora u prvoj oznaci WSDL opisa - definicije // pogledajte 1. argument u atributu targetNamespace // pogledajte 2. argument u atributu name QName qname = novo QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ; // Sada možemo doći do servisne oznake u wsdl opisu, Servisna usluga = Servis. kreirati (url, qname) ; // a zatim do oznake porta koja je ugniježđena u njemu, tako da // dobijemo vezu do objekta web usluge udaljenog od nas HelloWebService hello = usluga. getPort(HelloWebService.class); // Ura! Sada možete pozvati udaljenu metodu Sistem. van. println (zdravo. getHelloString ("JavaRush") ) ; ) ) Dao sam maksimum komentara na kod u listingu. Nemam šta da dodam, pa krenimo (Shift+F10). Trebali bismo vidjeti tekst u konzoli: Zdravo, JavaRush! Ako ga niste vidjeli, vjerovatno ste zaboravili pokrenuti web uslugu.

Zaključak

Ova tema je pružila kratak izlet u web servise. Još jednom ću reći da je mnogo toga što sam napisao moja pretpostavka o tome kako to funkcionira, i stoga mi ne treba previše vjerovati. Bio bih zahvalan ako me upućeni isprave, jer ću tada nešto naučiti. UPD.

Naslov teme je zaista pitanje, jer... Ni sam ne znam šta je to i po prvi put ću pokušati s tim raditi u okviru ovog članka. Jedina stvar koju mogu garantirati je da će kod predstavljen u nastavku raditi, ali moje fraze će biti samo pretpostavke i nagađanja o tome kako ja sam sve ovo razumijem. Dakle, idemo...

Uvod

Moramo početi od toga zašto je nastao koncept web servisa. U vrijeme kada se ovaj koncept pojavio u svijetu, već su postojale tehnologije koje su omogućavale interakciju aplikacija na daljinu, gdje je jedan program mogao pozvati neku metodu u drugom programu, koji bi mogao biti pokrenut na računaru koji se nalazi u drugom gradu ili čak državi. Sve ovo je skraćeno RPC (Remote Procedure Calling). Primjeri uključuju CORBA tehnologije, a za Javu - RMI (Remote Method Invoking). I čini se da je sve u njima dobro, pogotovo u CORBI, jer... Možete raditi s njim u bilo kojem programskom jeziku, ali nešto je ipak nedostajalo. Vjerujem da je nedostatak CORBA-e to što radi preko nekih vlastitih mrežnih protokola umjesto jednostavnog HTTP-a, koji će stati kroz svaki firewall. Ideja web servisa je bila da kreira RPC koji bi se ubacivao u HTTP pakete. Tako je započeo razvoj standarda. Koji su osnovni koncepti ovog standarda:
  1. SOAP. Prije pozivanja udaljene procedure, trebate opisati ovaj poziv u XML datoteci u SOAP formatu. SOAP je jednostavno jedna od mnogih XML oznaka koje se koriste u web servisima. Sve što želimo da negdje pošaljemo putem HTTP-a prvo se konvertuje u XML SOAP opis, zatim se ubacuje u HTTP paket i šalje na drugi računar na mreži putem TCP/IP-a.
  2. WSDL. Postoji web servis, tj. program čije metode se mogu pozvati na daljinu. Ali standard zahtijeva da ovaj program bude popraćen opisom koji kaže da "da, u pravu ste - ovo je zaista web servis i iz njega možete pozvati takve i takve metode." Ovaj opis je predstavljen drugom XML datotekom, koja ima drugačiji format, odnosno WSDL. One. WSDL je samo XML datoteka koja opisuje web servis i ništa više.
Zašto tako kratko pitate? Zar ne možete biti konkretniji? Vjerovatno je moguće, ali da biste to učinili, morat ćete se obratiti knjigama kao što je T. Mashnin, “Java Web Services”. Tamo, na prvih 200 stranica, nalazi se detaljan opis svake oznake SOAP i WSDL standarda. Vrijedi li to raditi? Po mom mišljenju ne, jer... sve se to kreira automatski u Javi, a vi samo trebate napisati sadržaj metoda koje bi trebalo da budu pozvane na daljinu. Dakle, API kao što je JAX-RPC pojavio se u Javi. Ako neko ne zna, kada kažu da Java ima takav i takav API, to znači da postoji paket sa skupom klasa koje inkapsuliraju dotičnu tehnologiju. JAX-RPC se vremenom razvijao od verzije do verzije i na kraju postao JAX-WS. WS je očigledno skraćenica za WebService i mogli biste pomisliti da je ovo jednostavno preimenovanje RPC-a u popularnu riječ ovih dana. Ovo nije tačno, jer Sada su web servisi odmakli od prvobitne ideje i omogućavaju vam ne samo pozivanje udaljenih metoda, već i jednostavno slanje poruka dokumenata u SOAP formatu. Još ne znam zašto je to potrebno; malo je vjerovatno da će ovdje odgovor biti „za svaki slučaj da bude potrebno“. I sam bih volio da učim od iskusnijih drugova. I na kraju, tada se pojavio JAX-RS za takozvane RESTful web servise, ali to je tema posebnog članka. Uvod se ovdje može završiti, jer... Zatim ćemo naučiti raditi sa JAX-WS.

Opšti pristup

U web servisima uvijek postoje klijent i server. Server je naš web servis i ponekad se naziva krajnja tačka (kao u krajnjoj tački do koje dolaze SOAP poruke od klijenta). Moramo uraditi sljedeće:
  1. Opišite sučelje našeg web servisa
  2. Implementirajte ovaj interfejs
  3. Pokrenite našu web uslugu
  4. Napišite klijenta i daljinski pozovite željenu metodu web usluge
Web servis možete pokrenuti na različite načine: ili opisati klasu s main metodom i pokrenuti web uslugu direktno kao server, ili je postaviti na server kao što je Tomcat ili bilo koji drugi. U drugom slučaju, mi sami ne pokrećemo novi server i ne otvaramo drugi port na računaru, već jednostavno kažemo Tomcat servlet kontejneru da „mi smo ovde napisali klase veb servisa, molimo vas da ih objavite tako da svi koji vas kontaktiraju mogu koristite našu web uslugu." Bez obzira na način pokretanja web servisa, mi ćemo imati istog klijenta.

Server

Pokrenimo IDEA i kreirajmo novi projekat Kreirajte novi projekat. Naznačimo ime HelloWebService i pritisnite dugme Sljedeći, zatim dugme Završi. U folderu src kreirajmo paket ru.javarush.ws. U ovom paketu ćemo kreirati sučelje HelloWebService: paket ru. javarush. ws; // ovo su napomene, tj. način da označimo naše klase i metode, // u vezi s tehnologijom web usluga import javax. jws. WebMethod; import javax. jws. WebService; import javax. jws. sapun. SOAPBinding; // kažemo da će naš interfejs raditi kao web servis@WebService // kažemo da će se web servis koristiti za pozivanje metoda@SOAPBinding (style = SOAPBinding. Style. RPC) javni interfejs HelloWebService ( // kažemo da se ova metoda može pozvati na daljinu@WebMethod public String getHelloString(String name) ; ) U ovom kodu, klase WebService i WebMethod su takozvane napomene i ne rade ništa osim što označavaju naš interfejs i njegov metod kao web servis. Isto se odnosi i na klasu SOAPBinding. Jedina razlika je u tome što je SOAPBinding napomena s parametrima. U ovom slučaju se koristi parametar stila sa vrijednošću koja pokazuje da web servis neće raditi kroz poruke dokumenta, već kao klasični RPC, tj. za pozivanje metode. Hajde da implementiramo logiku našeg interfejsa i kreiramo klasu HelloWebServiceImpl u našem paketu. Inače, napominjem da je završetak klase sa Impl-om konvencija u Javi, prema kojoj se tako označava implementacija interfejsa (Impl - od riječi implementacija, tj. implementacija). Ovo nije uslov i slobodno možete da imenujete klasu kako god želite, ali to zahtevaju dobri maniri: paket ru. javarush. ws; // ista napomena kao kod opisa interfejsa, import javax. jws. WebService; // ali ovdje se koristi s parametrom endpointInterface, // označavajući puni naziv klase sučelja našeg web servisa@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") javna klasa HelloWebServiceImpl implementira HelloWebService ( @Override public String getHelloString (ime stringa) ( // samo vrati pozdrav return "Zdravo, " + ime + "!" ; ) ) Pokrenimo naš web servis kao samostalan server, tj. bez učešća Tomcata i aplikacijskih servera (ovo je tema za posebnu raspravu). Da biste to učinili, u strukturi projekta u mapi src Kreirajmo paket ru.javarush.endpoint, iu njemu ćemo kreirati HelloWebServicePublisher klasu sa main metodom: package ru. javarush. krajnja tačka; // klasa za pokretanje web servera sa web servisima import javax. xml. ws. Endpoint; // klasa našeg web servisa import ru. javarush. ws. HelloWebServiceImpl; javna klasa HelloWebServicePublisher ( public static void main (String... args) ( // pokretanje web servera na portu 1986 // i na adresu navedenu u prvom argumentu, // pokreće web servis proslijeđen u drugom argumentu Krajnja tačka. objaviti ( "http://localhost:1986/wss/hello", novi HelloWebServiceImpl () ) ; ) ) Sada pokrenimo ovu klasu klikom Shift+F10. Ništa se neće pojaviti u konzoli, ali server radi. Ovo možete provjeriti tako što ćete upisati liniju http://localhost:1986/wss/hello?wsdl u svoj pretraživač. Stranica koja se otvara, s jedne strane, dokazuje da imamo web server (http://) koji radi na portu 1986 na našem računaru (localhost), a sa druge strane pokazuje WSDL opis našeg web servisa. Ako zaustavite aplikaciju, opis će postati nedostupan, kao i sam web servis, tako da to nećemo raditi, nego ćemo prijeći na pisanje klijenta.

Klijent

U fascikli projekta src Kreirajmo paket ru.javarush.client i u njemu klasu HelloWebServiceClient sa glavnim metodom: paket ru. javarush. klijent; // potreban za dobivanje wsdl opisa i kroz njega // doći do samog web servisa import java. net. URL; // ovaj izuzetak će se dogoditi kada radite s URL objektom import java. net. MalformedURLException; // klase za raščlanjivanje xml-a sa wsdl opisom // i dođemo do servisne oznake u njoj import javax. xml. imenskog prostora. QName; import javax. xml. ws. Service; // sučelje našeg web servisa (treba nam više) import ru. javarush. ws. HelloWebService; javna klasa HelloWebServiceClient (javni statički void main (String args) izbacuje MalformedURLException ( // kreiramo vezu do wsdl opisa URL url = novi URL ( "http://localhost:1986/wss/hello?wsdl") ; // Gledamo parametre sljedećeg konstruktora u prvoj oznaci WSDL opisa - definicije // pogledajte 1. argument u atributu targetNamespace // pogledajte 2. argument u atributu name QName qname = novo QName ("http://ws.site/" , "HelloWebServiceImplService") ; // Sada možemo doći do servisne oznake u wsdl opisu, Servisna usluga = Servis. kreirati (url, qname) ; // a zatim do oznake porta koja je ugniježđena u njemu, tako da // dobijemo vezu do objekta web usluge udaljenog od nas HelloWebService hello = usluga. getPort(HelloWebService.class); // Ura! Sada možete pozvati udaljenu metodu Sistem. van. println (zdravo. getHelloString ("JavaRush") ) ; ) ) Dao sam maksimum komentara na kod u listingu. Nemam šta da dodam, pa krenimo (Shift+F10). Trebali bismo vidjeti tekst u konzoli: Zdravo, JavaRush! Ako ga niste vidjeli, vjerovatno ste zaboravili pokrenuti web uslugu.

Zaključak

Ova tema je pružila kratak izlet u web servise. Još jednom ću reći da je mnogo toga što sam napisao moja pretpostavka o tome kako to funkcionira, i stoga mi ne treba previše vjerovati. Bio bih zahvalan ako me upućeni isprave, jer ću tada nešto naučiti. UPD.

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 mogu čak dodati svoje objekte tipa WEB usluga u standardnu ​​konfiguraciju. 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 zahtjeva, 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 novu uslugu “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 trebate 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 procedure“. 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 je potrebno ovu uslugu "staviti" u javnu domenu kako bi softver treće strane ili drugi 1C sistemi mogli 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 malim 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 da provjerite da li željeni WEB servis ima označeno polje za potvrdu u prvoj koloni i kliknete 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 označava 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šku ili čudne znakove (problemi kodiranja), 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.


Ključne riječi: web servis, web servis, SOAP, WSDL, ws link

Odricanje od odgovornosti i uslovi korišćenja

Svi zaštitni znakovi koji su slučajno spomenuti u ovom članku pripadaju njihovim odgovarajućim vlasnicima.
Ovaj članak je objavljen pod licencom Creative Commons Attribution-Share Alike 3.0 Unported. http://creativecommons.org/licenses/by-sa/3.0/

Još jedno odricanje od odgovornosti (nakon mnogo puta)

Platforma 1C:Enterprise 8 stalno se razvija. Stoga će kod predstavljen u ovom članku generirati grešku u najnovijim verzijama platforme. To se događa, posebno, zbog činjenice da se promijenio redoslijed pozivanja metoda proxy objekta web usluge: na primjer, složeni objekti moraju biti eksplicitno konvertirani u XDTO objekt odgovarajućeg tipa, koristeći Factory odgovarajuće usluge . O tome možete pročitati na našem forumu ili u knjizi “Tehnologije integracije 1C: Enterprise” http://v8.1c.ru/metod/books/book.jsp?id=288

Uvod

Kada se pojavi nova verzija softverskog proizvoda, naravno, prije svega, želite razumjeti šta je novo u njemu. U slučaju 1C:Enterprise 8.1, web servisi su za mene postali tako nova “karakteristika”. O web servisima se dosta pisalo i govorilo, jer ova tehnologija po kompjuterskim standardima postoji dosta dugo. Stoga se neću ponavljati; sve upućujem na Yandex za informacije. Reći ću samo da sa izlaskom novog izdanja platforme 1C:Enterprise 8.1, 1Snikov ima priliku da kreira i koristi tehnologiju web servisa, nalazeći se, da tako kažem, u svom matičnom okruženju. U ovom članku želim pokazati kako koristiti eksterne web servise u svojim razvojima.

Za one koji su potpuno "izvan petlje": o web uslugama "na dohvat ruke"

UREDU, specijalno za tebe Pokušat ću vam reći malo o tome što je web servis i zašto točno OvoČinilo mi se tako „ukusnom“ inovacijom platforme. Možda znate o COM tehnologiji ili ste čuli nešto o OLE? Prije ili kasnije, svaki pojedini radnik će naići na ovu tehnologiju (naročito ako trebate brzo prenijeti neki direktorij “Zaposleni”, a odjel za ljudske resurse, predviđajući potrebu ponovnog ubacivanja svih 1.500 zaposlenih, spreman je da vas objesi na prvu odgovarajući nokat koji dolazi zajedno).
Da, dakle, u srcu COM tehnologije je ideja mogućnosti pozivanje programskog koda (i pristupanje podacima) jedne aplikacije iz druge aplikacije. Štaviše, mogućnosti učiniti to ne na nivou pojedinačnih procedura i funkcija, već stavljajući na raspolaganje objekata drugu aplikaciju. Kada koristimo OLE, kreiramo objekt u našoj aplikaciji koji je " predstavnik"ili, ako želite, " omotač"nekog objekta aplikacije sa kojim želimo da komuniciramo (tzv. "OLE objekat" ili "COM objekat"). Putem ovog "omotača" objekta, svojstva i metode objekta druge aplikacije postaju nam dostupni , i to samo one čiji je programer Ići Aplikacije su nam dozvolile da ih koristimo objavljivanjem u opisu interfejs. (Pa nisam htela da ulazim u korov, ali nema drugog načina...)
Sada zamislimo to upravo isto aplikacija se nalazi na drugom kompjuteru, pa čak ni ne na lokalnoj mreži (DCOM, CORBA i druge nejasne skraćenice dobro rješavaju takve slučajeve), već negdje daleko, daleko na internetu. Ovdje na scenu stupaju web servisi (također sa nejasnim akronimima: SOAP, WSDL, itd.), koji vam omogućavaju da izvedete sličan “trik” u ovom slučaju: tj. primaju podatke i manipulišu objektima iz aplikacije koja radi na računaru na drugoj strani Interneta.
pod " vanjski"Pod web servisom mislim na web uslugu koja se pruža nekima dobavljač servis (tj. ne naša aplikacija.) U skladu s tim, pod "internim" - web servisom koji ćemo pružiti od, ili, tačnije, zasnovano našu aplikaciju. Kada koristimo eksterne web servise, moramo razumjeti da iako je objekt “wrapper” kreiran u našoj “lokalnoj” aplikaciji, “izvršni kod” ovog objekta se nalazi, možda, na drugoj strani globusa. U isto vrijeme, razmjena između nas I njima odvija se na sada sveprisutnom XML-u, sa svojim dobro poznatim "prednostima" (svestranost i struktura) i "protiv" (naduvavanje), a stari dobri http se koristi kao "prenosna linija".
Da, i ne zaboravite na internet promet! Štaviše, u slučaju eksternih web servisa, većina njih će biti uključena dolazni komponenta.
Sve ostalo je u Yandexu. idemo dalje...

Odakle su noge, tj. krila rastu

Preturajući po Yandexu, pronašao sam prekrasan web servis kompanije Aeroflot, koji vam omogućava da primate informacije o dolasku i odlasku aviona u realnom vremenu, i odlučio sam napraviti neku vrstu „Prikaz aerodroma“ u 1C:Enterprise. Sama usluga živi ovdje: http://webservices.aeroflot.ru/desc_flightinfo.asp

Rekao je: "Idemo!"

Za početak, napravio sam praznu konfiguraciju "1C:Enterprise 8.1" (u vrijeme pisanja imao sam na raspolaganju verziju platforme 8.1.5.123). Zatim sam dodao novi objekat tipa WS-link u svoju konfiguraciju. Kada se od mene zatraži da unesem URL uvezenog WSDL-a, unio sam vezu na WSDL datoteku, koja je navedena na stranici usluge: http://webservices.aeroflot.aero/flightstatus.wsdl (WSDL datoteka je opis web servis. Za detalje idite na Yandex) i ponosno nazvali stvoreni objekat „Aeroflot“. Dvostrukim klikom na ovaj objekat dobio sam stablo sa strukturom web servisa.

Ovo stablo predstavlja “portret” web servisa, kako ga vidi 1Ska. Najzanimljivije je u grani "Web usluge": ovo imena I luke web servisi (zapravo, WSDL datoteka može opisati ne jedan, već nekoliko web servisa, tada će svaki web servis imati svoju granu) i navedeni su metode web servis. To su upravo one „žice“, povlačenjem kojih možete sebi omogućiti pristup podacima koje pruža web servis. Grana "Model podataka" sadrži opis biblioteka tipova podataka koje koristi web usluga.
Kratak sažetak kako koristiti web uslugu obično se može naći na istom mjestu kao i veza do WSDL datoteke. U slučaju Aeroflota, ovo je stranica http://webservices.aeroflot.aero/flightstatus.asmx

"Sada polijetanje, sad slijetanje..."

Za rad sa web servisom u konfiguraciju sam dodao obradu “Departures Display” iu njoj - jedan obrazac koji sam označio kao glavni. Na obrascu sam stavio polje za odabir "Izbor aerodroma", polje za unos "Datum leta", tablu "Tablica" sa dvije stranice "Dolasci" i "Odlasci", dok sam poništio oznaku "Distribuiraj po stranicama" u svojstva panela i polje tabele "Tableboard".
Interakcija sa web servisom odvija se po principu “zahtjev-odgovor”, a za web servis se kreira poseban posrednički objekt. Stoga sam dodao detalje obrasca "ServiceAeroflot" prilagođenog tipa.
Ako pažljivo pročitate opis usluge, možete vidjeti da web servis pruža podatke o dolascima i odlascima putem poziva na metode dolaska i odlaska. U ovom slučaju, obje metode uzimaju šifru aerodroma i željeni datum kao parametre. Osim toga, web servis pruža mogućnost dobijanja liste aerodroma za koje su podaci dostupni u sistemu. Sljedeći scenarij interakcije s web servisom je prilično očigledan:
1. Dobiti listu aerodroma;
2. Odaberite željeni aerodrom i datum;
3. Dobiti podatke o dolascima ili odlascima;
Ali prije nego što pristupite web servisu, morate inicijalizirati posrednički objekat (kao što je WSProxy), što sam i uradio u rukovatelju otvaranja obrasca:
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Prvi parametar je URI imenskog prostora web usluge. To možete saznati otvaranjem svojstava web servisa u stablu WS veza. Drugi i treći parametar prenose ime i port web servisa, respektivno.
(ne brkajte koncepte “ime”, “port”, “proxy” itd. primijenjene na web usluge sa poznatijim konceptima TCP/IP protokola. Ako postoji korespondencija između njih, to je prilično semantičko U opštem slučaju morate shvatiti da su, na primer, port za web servis i TCP port potpuno različite stvari).
Stoga sam inicijalizirao Aeroflot Service objekat tipa WSProxy, koji je u suštini „omot“ web usluge. Preko njega mogu pristupiti metodama web servisa kao „nativnim“ metodama platforme.
Prije svega, dobio sam listu aerodroma i popunio listu polja za odabir "Odaberi aerodrom":

SelectionList=FormElements.AirportSelection.SelectionList; SelectionList.Clear(); AirportList=Aeroflot Service.AirportList().GetList("list"); TotalAirports=ListaAirports.Count(); Za ui=0 do TotalAirports-1 Cycle Airport=ListAirports.Get(ies); SelectionList.Add(Airport.code, ""+Airport.city+" : "+Airport.name); EndCycle;
Ovdje nam treba mali komentar na konstrukciju liste aerodroma = ServiceAeroflot.AirportList().GetList("list");
Činjenica je da su vrijednosti koje vraćaju metode web servisa predstavljene na platformi objektima tipa XDTO Object. Pošto je tema XDTO tehnologije izvan okvira ovog članka, reći ću to samo za transformacije ovaj objekat u listu (što i jeste), nazvao sam njegovu metodu GetList(). Ostatak koda je prilično očigledan, uključujući nazive polja strukture aerodroma, koje sam našao na stranici opisa web usluge.
Sada možete pokrenuti konfiguraciju i provjeriti je li lista polja za odabir popunjena nazivima aerodroma:

"Dan odlaska, dan dolaska..."

Sada imam gotovo sve spremno da moj semafor funkcionira. Ostaje samo da ga "obojim i bacim" :) Eto šta ću uraditi:

Procedura FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("Kôd leta", "Šifra leta"); TableTableboard.Columns.Add(" Kôd avio kompanije", "Aviokompanija"); TableTable.Columns.Add("Broj leta", "Broj"); TableTable.Columns.Add(" AirportTransit", "Aerodromski tranzit"); TableTable.Columns.Add("Aerodrom", "Aerodrom"+?(Dolasci,"odlasci,","dolasci")); TableTable.Columns.Add(" Vremenski raspored", "Po rasporedu"); TableTableboard.Columns.Add(" TimePlanned", "Planirano"); TableTableboard.Columns.Add(" TimeActual", "Stvarni"); TableTable.Columns.Add("Izračunato vrijeme", "Izračunato"); TableTable.Columns.Add("Vrijeme slijetanja", ?(Dolazak,"Slijetanje","Polijetanje")); TableTable. Kolone. Add("Kombinovani let", "Kombinovani let"); TableTable.Columns.Add("Status", "Status"); Ako nije dolazak, onda TableTable.Columns.Add("Registracija", "Registracija"); TableTable .Columns .Add("Landing", "Landing"); EndIf; Elementi obrasca. Tabela semafora. Kreirajte kolone(); Elementi obrasca. Tabela semafora. Kolone. Šifra leta. Vidljivost = False; Ako nije dolazak, onda elementi forme. Scoreboard Tabela. Kolone. Procijenjeno vrijeme. Vidljivost = False; EndIf; Ako je dolazak onda Podaci=Aeroflot usluga.Dolazak(Izbor aerodroma, Datum leta). Dobiti listu("list "); U suprotnom Podaci=Aeroflot usluga.Odlazak(Odabir aerodroma, Let Date).Get List("list "); EndIf; Total Records=Podaci.Broj(); Za ii=0 za TotalRecords-1 Cycle Record=DATA.Get(s); NewRow=TableTable.Add(); NewRow. AirlineCode=Record.company; NewLine.FlightNumber = Entry.flight_no; NewLine.AirportTransit = Entry.airport_inter; NewLine.Airport = Ulaz.aerodrom; NewLine.TimeSchedule=Record.sched; NewLine.TimePlanned=Record.plan; NewLine.TimeActual=Record.fact; NewLine.TimeCalculated=Record.calc; NewLine.LandingTime=Record.real; NewLine.UnionFlight=Record.union_flight_no; NewRow.Status=Record.status; Ako nije dolazak onda NewLine.Registration=Record.is_check; NewLine.Landing = Entry.is_board; endIf; EndCycle; Kraj procedure

Kako bih provjerio kako sve funkcionira, na komandni panel obrasca sam dodao dugme “Ažuriraj” sa odgovarajućom slikom, a u njegov rukovatelj sam napisao sljedeće:

Procedura CommandPanel1 Update(Button) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arrivals); Kraj procedure
Sačuvam, pokrećem, biram, klikam, dobijam:

Pogovor

Iznenađujuće, nakon što je članak napisan i objavljen, ispostavilo se da je ugledni ZAV već objavio sličan primjer na IT-Land-u: http://itland.ru/biblio/detail.php?ID=1060
Kako biste izbjegli moguće optužbe za plagijat, toplo preporučujem da pročitate i ovaj članak i uporedite pristupe autora.