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


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

Značajka članka je li to:

  • Razmatraju se (i međusobno uspoređuju) različite metode i tehnike koje se mogu koristiti pri integraciji 1C, WEB (php) i mobilnih (Ios, Android) aplikacija;
U različiti putevi imaju svoje prednosti i nedostatke, te je racionalno odabrati najjednostavniji, kompaktniji za određeni zadatak.
  • Istovremeno, dani su primjeri rješenja i na strani 1C i na strani WEB poslužitelja (PHP);
Primjeri rješenja mogu biti korisni i 1C programerima i WEB stručnjacima, onima koji rade na raskrižju područja.
  • Sve potrebne informacije prikupljene su zajedno ( upute korak po korak) za "brzi početak" i početak razvoja. Odnosno, kako ne biste gubili puno vremena proučavajući i konfigurirajući WEB poslužitelje, windowse, "borbu" sistemske greške itd.
Članak je upućen:
  • 1C: Programeri i WEB stručnjaci koji proučavaju integraciju pomoću tehnologije web usluga;
  • Projektanti i informatički analitičari moraju razumjeti "bit" i napraviti racionalan izbor tehnologija pri izradi projekata.
U zaključku uvodnog dijela, vrijedi reći da ako ste već imali iskustva u radu s COM/Ole tehnologijama, onda će vam to dobro pomoći u razumijevanju tehnologije WEB usluga.

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

1.2 Primjenjivost tehnologija za zadatke interakcije klijent-poslužitelj.


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


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

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

Točka br. 1.
Dakle, "bit" interakcije klijent-poslužitelj je shvaćena. Određena je tehnologija interakcije. Sada morate stvoriti "poligon" gdje će se odvijati razvoj.

U ovom će se članku na primjerima raspravljati o dvije tehnologije:

Rad s mehanizmom WEB usluga.

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

Rad s http mehanizmom zahtjeva (REST Web usluge).

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

  • Napravite "poligon za testiranje" za razvoj i otklanjanje pogrešaka na programerovom lokalnom WEB poslužitelju (localhost);
  • Nakon završetka razvoja, rezultati se moraju prenijeti na “borbeni” WEB poslužitelj.

U praksi (pogotovo kada se počnete "upoznavati" s tehnologijom WEB usluga), prilikom stvaranja "poligona", kao i pri prijenosu projekta na "borbeni" poslužitelj, nastaje mnogo "rakea".

Dakle, da ne “gubimo” puno vremena na “borbu” s postavkama IIS(Internet Information Server) / ovladavanje poslužiteljem apache, i postavljanje prava Windows pristup, preporučujem sljedeće:

  • (1) Napravite "Poligon" na svom lokalnom radnom stroju. Operativni sustav - Windows 7 (profesionalni ili maksimalni). Sav posao mora biti obavljen pod račun administrator.
  • (2) Postavite bazu podataka 1C 8 u način rada klijent-poslužitelj (MS SQL poslužitelj, preporučujem 2008 R2). Korištenje 1C 8 u načinu klijent-poslužitelj eliminiraće potrebu za dodatnim radom. postavke prava pristupa bazi podataka 1C s WEB poslužitelja.
  • (3) Instalirajte IIS, ako nedostaje. U sustavu Windows možete ga redovito "ponovno instalirati".

Potvrdni okviri za opcije instalacije za IIS komponente mogu se postaviti prema zadanim postavkama.
Važne stvari na koje morate obratiti pozornost su sljedeće opcije (ISAPI ekstenzije - ovo je potrebno za rad sapunskih veza u WEB uslugama i CGI - ovo je potrebno za rad PHP-a)

Nakon završetka instalacije IIS Uvjerimo se da radi. Za ovo, u adresna traka WEB preglednik unesite:

(4) Objavljivanje (povezivanje) 1C baze podataka na WEB poslužitelju.

I tako, WEB poslužitelj IIS instaliran i radi. Objavimo našu 1C bazu podataka i provjerimo je li pristup njoj sada moguć i putem WEB klijenta.

Preporučljivo je na WEB poslužitelju objaviti 1C bazu podataka koja omogućuje rad u načinu upravljane aplikacije (tanki klijent).

Objavljivanje baze podataka 1C vrši se ovako:
U načinu rada konfiguratora morate pozvati stavku "Objavi na web poslužitelju"

b) Navedite parametre objave:

To jest, u direktoriju (mapi) wwwroot tvoja njegova IIS morate stvoriti zasebnu mapu (direktorij) za objavljivanje vaše 1C baze podataka.

wwwroot direktorij će se automatski kreirati kada se IIS instalira
Kreirajmo i odaberimo takvu mapu (wsBase10), odredimo naziv za objavljivanje (također ćemo ga nazvati wsBase10).

Ako iznenada dobijete poruku kao odgovor,

onda se nemoj bojati.

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

A ako kao rezultat toga primite poruku,

znači da je sve radilo.

Vrlo je važno razumjeti da se prilikom objavljivanja baze podataka 1C i njegovih WEB usluga na "borbenom" poslužitelju (na primjer, Windows 2008 R2) često pojavljuju pogreške ako se odlučite koristiti web poslužitelj IIS.

Savjet: nemojte instalirati na "borbeni" poslužitelj IIS! Instalirati apache.

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

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

Međutim, za suradnju apache s bazom podataka 1C (i web uslugama) postoji nekoliko vrlo važnih zahtjeva koje morate znati (donesite to svom administratoru sustava).

1. Prilikom postavljanja apache Svakako omogućite podršku za ISAPI proširenja.

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

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

Ovaj korisnik mora imati autentifikaciju operacijski sustav. I trebate navesti korisnika pod čijim imenom se pokreće apache.

... Završili smo s apacheom i vratimo se opet našem "Poligonu".

Evo vidimo - 1C počinje. WEB poslužitelj zajedno s 1C radi.
4. Instalirajte PHP uslugu za WINDOWS.

Trebat će vam ako, kao dio vašeg zadatka, trebate razviti klijenta (web stranice za pristup 1C) ili poslužitelja (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:

  • Za izradu klijentskog dijela pri razvoju 1C WEB usluga;
  • Za razvoj serverskog dijela, kod razvoja REST web servisa (http zahtjevi).

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

Nakon instaliranja Notepada++, odmah ćemo provjeriti radi li PHP za nas. Kreirajmo jednostavnu skriptu hello.php za ovo. Smjestimo ga u direktorij wsClient i pokrenimo skriptu iz preglednika:

Sve u redu. PHP radi. Poligon je u potpunosti spreman.

3. Izrada WEB servisa, soap zahtjeva, XDTO i JSON. Primjeri 1C i PHP. U ovoj fazi, trebali biste imati spreman “Polygon” i možete početi razvijati WEB usluge.

- Gdje započeti proučavanje ove tehnologije? Naravno, s klasičnim problemom poput “Hello word”!

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

1.1. Dodajmo u bazu (wsBase10) web servis "_Izračuni po tarifama"

Postavimo naziv datoteke publikacije na "calcOrder10.1cws". URI imenski prostor također mora biti naveden. U principu, možete navesti bilo koji naziv.

1.2. Dodajmo operaciju "getHello" unutar web servisa "_Calculations by Tariffs".

Suština operacije bit će najjednostavnija - uzmite tri parametra (stringove, brojeve) kao ulaz (od klijenta) i vratite mu objedinjujući niz (kao rezultat). Tip povratne vrijednosti bit će primitivan - niz.

Nećemo označiti potvrdni okvir "U transakciji", budući da operacija neće promijeniti podatke u samoj bazi podataka 1C.

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

1.3. Dodajmo dolazne parametre za operaciju "getHello".

Smjer prijenosa je "ulaz". Odnosno, prenose se s klijenta na poslužitelj.

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

Funkcija getHello(strParametar, floatParametar, integerParametar)
return strParametar+niz(floatParametar+integerParametar)
EndFunction

////////

1.5. Ovim je rad na izradi jednostavne WEB usluge završen. A sada, trebate objaviti WEB servis "_Obračuni po tarifama".

Prije objavljivanja web servisa na testnom mjestu, sve ćemo korisnike ukloniti s popisa korisnika našeg informacijska baza. Odnosno, popis korisnika učinit ćemo "praznim".

- Zašto to učiniti?

Na testnom mjestu samo će se programer moći spojiti na WEB usluge, te stoga nema smisla pružati autentifikaciju korisnika prilikom spajanja na WEB uslugu.

Odnosno, namjerno ćemo pojednostaviti naš rad s WEB uslugama na testnom mjestu.

Prilikom uspostavljanja veze nećemo morati navesti prijavu i lozinku.
Ali na "borbenom" poslužitelju, naravno, morat ćete osigurati autentifikaciju.
Da biste to učinili (kao što je ranije rečeno), morat ćete zasebno stvoriti korisnika u "borbenoj" bazi podataka, u čije ime će se pokrenuti sam WEB poslužitelj. Zatim, prilikom uspostavljanja veze s WEB uslugom (sapunska veza), također ćete morati navesti prijavu i lozinku ovog korisnika.

1.6. I tako, objavimo WEB uslugu:

Imajte na umu da ne moramo označiti potvrdni okvir "Koristi provjeru autentičnosti operativnog sustava na web poslužitelju". To je zato što ovaj način rada predviđeno samo za WEB poslužitelj IIS, a na "borbenom" serveru će raditi Apache.

1.7. Kreirajmo klijentski dio i isprobajmo rad WEB poslužitelja.

A) Prvo, pozovimo klijenta iz 1C.

Učinimo to jednostavno. U bilo kojoj drugoj 1C bazi podataka koju imate, mi ćemo kreirati vanjska obrada. U ovoj obradi spojit ćemo se na WEB uslugu, koristiti operaciju “getHello”, proslijediti parametre tamo i primiti odgovor od poslužitelja.
Kod za "1C" bit će nešto poput ovoga:

/////

&NaKlijentu
Procedura Izvrši upit10 (naredba)
// Umetanje sadržaja rukovatelja.
LineResult = SERVER_ExecuteWSQuery10();
Upozorenje(StringResult);
Kraj postupka
&Na poslužitelju bez konteksta
Funkcija SERVER_RunWSRequest10()
// Nećemo provoditi autentifikaciju na mjestu testiranja!
Korisničko ime = nedefinirano;
Lozinka = nedefinirana;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",korisničko ime,zaporka);
Proxy.User = Korisničko ime;
Proxy.Password = Nedefinirano;
strResult = Proxy.getHello("Ivanov",100.35,20);
return strResult;
EndFunction ///////////////////////////////////////////////////////////////////////////////////////

Testirajmo rad funkcije SERVER_ExecuteWSRequest10().

U REDU. Djela!
b) Sada uputimo klijentski poziv web servisu iz PHP-a.
Kod PHP skripte bit će otprilike ovakav:

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

javljanje_pogreške(E_GREŠKA); // 1. Onemogućite nepotrebne poruke
// 2. Onemogući predmemoriranje za SOAP. Ako se to ne učini,


// 3. Uspostavite sapunsku vezu
$klijent = novi SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
niz(
"login" => null, //prijava, nećemo izvršiti autentifikaciju
"lozinka" => null, //lozinka
"trag" => istina,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"kompresija" =>
);
// 4. Popunjavanje niza proslijeđenih parametara
$params["strParametr"] = "test_Soap10:";
$params["floatParametar"] = 10,34;
$params["integerParametar"] = 12;
// 5. Izvedite operaciju getHello
$rezultat = $klijent->getHello($params);
// 6. Prikaz rezultata na ekranu
var_dump($rezultat);
?>

////
///

Pozovimo skriptu iz preglednika i provjerimo njen rad:

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

Rezimirajmo neke rezultate:
Problem jednostavnog WEB servisa je riješen. A sada možete početi stvarati 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 slati/primati objektne (agregatne) tipove podataka.

2. Zadatak izrade WEB usluge korištenjem XDTO paketa.

Kao i prije, pogledajmo primjere u 1C i PHP.

Postavimo si sljedeći zadatak: WEB usluga nam ne bi trebala vratiti niz, već objektne podatke - "tablicu vrijednosti" (točnije, to će biti niz objekata!).

Kako bi se opisale različite strukture podataka (koje će biti potrebne prilikom primanja/prijenosa na WEB poslužitelj), platforma 1C:8 nudi mehanizam za XDTO pakete.

Oni. Prvo opisujemo sve tipove podataka koji su nam potrebni, a zatim označavamo:

  • S kojim XDTO paketima može raditi naša WEB usluga (možete odrediti jedan ili popis paketa);
  • Za svaki parametar operacije i rezultat koji vraća možete odrediti koja će vrsta podataka (iz XDTO paketa) biti.
Zatim ćemo pogledati rad s XDTO koristeći primjer primanja određene "tarifne tablice" s poslužitelja:

Kreirajmo operaciju GetTzTariffs_0 koja će vratiti podatke tipa tzTariffs.

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

- Kako to vidjeti?

  • Ako je parametar "maximum" naveden kao "-1", tada broj ovih objekata nije ograničen (tablica s neograničenim brojem redaka);
  • Ako ne trebamo tablicu, već samo trebamo strukturu (jedan redak), tada bi maksimalne i minimalne vrijednosti trebale biti navedene jednake "1".
  • Zauzvrat, el objekt je struktura koja sadrži atribut tipa objekta (eTarif) i atribut primitivnog tipa (cPrice, komentar).

Spuštajuć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ćuje da jasno opišete hijerarhiju tipova podataka koji će se dalje koristiti u interakciji s WEB uslugom.

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

  • XTDO paket je kreiran;
  • Opisane su sve vrste podataka;
  • Za WEB uslugu naznačeno je korištenje ovog paketa;
  • Za parametre i rezultate rada odabiru se odgovarajući tipovi (iz XDTO paketa)
tada možete prijeći na "punjenje" objekata (struktura, nizova struktura) podacima.

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

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

Funkcija GetTzTariffs_0()
// Umetanje sadržaja rukovatelja.
Vrati GetTZTariffs_0();
EndFunction

Funkcija GetTZTariffs_0()


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

kindOfTariff.active = false;


tarifa.vrsta = kindOfTariff;

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

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

tarifa = FactoryXDTO.Create(tariffType);
tarifa.begdate = CurrentDate();
tarifa.vrsta = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 200;
// Dodavanje 2. reda u tablicu
tzTarife.el.Dodaj(elementTZ);
Povratak tzTarife;
EndFunction

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

&NaKlijentu
Procedura Izvrši upit20 (naredba)
// Umetanje sadržaja rukovatelja.
Upozorenje(SERVER_ExecuteWSQuery20());
Kraj postupka
&Na poslužitelju bez konteksta
Funkcija SERVER_ExecuteWSRequest20()
Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
XDTResult = Proxy.GetTzTariffs_0();
// Pristupimo retku na indeksu nula, zatim atributu eTariff, zatim vrsti ugniježđenog atributa, zatim nazivu ugniježđenog atributa.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sličan poziv iz PHP-a i obrada XDTO rezultata bi bio ovakav:
////////////////////////////////////////////////////////////////////////////////////



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

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

Sada Zakomplicirajmo zadatak još više. Prenesimo isti tip podataka objekta s klijenta na WEB servis (kao parametar). Neka bude tzKind.
Da bismo to učinili, najprije opisujemo ovu vrstu u paketu dataTariffs, a zatim dodajemo operaciju GetTzTariffs_1.

Označ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");
tarifaType = FactoryXDTO.Type(" ", "tarifa");
kindOfTariffType = FactoryXDTO.Type(" ", "kindOfTariff");
// Ispunjavanje tehničkih specifikacija
// 1. red
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Prijevoz";
kindOfTariff.active = false;
tarifa = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tarifa 1";
tarifa.begdate = CurrentDate();
tarifa.vrsta = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 100;
elementTZ.comment = "Opis tarife 1";
// Dodavanje 1. reda u tablicu
tzTarife.el.Dodaj(elementTZ);
// 2. redak
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Isporuka";
kindOfTariff.active = istina;
tarifa = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tarifa 2";
tarifa.begdate = CurrentDate();
tarifa.vrsta = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 200;
elementTZ.comment = "Opis tarife 2";
// Dodavanje 3. reda u tablicu (ispunite ga s ulaznim podacima)
tzTarife.el.Dodaj(elementTZ);
// 3. redak
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
tarifa = FactoryXDTO.Create(tariffType);
tariff.fullName = "Tarifa 3";
tarifa.begdate = CurrentDate();
tarifa.vrsta = kindOfTariff;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTariff = tarifa;
elementTZ.cPrice = 300;
elementTZ.comment = "Opis tarife 3";
// Dodavanje 3. reda u tablicu
tzTarife.el.Dodaj(elementTZ);
Povratak tzTarife;
EndFunction

//////////////////////////////////////////////////////////////////////////////////
Sa strane 1C klijenta morat ćemo pripremiti podatke tipa tzKind i prenijeti ih na WEB uslugu.

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

&NaKlijentu
Procedura Izvrši upit30 (naredba)
// Umetanje sadržaja rukovatelja.
Upozorenje(SERVER_ExecuteWSQuery30());
Kraj postupka
&Na poslužitelju bez konteksta
Funkcija SERVER_ExecuteWSRequest30()
Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
// 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 = "Probna vrsta tarife";
kindOfTariff.active = false;
elementKindType = Proxy.FactoryXDTO.Type(" ", "elementKind");
elementKind = Proxy.XDTO Factory.Create(elementKindType);
elementKind.eKind = kindOfTariff;
elementKind.qty = 10;
// Dodavanje reda u tablicu
tzKind.el.Add(elementKind);
XDTOResult = Proxy.GetTzTzriffs_1(tzKind);
ExampleResult_Name vrste tarife = XDTOResult.el.eTariff.kind.name;
Vrati ExampleResult_Name vrste tarife;
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Želio bih vam skrenuti pozornost na dizajn: Proxy.FactoryXDTO.Type("...

To jest, kada stvaramo objekt XDTO paketa na klijentu, ne moramo pristupiti vlastitoj tvornici XDTO!, već putem proxyja. Odnosno u tvornicu poslužitelja XDTO.

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

Da li je moguće uopće “ne komunicirati” sa XDTO tvornicom, prenositi/primati sa WEB servisa na neki drugi način.. (pogotovo ako klijent nije 1C, već npr. WEB stranica, aplikacija na Androidu, iOS-u , itd.).

Odgovor je- da, možete!
Na primjer, možete koristiti niz kao vrstu parametra. I "spakirajte" (serializirajte) strukture podataka u njega.

Ova tehnologija u WEB programiranju odavno je razvijena i zove se JSON.
Također je velika pomoć što se u PHP-u pakiranje/ekstrahiranje bilo koje strukture/stringa niza vrši u jednom koraku!
Primjer u PHP-u pakiranja objekata u JSON/ekstrahiranje, slanje/primanje na WEB uslugu:

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

// serijaliziraj niz mDelivery u niz i smjesti ga u parametar isporuke
// * Prvo, opišimo strukturu isporuke
dostava razreda(
var $id;
var $provjereno;
var $vrijednost;
}
// Ispunite strukturu nekim podacima
$sDostava = nova dostava;
$sDostava->id = "000000005";
$sDostava->provjereno = TRUE;
$sIsporuka->vrijednost = 0;
// Dodaj ga u polje mDelivery objekata
$mDostava = $sDostava;
// Pretvorite niz mDelivery u JSON niz i postavite rezultat u parametar isporuke
$params["isporuka"] = json_encode($mDelivery);
// Pozovite operaciju ExitCalcOrder na WEB servisu i proslijedite joj parametar (string - isporuka);
$rezultat = $klijent->IzlazCalcOrder($params);
// Dobivanje rezultata operacije ExitCalcOrder u varijablu jsCalcResult (string)
$jsCalcResult = $rezultat->povratak;
// Izvršite obrnutu transformaciju: iz niza 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?
Platforma 1C 8 ne podržava JSON standard, ali to nije problem.
Obrada JSON pretvorbe/ekstrakcije postoji, dostupna je i radi odlično
// Autorska prava © 2010-2012 Alexander Pereverzev
// 1C:JSON . JavaScript Object Notation parser i serijalizator.

Dakle, samo stavite ovu obradu u svoju konfiguraciju i možete jednostavno izvoditi JSON pretvorbe naprijed i nazad:
Primjer serijalizacije 1C objekt u JSON niz:

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

CargoData = nova struktura;
CargoData.Insert("kod",CargoCode);
CargoData.Insert("broj",CargoNumber);
CargoData.Insert("plan", QuantityPlan);
CargoData.Insert("znak",CargoCharacter);
CargoData.Insert("pakiranje", Pakiranje);
CargoData.Insert("damage",Oštećenje pakiranja);
CargoData.Insert("volumen",Volume);
CargoData.Insert("težina",Težina);
CargoData.Insert("status",Status);
jsResult = JSON.WriteJSON(LoadData); //Pretvori rezultat u JSON
return jsRezultat;

Ekstrakt primjera objekt u 1C iz JSON niza:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Zaključno, dat ću primjer pozivanja 1C web usluge iz PHP-a, primajući vraćenu JSON strukturu njegove obrnute transformacije u PHP objekte.

Obratimo pozornost na transformacije iconv("cp1251","utf-8","
i iconv("utf-8","cp1251", koji će biti potreban (prilikom interakcije s PHP-om - 1 C) za pretvaranje ćiriličnih nizova iz cp 1251 kodiranja u utf -8 i natrag.

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

javljanje_pogreške(E_GREŠKA); // Onemogući poruke
// Onemogući predmemoriranje za SOAP. Ako se to ne učini,
// funkcije web servisa neće ispravno raditi.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new 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 = $rezultat->povratak;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>

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

Vjerojatni scenarij je: udaljeni korisnik iz nekog svog programa (npr. s WEB stranice, mobilne aplikacije i sl.) nazove vaš WEB servis i... ne dobije rezultate.. Ili ga dobije, ali nešto nije u redu.

Pitanje: - Kako saznati takve greške i otkloniti pogreške WEB usluge?
Preporučujem da koristite zapisnik za praćenje pogrešaka (i prikupljanje ulaznih parametara "što je dovelo web uslugu do pogreške").

Oni. na mjestu gdje se mogu pojaviti logičke pogreške programski spremiti podatke o pristiglim parametrima u dnevnik registracije (LogRecord)

Ako se "mučite" s "pogreškama tijekom izvođenja", možete ih presresti (pokušaj je iznimka) i "točku po točku" zabilježiti cijelu situaciju.

Kao rezultat toga, pomoću dnevnika moći ćete vidjeti informacije o pogreškama, reproducirati parametre pojave i "poraziti" je u interaktivnom načinu rada u alatu za ispravljanje pogrešaka.

Ukratko: Razmatraju se primjeri rada s WEB uslugama iz 1C i PHP. Za prijenos strukture podataka objekta između klijenta i poslužitelja koristili smo dvije tehnologije:

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

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

Postavlja se fer pitanje: - Zašto?

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

Da bismo razumjeli "zašto", formulirajmo osnovne razlike između ovih tehnologija.

Tehnologija WEB usluga temelji se na 2 točke:

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

Definicije = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl",Korisničko ime,lozinka);
Proxy = new WSProxy(Definitions,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");

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

U PHP-u je ovako:

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

$klijent = novi SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
niz(
"login" => prijava, //prijava,
"password" => pass, //password
"trag" => istina,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"kompresija" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);

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

  • (2) Za obradu soap veze u poslužiteljskom načinu rada, platforma 1C 8 pruža posebne WEB usluge objekta metapodataka.

Štoviše, ako u vašem zadatku "1C" mora djelovati kao poslužitelj, tada nema alternative tehnologiji 1C WEB usluge.

- Kada je alternativa moguća?

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

Vrlo popularna opcija - http veza.

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

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

Tipično je da se u tipičnim konfiguracijama 1C integracija s web-mjestima provodi pomoću http zahtjeva.
Dakle, pogledajmo tehnologiju http zahtjevi Na primjer interakcija između 1C (klijent, 1C 8) i WEB stranice (PHP, server).

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

Primjer uspostavljanja veze s poslužiteljem sa strane 1C:
/////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////
Kao što znate, postoje dvije metode za prijenos parametara od klijenta do poslužitelja putem http protokola:

(1) Metoda "get";

Parametri (kao što su ime i lozinka) navedeni su izravno u URL-u poziva poslužitelja.

To jest, interaktivni poziv skripti (izravno iz WEB preglednika) izgledao bi ovako:

U 1C:8, za programsko pozivanje poslužitelja (i prosljeđivanje parametara metoda Get njemu), omoguć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 je OutputFileName: naziv datoteke u koju su smješteni podaci vraćeni s poslužitelja.
Odnosno, kao rezultat obrade zahtjeva, poslužitelj vraća rezultat 1C, a zatim se (automatski) generira datoteka koja sadrži rezultat.

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

(2) "post" metoda;

U ovoj opciji parametri nisu smješteni u URL, već se prenose zasebno, u tijelu http veze.

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

metoda objaviti Možete prenositi podatke različitog sadržaja, uklj. i proizvoljne datoteke.
Tako, objaviti za integracijske zadatke funkcionalniji je i nastavit ćemo raditi s njim.

Za primanje/prijenos podataka između 1C i WEB stranice koristit ćemo tekstualne datoteke.
A mi ćemo “pakirati/izvlačiti” podatke iz datoteka koristeći nam već poznatu JSON tehnologiju! To će nas praktički spasiti od potrebe da "parsiramo" datoteku na strani 1C i na strani PHP-a.

Za pozivanje poslužitelja i prijenos parametara na njega metodom "post", 1C:8 nudi metodu: SendForProcessing

I tako, dajmo primjer u kojem sa strane 1C svi koraci obrade su provedeni http zahtjev:

Najprije zapišimo akcijski plan (uvećan):

A sada, njegova softverska implementacija u 1C:8

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

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

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


// 3. Kreirajte privremenu odlaznu poruku (koja se prenosi na poslužitelj metodom POST)
// datoteku, stavite JSON niz u nju.
tFile = novi tekstualni dokument;
stringData = jsPostDataToPHP;
tFile.AddLine(stringData);


// 4. Dohvatite ime za privremenu odlaznu datoteku. Sadržavat će odlazne podatke u obliku JSON niza
OutgoingFileName = GetTemporaryFileName(".txt");

tFile.Write(OutgoingFileName,TextEncoding.UTF);

// 5. Dobiti naziv za privremenu ulaznu datoteku. Primit će JSON string: odgovor PHP poslužitelja
InputFileName = GetTemporaryFileName(".txt");


// 6. Uspostavite HTTP vezu s poslužiteljem
zaštićeno = lažno;
HTTPConnect = new HTTPConnect("localhost/wsClient10/json/testHTTPQuery10.php", Zaštićeno);


// 7. Izvršimo HTTP zahtjev. Prenesimo izlaznu datoteku na server (datoteka sadrži JSON objekt, tj. izlazne parametre)


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


// I dobit ćemo odgovor od poslužitelja (dolazna datoteka). Datoteka sadrži //JSON objekt (tj. podatke vraćene s poslužitelja)

// 8. Ekstrahirajte podatke primljene od poslužitelja iz dolazne datoteke
ResponseFile = new TextDocument;
ResponseFile.Read(InputFileName,TextEncoding.UTF);
json_Data = ResponseFile.GetString(1);
mData = JSON.ReadJSON(json_Data);


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


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

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

I konačno, primjer u PHP-u za obradu zahtjeva na strani poslužitelja:

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

// 1. Dohvati niz podataka iz dolazne datoteke
$json_filedata = file_get_contents("php://input");
// 2. Izrežite sve nepotrebne (dodana su 2 servisna znaka), koji // ometaju 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 još jednu strukturu, koju ćemo ispuniti podacima i // vratiti se u 1C
klasa returnData(
var $v1;
var $v2;
}
$sReturnData = novi povratniPodaci;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. Pretvorite strukturne podatke u JSON niz
$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 prema potrebi (projektni slučajevi)

Zaključno ć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 zapravo pitanje, jer... Ni sam ne znam što je to i po prvi put ću pokušati raditi s njim u okviru ovog članka. Jedino što mogu jamčiti je da će kod prikazan u nastavku raditi, ali moji će izrazi biti samo pretpostavke i nagađanja o tome kako ja osobno sve ovo razumijem. Pa, idemo...

Uvod

Moramo početi s time zašto je nastao koncept web usluga. 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, koja se mogla pokrenuti na računalu koje se nalazi u drugom gradu ili čak državi. Sve se to skraćeno naziva RPC (Remote Procedure Calling). Primjeri uključuju CORBA tehnologije, a za Javu - RMI (Remote Method Invoking). I čini se da je u njima sve 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 proći kroz svaki firewall. Ideja web servisa bila je stvoriti RPC koji bi se umetao u HTTP pakete. Tako je započeo razvoj standarda. Koji su osnovni koncepti ovog standarda:
  1. SAPUN. Prije pozivanja udaljene procedure, trebate opisati ovaj poziv u XML datoteci u SOAP formatu. SOAP je jednostavno jedno od mnogih XML oznaka koje se koriste u web uslugama. Sve što želimo nekamo poslati putem HTTP-a prvo se pretvara u XML SOAP opis, zatim se strpa u HTTP paket i šalje na drugo računalo na mreži putem TCP/IP-a.
  2. WSDL. Postoji web servis, tj. program čije se metode mogu pozivati ​​na daljinu. Ali standard zahtijeva da ovaj program bude popraćen opisom koji kaže da "da, u pravu ste - ovo je stvarno web servis i iz njega možete pozivati ​​te i te metode." Ovaj opis predstavljen je drugom XML datotekom, koja ima drugačiji format, naime WSDL. Oni. WSDL je samo XML datoteka koja opisuje web uslugu i ništa više.
Zašto tako kratko pitate? Ne možete li biti precizniji? Vjerojatno je moguće, ali da biste to učinili, morat ćete se okrenuti knjigama kao što je T. Mashnin, "Java Web Services." Tamo se na prvih 200 stranica nalazi detaljan opis svake oznake SOAP i WSDL standarda. Isplati li se to učiniti? Po mom mišljenju ne, jer... sve se to automatski kreira u Javi, a vi samo trebate napisati sadržaj metoda koje bi trebale biti pozvane na daljinu. Tako se u Javi pojavio API kao što je JAX-RPC. Ako netko ne zna, kada kažu da Java ima takav i takav API, to znači da postoji paket sa skupom klasa koje enkapsuliraju dotičnu tehnologiju. JAX-RPC se vremenom razvijao od verzije do verzije i na kraju je postao JAX-WS. WS je očito kratica za WebService i mogli biste pomisliti da je ovo jednostavno preimenovanje RPC-a kao popularne poštarke ovih dana. To nije istina, jer Sada su se web usluge udaljile od izvorne ideje i omogućuju 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 vjerojatno da će odgovor ovdje biti "samo u slučaju da je potrebno". I sam bih želio učiti od iskusnijih drugova. I na kraju, tada se pojavio JAX-RS za takozvane RESTful web servise, ali to je tema za poseban članak. Uvod se ovdje može završiti, jer... Zatim ćemo naučiti raditi s JAX-WS.

Opći pristup

U web uslugama uvijek postoji klijent i poslužitelj. Poslužitelj je naša web usluga i ponekad se naziva krajnja točka (kao krajnja točka do koje dolaze SOAP poruke od klijenta). Moramo učiniti sljedeće:
  1. Opišite sučelje naše web usluge
  2. Implementirajte ovo sučelje
  3. Pokrenite našu web uslugu
  4. Napišite klijent i daljinski pozovite željenu metodu web usluge
Možete pokrenuti web uslugu na različite načine: ili opišite klasu glavnom metodom i pokrenite web uslugu izravno kao poslužitelj ili je postavite na poslužitelj kao što je Tomcat ili bilo koji drugi. U drugom slučaju, mi sami ne pokrećemo novi poslužitelj i ne otvaramo drugi port na računalu, već jednostavno kažemo Tomcat spremniku servleta da “smo ovdje napisali klase web usluga, molimo vas da ih objavite kako bi svi koji vas kontaktiraju mogli koristite našu web uslugu." Bez obzira na način pokretanja web servisa, imat ćemo istog klijenta.

poslužitelj

Pokrenimo IDEA i napravimo novi projekt Stvori novi projekt. Naznačimo ime HelloWebService i pritisnite tipku Sljedeći, zatim gumb Završi. U mapi src napravimo paket ru.javarush.ws. U ovom paketu ćemo kreirati sučelje HelloWebService: package ru. javarush. ws; // ovo su anotacije, tj. način označavanja naših klasa i metoda, // u vezi s tehnologijom web usluge uvesti javax. jws. WebMethod; uvesti javax. jws. WebService; uvesti javax. jws. sapun. SOAPBinding; // kažemo da će naše sučelje raditi kao web servis@WebService // kažemo da će se web usluga koristiti za pozivanje metoda@SOAPBinding (style = SOAPBinding. Style. RPC) javno sučelje 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 zabilješke i ne rade ništa osim označavanja našeg sučelja i njegove metode kao web usluge. Isto se odnosi i na klasu SOAPBinding. Jedina razlika je u tome što je SOAPBinding komentar s parametrima. U ovom slučaju, parametar style se koristi s vrijednošću koja pokazuje da web usluga neće raditi kroz poruke dokumenta, već kao klasični RPC, tj. za poziv metode. Implementirajmo našu logiku sučelja i stvorimo klasu HelloWebServiceImpl u našem paketu. Usput, napominjem da je završavanje klase s Impl konvencija u Javi, prema kojoj je implementacija sučelja tako označena (Impl - od riječi implementacija, tj. implementacija). Ovo nije uvjet i slobodni ste nazvati klasu kako god želite, ali to zahtijevaju dobri maniri: package ru. javarush. ws; // ista napomena kao kod opisa sučelja, uvesti javax. jws. WebService; // ali ovdje se koristi s parametrom endpointInterface, // koji označava puni naziv klase sučelja naše web usluge@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") javna klasa HelloWebServiceImpl implementira HelloWebService ( @Override public String getHelloString (naziv niza) ( // samo uzvrati pozdrav return "Zdravo, " + ime + "!" ; ) ) Pokrenimo našu web uslugu kao neovisni poslužitelj, tj. bez sudjelovanja Tomcata i aplikacijskih poslužitelja (ovo je tema za posebnu raspravu). Da biste to učinili, u strukturi projekta u mapi src Kreirajmo paket ru.javarush.endpoint, au njemu ćemo kreirati klasu HelloWebServicePublisher s glavnom metodom: package ru. javarush. krajnja točka; // klasa za pokretanje web poslužitelja s web uslugama uvesti javax. xml. ws. Krajnja točka; // klasa naše web usluge uvoz ru. javarush. ws. HelloWebServiceImpl; javna klasa HelloWebServicePublisher ( public static void main (String... args) ( // pokrenite web poslužitelj na portu 1986 // i na adresu navedenu u prvom argumentu, // pokretanje web usluge proslijeđene u drugom argumentu Krajnja točka. objaviti( "http://localhost:1986/wss/zdravo", novi HelloWebServiceImpl () ); ) ) Sada pokrenimo ovaj razred klikom Shift+F10. Ništa se neće pojaviti na konzoli, ali poslužitelj radi. To možete provjeriti upisivanjem reda http://localhost:1986/wss/hello?wsdl u svoj preglednik. Stranica koja se otvara, s jedne strane dokazuje da imamo web server (http://) koji radi na portu 1986 na našem računalu (localhost), as druge strane prikazuje WSDL opis naše web usluge. Ako zaustavite aplikaciju, opis će postati nedostupan, kao i sam web servis, stoga to nećemo učiniti, već ćemo prijeći na pisanje klijenta.

Klijent

U mapi projekta src Kreirajmo paket ru.javarush.client , au njemu klasu HelloWebServiceClient s glavnom metodom: package ru. javarush. klijent; // potreban za dobivanje wsdl opisa i kroz njega // doći do same web usluge uvoz jave. neto. URL; // ova će se iznimka dogoditi kada radite s URL objektom uvoz jave. neto. MalformedURLException; // klase za raščlanjivanje xml s wsdl opisom // i doći do servisne oznake u njemu uvesti javax. xml. imenski prostor. QName; uvesti javax. xml. ws. Servis; // sučelje naše web usluge (trebamo više) uvoz ru. javarush. ws. HelloWebService; javna klasa HelloWebServiceClient ( public static void main (String args) baca MalformedURLException ( // kreirajte vezu na wsdl opis 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 imena QName qname = new QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ; // Sada možemo doći do servisne oznake u wsdl opisu, Usluga usluga = Usluga. stvoriti (url, qname) ; // a zatim do oznake porta ugniježđene u njemu, tako da // dobiti vezu do objekta web usluge udaljenog od nas HelloWebService hello = usluga. getPort(HelloWebService.class); // Hura! Sada možete pozvati udaljenu metodu Sustav. van. println (bok. getHelloString ( "JavaRush" ) ); ) ) Dao sam najviše komentara na kod u listingu. Nemam što dodati, pa trčimo (Shift+F10). Trebali bismo vidjeti tekst na konzoli: Pozdrav, JavaRush! Ako ga niste vidjeli, vjerojatno ste zaboravili pokrenuti web uslugu.

Zaključak

Ova je tema pružila kratki izlet u web usluge. Još jednom ću reći da je velik dio onoga što sam napisao moja pretpostavka o tome kako funkcionira i stoga mi ne biste trebali previše vjerovati. Bio bih zahvalan ako me upućeni ljudi isprave jer ću onda nešto naučiti. UPD.

Naslov teme je zapravo pitanje, jer... Ni sam ne znam što je to i po prvi put ću pokušati raditi s njim u okviru ovog članka. Jedino što mogu jamčiti je da će kod prikazan u nastavku raditi, ali moji će izrazi biti samo pretpostavke i nagađanja o tome kako ja osobno sve ovo razumijem. Pa, idemo...

Uvod

Moramo početi s time zašto je nastao koncept web usluga. 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, koja se mogla pokrenuti na računalu koje se nalazi u drugom gradu ili čak državi. Sve se to skraćeno naziva RPC (Remote Procedure Calling). Primjeri uključuju CORBA tehnologije, a za Javu - RMI (Remote Method Invoking). I čini se da je u njima sve 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 proći kroz svaki firewall. Ideja web servisa bila je stvoriti RPC koji bi se umetao u HTTP pakete. Tako je započeo razvoj standarda. Koji su osnovni koncepti ovog standarda:
  1. SAPUN. Prije pozivanja udaljene procedure, trebate opisati ovaj poziv u XML datoteci u SOAP formatu. SOAP je jednostavno jedno od mnogih XML oznaka koje se koriste u web uslugama. Sve što želimo nekamo poslati putem HTTP-a prvo se pretvara u XML SOAP opis, zatim se strpa u HTTP paket i šalje na drugo računalo na mreži putem TCP/IP-a.
  2. WSDL. Postoji web servis, tj. program čije se metode mogu pozivati ​​na daljinu. Ali standard zahtijeva da ovaj program bude popraćen opisom koji kaže da "da, u pravu ste - ovo je stvarno web servis i iz njega možete pozivati ​​te i te metode." Ovaj opis predstavljen je drugom XML datotekom, koja ima drugačiji format, naime WSDL. Oni. WSDL je samo XML datoteka koja opisuje web uslugu i ništa više.
Zašto tako kratko pitate? Ne možete li biti precizniji? Vjerojatno je moguće, ali da biste to učinili, morat ćete se okrenuti knjigama kao što je T. Mashnin, "Java Web Services." Tamo se na prvih 200 stranica nalazi detaljan opis svake oznake SOAP i WSDL standarda. Isplati li se to učiniti? Po mom mišljenju ne, jer... sve se to automatski kreira u Javi, a vi samo trebate napisati sadržaj metoda koje bi trebale biti pozvane na daljinu. Tako se u Javi pojavio API kao što je JAX-RPC. Ako netko ne zna, kada kažu da Java ima takav i takav API, to znači da postoji paket sa skupom klasa koje enkapsuliraju dotičnu tehnologiju. JAX-RPC se vremenom razvijao od verzije do verzije i na kraju je postao JAX-WS. WS je očito kratica za WebService i mogli biste pomisliti da je ovo jednostavno preimenovanje RPC-a kao popularne poštarke ovih dana. To nije istina, jer Sada su se web usluge udaljile od izvorne ideje i omogućuju 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 vjerojatno da će odgovor ovdje biti "samo u slučaju da je potrebno". I sam bih želio učiti od iskusnijih drugova. I na kraju, tada se pojavio JAX-RS za takozvane RESTful web servise, ali to je tema za poseban članak. Uvod se ovdje može završiti, jer... Zatim ćemo naučiti raditi s JAX-WS.

Opći pristup

U web uslugama uvijek postoji klijent i poslužitelj. Poslužitelj je naša web usluga i ponekad se naziva krajnja točka (kao krajnja točka do koje dolaze SOAP poruke od klijenta). Moramo učiniti sljedeće:
  1. Opišite sučelje naše web usluge
  2. Implementirajte ovo sučelje
  3. Pokrenite našu web uslugu
  4. Napišite klijent i daljinski pozovite željenu metodu web usluge
Možete pokrenuti web uslugu na različite načine: ili opišite klasu glavnom metodom i pokrenite web uslugu izravno kao poslužitelj ili je postavite na poslužitelj kao što je Tomcat ili bilo koji drugi. U drugom slučaju, mi sami ne pokrećemo novi poslužitelj i ne otvaramo drugi port na računalu, već jednostavno kažemo Tomcat spremniku servleta da “smo ovdje napisali klase web usluga, molimo vas da ih objavite kako bi svi koji vas kontaktiraju mogli koristite našu web uslugu." Bez obzira na način pokretanja web servisa, imat ćemo istog klijenta.

poslužitelj

Pokrenimo IDEA i napravimo novi projekt Stvori novi projekt. Naznačimo ime HelloWebService i pritisnite tipku Sljedeći, zatim gumb Završi. U mapi src napravimo paket ru.javarush.ws. U ovom paketu ćemo kreirati sučelje HelloWebService: package ru. javarush. ws; // ovo su anotacije, tj. način označavanja naših klasa i metoda, // u vezi s tehnologijom web usluge uvesti javax. jws. WebMethod; uvesti javax. jws. WebService; uvesti javax. jws. sapun. SOAPBinding; // kažemo da će naše sučelje raditi kao web servis@WebService // kažemo da će se web usluga koristiti za pozivanje metoda@SOAPBinding (style = SOAPBinding. Style. RPC) javno sučelje 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 zabilješke i ne rade ništa osim označavanja našeg sučelja i njegove metode kao web usluge. Isto se odnosi i na klasu SOAPBinding. Jedina razlika je u tome što je SOAPBinding komentar s parametrima. U ovom slučaju, parametar style se koristi s vrijednošću koja pokazuje da web usluga neće raditi kroz poruke dokumenta, već kao klasični RPC, tj. za poziv metode. Implementirajmo našu logiku sučelja i stvorimo klasu HelloWebServiceImpl u našem paketu. Usput, napominjem da je završavanje klase s Impl konvencija u Javi, prema kojoj je implementacija sučelja tako označena (Impl - od riječi implementacija, tj. implementacija). Ovo nije uvjet i slobodni ste nazvati klasu kako god želite, ali to zahtijevaju dobri maniri: package ru. javarush. ws; // ista napomena kao kod opisa sučelja, uvesti javax. jws. WebService; // ali ovdje se koristi s parametrom endpointInterface, // koji označava puni naziv klase sučelja naše web usluge@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") javna klasa HelloWebServiceImpl implementira HelloWebService ( @Override public String getHelloString (naziv niza) ( // samo uzvrati pozdrav return "Zdravo, " + ime + "!" ; ) ) Pokrenimo našu web uslugu kao neovisni poslužitelj, tj. bez sudjelovanja Tomcata i aplikacijskih poslužitelja (ovo je tema za posebnu raspravu). Da biste to učinili, u strukturi projekta u mapi src Kreirajmo paket ru.javarush.endpoint, au njemu ćemo kreirati klasu HelloWebServicePublisher s glavnom metodom: package ru. javarush. krajnja točka; // klasa za pokretanje web poslužitelja s web uslugama uvesti javax. xml. ws. Krajnja točka; // klasa naše web usluge uvoz ru. javarush. ws. HelloWebServiceImpl; javna klasa HelloWebServicePublisher ( public static void main (String... args) ( // pokrenite web poslužitelj na portu 1986 // i na adresu navedenu u prvom argumentu, // pokretanje web usluge proslijeđene u drugom argumentu Krajnja točka. objaviti( "http://localhost:1986/wss/zdravo", novi HelloWebServiceImpl () ); ) ) Sada pokrenimo ovaj razred klikom Shift+F10. Ništa se neće pojaviti na konzoli, ali poslužitelj radi. To možete provjeriti upisivanjem reda http://localhost:1986/wss/hello?wsdl u svoj preglednik. Stranica koja se otvara, s jedne strane dokazuje da imamo web server (http://) koji radi na portu 1986 na našem računalu (localhost), as druge strane prikazuje WSDL opis naše web usluge. Ako zaustavite aplikaciju, opis će postati nedostupan, kao i sam web servis, stoga to nećemo učiniti, već ćemo prijeći na pisanje klijenta.

Klijent

U mapi projekta src Kreirajmo paket ru.javarush.client , au njemu klasu HelloWebServiceClient s glavnom metodom: package ru. javarush. klijent; // potreban za dobivanje wsdl opisa i kroz njega // doći do same web usluge uvoz jave. neto. URL; // ova će se iznimka dogoditi kada radite s URL objektom uvoz jave. neto. MalformedURLException; // klase za raščlanjivanje xml s wsdl opisom // i doći do servisne oznake u njemu uvesti javax. xml. imenski prostor. QName; uvesti javax. xml. ws. Servis; // sučelje naše web usluge (trebamo više) uvoz ru. javarush. ws. HelloWebService; javna klasa HelloWebServiceClient ( public static void main (String args) baca MalformedURLException ( // kreirajte vezu na wsdl opis 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 imena QName qname = new QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // Sada možemo doći do servisne oznake u wsdl opisu, Usluga usluga = Usluga. stvoriti (url, qname) ; // a zatim do oznake porta ugniježđene u njemu, tako da // dobiti vezu do objekta web usluge udaljenog od nas HelloWebService hello = usluga. getPort(HelloWebService.class); // Hura! Sada možete pozvati udaljenu metodu Sustav. van. println (bok. getHelloString ( "JavaRush" ) ); ) ) Dao sam najviše komentara na kod u listingu. Nemam što dodati, pa trčimo (Shift+F10). Trebali bismo vidjeti tekst na konzoli: Pozdrav, JavaRush! Ako ga niste vidjeli, vjerojatno ste zaboravili pokrenuti web uslugu.

Zaključak

Ova je tema pružila kratki izlet u web usluge. Još jednom ću reći da je velik dio onoga što sam napisao moja pretpostavka o tome kako funkcionira i stoga mi ne biste trebali previše vjerovati. Bio bih zahvalan ako me upućeni ljudi isprave jer ću onda nešto naučiti. UPD.

Danas se WEB usluge koriste gotovo posvuda - pružaju nam informacije o letovima aviona i vlakova, tečaju i vremenu. Nije iznenađujuće da 1C također ima mogućnost kreiranja vlastitih WEB usluga, što mu omogućuje da djeluje i kao dobavljač i kao potrošač. Ovaj mehanizam ugrađen je u platformu 1C:Enterprise 8.3, a programeri čak mogu dodati svoje vlastite objekte tipa WEB usluge standardnoj konfiguraciji. Njihova je arhitektura izgrađena na skupu usluga koje vam omogućuju razmjenu informacija s drugim softverom.

Izrada web usluge 1C

Jedna od glavnih prednosti 1C WEB usluga je nepostojanje potrebe za pružanjem izravnog pristupa podacima o informacijskoj sigurnosti. Ispravno konfigurirana 1C web usluga omogućuje drugim aplikacijama korištenje funkcija izvana. U takvim slučajevima sama funkcija treba odrediti pravo korištenja podataka prema navedenim parametrima prema pravilima koje je propisao programer.

Kako stvoriti web uslugu u 1C?

Da bi određena funkcija 1C sustava 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 izvesti. Opis funkcija provodi se u modulu na ugrađenom 1C jeziku;
  3. Dodajte opis parametara funkcija web servisa. Imajte na umu da su tipovi podataka opisani uzimajući u obzir postojeće tipove mehanizma XDTO uvedenog u verziji platforme 8.1;
  4. Izrađenu WEB uslugu objaviti na poslužitelju. Mehanizam ugrađen u platformu 1C podržava sljedeće standarde:
  • SSL/TLS
  • WS-I BP

Primjer izrade jednostavne WEB usluge

Kako bismo što jasnije prikazali rad mehanizma WEB servisa, napravimo primjer - funkcionalnost koja određuje duljinu unesenog stringa. Softver će proslijediti niz kao parametar zahtjeva, a funkcija opisana u 1C vratit će broj znakova. Prilikom izrade morate imati na umu da će objavljivanje ovog mehanizma omogućiti pristup različitom softveru. Budući da nije svaki softver sposoban prihvatiti ćirilicu, konfiguracijske objekte ćemo imenovati latiničnim znakovima.

Otvorite konfigurator, u stablu pronađite granu “WEB usluge” i dodajte novu uslugu “wa_LengthString”. Također morate dodati novu operaciju na kartici "Operacije". Nazovimo to “CalcLengthString”, navedite tip povratne vrijednosti u svojstvima - int ili integer i stvorite parametar “InputString” unutar njega. Tip vrijednosti ostavljamo kao niz.

Sada trebate registrirati radnju funkcije CalcLengthString u WEB servisnom modulu. Da biste to učinili, otvorite svojstva stvorene funkcije i kliknite gumb u obliku povećala s desne strane, pored polja za unos "Naziv postupka". 1C će automatski kreirati funkciju u našem WEB servisnom modulu i otvoriti je kako bismo mogli opisati radnju CalcLengthString. Iskoristimo to i napišimo radnju funkcije – određivanje duljine ulaznog niza.


Zapravo, ovime je završena izrada jednostavne WEB usluge. Sada je potrebno ovu uslugu "staviti" u javnu domenu kako bi softver treće strane ili drugi 1C sustavi mogli koristiti ovu funkcionalnost.

Kako bismo mogli objaviti izrađeni web servis sa svojim funkcionalnostima, moramo imati pristup stranici. Prije nego počnemo objavljivati ​​uslugu, moramo provjeriti naziv datoteke u svojstvima kreiranog modula wa_LengthString. Trebao bi biti jasan, jednostavan i imati nastavak "1cws".


Sada je vrijeme da objavimo WEB uslugu koju smo izradili na poslužitelju. Ova se značajka pojavila u verziji platforme 8.3 i mnoge su tvrtke već shvatile sve prednosti ove funkcionalnosti. Za početak objave potrebno je u konfiguratoru otvoriti obrazac “Administracija/Objava na web poslužitelju...”.


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

  • Ime. Određuje mapu na web poslužitelju u kojoj će biti pohranjen opis naše web usluge. Pazite na velika i mala slova jer ponekad poslužitelji razlikuju velika i mala slova;
  • Web poslužitelj. Morate odabrati poslužitelj između onih instaliranih na vašem računalu;
  • Katalog. Morate odabrati put do mape u kojoj su pohranjeni podaci web poslužitelja za postavljanje veze. Koriste se samo latinična slova;
  • Dva znaka tipa Boolean. Prvi će nam biti od koristi ako trebamo konfigurirati pristup konfiguraciji putem web klijenta. Da biste objavili uslugu 1C, morate označiti drugi okvir.

Preostaje samo provjeriti ima li željeni WEB servis označen checkbox u prvom stupcu i kliknuti na “Objavi”.


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

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

Kao odgovor na takav zahtjev za adresom, preglednik mora prikazati strukturu XML datoteke. Ako vidite praznu stranicu, pogrešku ili čudne znakove (problemi kodiranja), morate ponovno provjeriti sve korake. Također je dobra ideja provjeriti je li poslužitelj ispravno konfiguriran i imate li mu pristup. Nakon uspješne objave, uslugu 1C WEB moći će koristiti aplikacije trećih strana.


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

Odricanje od odgovornosti i uvjeti korištenja

Svi zaštitni znakovi slučajno spomenuti u ovom članku pripadaju svojim vlasnicima.
Ovaj je članak 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 neprestano se razvija. Stoga će kod predstavljen u ovom članku generirati pogrešku u najnovijim verzijama platforme. To se posebno događa zbog činjenice da se promijenio redoslijed pozivanja metoda proxy objekta web usluge: na primjer, složeni objekti moraju se eksplicitno pretvoriti u XDTO objekt odgovarajućeg tipa, koristeći Tvornicu odgovarajuće usluge . O tome možete pročitati na našem forumu ili u knjizi “1C:Enterprise Integration Technologies” http://v8.1c.ru/metod/books/book.jsp?id=288

Uvod

Kada se pojavi nova verzija softverskog proizvoda, naravno, prije svega želite razumjeti što je novo u njemu. U slučaju 1C:Enterprise 8.1, web usluge postale su tako nova "značajka" za mene. O web servisima se puno pisalo i govorilo, budući da ova tehnologija za računalne standarde postoji dosta dugo. Stoga se neću ponavljati, sve upućujem na Yandex za informacije. Reći ću samo da s izdavanjem novog izdanja platforme 1C:Enterprise 8.1, 1Snikov ima priliku stvarati i koristiti tehnologiju web usluga, takoreći u svom izvornom okruženju. U ovom članku želim pokazati kako koristiti vanjske web usluge u svom razvoju.

Za one koji su potpuno “izvan strujanja”: o web uslugama “na dohvat ruke”

U REDU, posebno za tebe Pokušat ću vam reći nešto o tome što je web usluga i zašto točno OvajČinilo mi se tako "ukusnom" inovacijom platforme. Možda znate za COM tehnologiju ili ste čuli nešto o OLE? Prije ili kasnije, svaki će se pojedinačni radnik susresti s ovom tehnologijom (pogotovo ako morate brzo prenijeti neki imenik "Zaposlenici", a odjel ljudskih resursa, predviđajući potrebu ponovnog ubacivanja svih 1500 zaposlenika, spreman vas je objesiti na prvu odgovarajući čavao koji dolazi).
Da, dakle, u srcu COM tehnologije je ideja o mogućnosti pozivanje programskog koda (i pristup podacima) jedne aplikacije iz druge aplikacije. Štoviše, mogućnosti učiniti to ne na razini pojedinačnih postupaka i funkcija, već stavljanjem na raspolaganje objekti druga aplikacija. Kada koristimo OLE, stvaramo objekt u našoj aplikaciji koji je " predstavnik"ili, ako vam je draže, " omot"nekog objekta aplikacije s kojim želimo komunicirati (tzv. "OLE objekt" ili "COM objekt"). Preko ovog "omotača" objekta postaju nam dostupna svojstva i metode objekta druge aplikacije , i to samo one čiji je programer Ići Aplikacije su nam dopuštene za korištenje tako što smo ih objavili u opisu sučelje. (Pa, nisam htio ulaziti u travu, ali nema drugog načina...)
Sada zamislimo to točno isto aplikacija se nalazi na drugom računalu, i to ne čak ni na lokalnoj mreži (DCOM, CORBA i ostale neshvatljive kratice dobro rješavaju takve slučajeve), nego negdje daleko, daleko na internetu. Ovdje na scenu stupaju web usluge (također zajedno s nejasnim akronimima: SOAP, WSDL, itd.), koje vam omogućuju izvođenje sličnog "trika" u ovom slučaju: tj. primati podatke i manipulirati objektima iz aplikacije koja radi na računalu s druge strane interneta.
Pod, ispod " vanjski"Pod web uslugom mislim na web uslugu koja se pruža nekima dobavljač usluga (tj. ne naša aplikacija.) Sukladno tome, "interno" - web usluga koju ćemo pružiti iz, ili, preciznije, temeljen našu aplikaciju. Kada koristimo vanjske web usluge, moramo razumjeti da iako je objekt "omot" stvoren u našoj "lokalnoj" aplikaciji, "izvršni kod" ovog objekta nalazi se, možda, na drugoj strani globusa. Istodobno, razmjena između nas I ih odvija se na sada sveprisutnom XML-u, sa svojim dobro poznatim “prednostima” (svestranost i struktura) i “protiv” (napuhanost), a kao “prijenosna linija” koristi se stari dobri http.
Da, i ne zaboravite na internetski promet! Štoviše, u slučaju vanjskih web usluga, većina će biti uključena dolazni komponenta.
Sve ostalo je u Yandexu. Idemo dalje...

Odakle su noge,tj. rastu krila

Pretražujući Yandex, pronašao sam prekrasnu web uslugu tvrtke Aeroflot, koja vam omogućuje primanje informacija o dolasku i odlasku zrakoplova u stvarnom vremenu, i odlučio sam napraviti neku vrstu "Airport Display" u 1C:Enterprise. Sama usluga postoji ovdje: http://webservices.aeroflot.ru/desc_flightinfo.asp

Rekao je: "Idemo!"

Za početak sam napravio praznu konfiguraciju "1C:Enterprise 8.1" (u trenutku pisanja na raspolaganju sam imao verziju platforme 8.1.5.123). Zatim sam svojoj konfiguraciji dodao novi objekt tipa WS-link. 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 pojedinosti idite na Yandex ), i ponosno nazvali stvoreni objekt "Aeroflot". Duplim klikom na ovaj objekt dobio sam stablo sa strukturom web servisa.

Ovo stablo predstavlja “portret” web servisa, kako ga 1Ska vidi. Najzanimljivije je u grani "Web usluge": ovo imena I luke web usluge (zapravo, WSDL datoteka može opisati ne jednu, već nekoliko web usluga, tada će svaka web usluga imati svoju granu), a navedeni su metode web usluga. To su same “konce”, čijim povlačenjem možete sebi omogućiti pristup podacima koje pruža web servis. Grana "Podatkovni model" sadrži opis biblioteka tipova podataka koje koristi web usluga.
Kratki sažetak o tome kako koristiti web uslugu obično se može pronaći na istom mjestu kao i poveznica na WSDL datoteku. U slučaju Aeroflota, ovo je stranica http://webservices.aeroflot.aero/flightstatus.asmx

"Sad polijetanje, sad slijetanje..."

Za rad s web uslugom dodao sam obradu "Prikaz polazaka" u konfiguraciju, au njoj - jedan obrazac, koji sam označio kao glavni. Na obrascu sam postavio polje za odabir "Odabir zračne luke", polje za unos "Datum leta", panel "Ploča tablice" s dvije stranice "Dolasci" i "Odlasci", dok sam poništio oznaku "Raspodijeli na stranice" u svojstva panela i polje tablice "Tableboard".
Interakcija s web servisom odvija se na principu "zahtjev-odgovor", a za web servis se kreira poseban posrednički objekt. Stoga sam dodao detalje obrasca "ServiceAeroflot" prilagođene vrste.
Ako pažljivo pročitate opis usluge, možete vidjeti da web servis daje podatke o dolascima i odlascima putem poziva na metodu Dolazak, odnosno Odlazak. U ovom slučaju obje metode uzimaju šifru zračne luke i željeni datum kao parametre. Osim toga, web servis pruža mogućnost dobivanja popisa zračnih luka za koje su podaci dostupni u sustavu. Sljedeći scenarij interakcije s web uslugom sasvim je očit:
1. Nabavite popis zračnih luka;
2. Odaberite željenu zračnu luku i datum;
3. Dobiti podatke o dolascima ili odlascima;
Ali prije pristupanja web-usluzi, trebate inicijalizirati posrednički objekt (kao što je WSProxy), što sam ja učinio u rukovatelju za otvaranje obrasca:
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Prvi parametar je URI prostora imena web usluge. To možete saznati otvaranjem svojstava web servisa u WS stablu veza. Drugi i treći parametar prenose naziv i port web usluge, redom.
(nemojte brkati koncepte "ime", "port", "proxy" itd. koji se primjenjuju na web usluge s poznatijim konceptima TCP/IP protokola. Ako postoji podudarnost između njih, ona je prije semantička . U općenitom slučaju trebate razumjeti da su, na primjer, port web usluge i TCP port potpuno različite stvari).
Stoga sam inicijalizirao objekt Aeroflot Service tipa WSProxy, koji je u biti "omot" web servisa. Putem njega mogu pristupiti metodama web usluga kao "nativnim" metodama platforme.
Prije svega, dobio sam popis zračnih luka i ispunio popis polja za odabir "Odaberi zračnu luku":

SelectionList=FormElements.AirportSelection.SelectionList; Popis odabira.Očisti(); AirportList=Aeroflot Service.AirportList().GetList("popis "); TotalAirports=ListAirports.Count(); Za ui=0 do TotalAirports-1 Cycle Airport=ListAirports.Get(ies); SelectionList.Add(Airport.code, ""+Airport.city+" : "+Airport.name); EndCycle;
Ovdje trebamo mali komentar na konstrukciju Airport List = ServiceAeroflot.AirportList().GetList("list");
Činjenica je da su vrijednosti koje vraćaju metode web servisa predstavljene na platformi objektima tipa XDTO Object. Budući da je tema XDTO tehnologije izvan okvira ovog članka, reći ću to samo za transformacije ovaj objekt u popis (što on i jest), nazvao sam njegovu metodu GetList(). Ostatak koda je prilično očit, uključujući nazive polja strukture Airport, koje sam pronašao na stranici s opisom web usluge.
Sada možete pokrenuti konfiguraciju i provjeriti je li popis polja za odabir popunjen nazivima zračnih luka:

"Dan odlaska, dan dolaska..."

Sada imam gotovo sve spremno da bi moj semafor funkcionirao. Ostalo je samo "ofarbati i baciti" :) Tako ću ja:

Procedura FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("Šifra leta", "Šifra leta"); TableTableboard.Columns.Add(" Šifra zrakoplovne kompanije", "Avioprijevoznik"); TableTable.Columns.Add("Broj leta", "Broj"); TableTable.Columns.Add(" AirportTransit", "Tranzit od zračne luke"); TableTable.Columns.Add("Aerodrom", "Aerodrom"+?(Dolasci,"odlasci,","dolasci")); TableTable.Columns.Add(" Vremenski raspored", "Na rasporedu"); TableTableboard.Columns.Add(" Planirano vrijeme", "Planirano"); TableTableboard.Columns.Add(" TimeActual", "Stvarno"); TableTable.Columns.Add("Izračunato vrijeme", "Izračunato"); TableTable.Columns.Add("Vrijeme slijetanja", ?(Dolazak,"Slijetanje","Polijetanje")); TableTable. Stupci. Add("Kombinirani let", "Kombinirani let"); TableTable.Columns.Add("Status", "Status"); If Not Arrival Then TableTable.Columns.Add("Registracija", "Registracija"); TableTable .Columns .Add("Landing", "Landing"); EndIf; Elementi obrasca. Tablica semafora. Stvori stupce(); Elementi obrasca. Tablica semafora. Stupci. Kod leta. Vidljivost = False; Ako nije dolazak, onda elementi obrasca. Semafor Tablica. Stupci. Procijenjeno vrijeme. Vidljivost = False; EndIf; If Arrival Then Data=Aeroflot Service.Arrival(Airport Selection, Flight Date).Get List("list "); Inače Data=Aeroflot Service.Departure(Aeroflot Service.Departure(Airport Selection, Flight) Date).Get List("list "); EndIf; Total Records=Data.Number( ); For ii=0 for 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 = Entry.airport; 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; završi ako; EndCycle; Kraj postupka

Kako bih provjerio kako to sve radi, dodao sam gumb "Ažuriraj" s odgovarajućom slikom u komandnu ploču obrasca, au njegovom rukovatelju sam napisao sljedeće:

Procedura CommandPanel1 Update(Button) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arrivals); Kraj postupka
Spremam, pokrećem, biram, kliknem, dobivam:

Pogovor

Začudo, nakon što je članak napisan i objavljen, pokazalo se da je ugledni ZAV već objavio sličan primjer na IT-Landu: http://itland.ru/biblio/detail.php?ID=1060
Kako biste izbjegli moguće optužbe za plagijat, toplo preporučam da pročitate i ovaj članak i usporedite pristupe autora.