Schéma fungování webové služby 1C. Webové služby. Poskytování funkčnosti prostřednictvím webových služeb


Účel tohoto článku– pomůže pochopit „jak“ jsou WEB služby strukturovány v 1C, porozumět „jak fungují mechanismy“ a „pro jaké úkoly“ je racionální tyto mechanismy používat.

Funkce článku je to:

  • Jsou zvažovány (a vzájemně porovnávány) různé metody a techniky, které lze použít při integraci 1C, WEB (php) a mobilních (Ios, Android) aplikací;
U různé způsoby mají své klady/zápory a je racionální zvolit pro konkrétní úkol ten nejjednodušší, kompaktní.
  • Zároveň jsou uvedeny příklady řešení jak na straně 1C, tak na straně WEB serveru (PHP);
Příklady řešení mohou být užitečné jak pro 1C programátory, tak pro WEB specialisty, kteří pracují na křižovatce oblastí.
  • Všechny potřebné informace byly shromážděny společně ( pokyny krok za krokem) provést „rychlý start“ a zahájit vývoj. To znamená, abyste neztráceli spoustu času studiem a konfigurací WEB serverů, oken, „bojování“ systémové chyby atd.
Článek je určen:
  • 1C: Programátoři a WEB specialisté studující integraci pomocí technologie webových služeb;
  • Návrháři a IT analytici musí při vytváření projektů rozumět „podstatě“ a racionálně vybírat technologie.
Na závěr úvodní části se sluší říci, že pokud již máte zkušenosti s prací s technologiemi COM/Ole, pomůže vám to dobře porozumět technologii WEB služeb.

Možnosti technologie 1.1, podpora platformy 1C

1.2 Použitelnost technologií pro úlohy interakce klient-server.


2. Rychlý start. kde začít?


Bod č. 0.
Nejprve si musíte vybrat (rozhodnout) integrační technologii a porozumět „podstatě“ – tedy tomu, jak bude fungovat.
Jinými slovy, musíte odpovědět na dvě otázky:

  • Která databáze 1C (nebo jiný program) bude fungovat jako klient a která jako server;
Při určování, co bude klient a co bude server, můžete použít jednoduché pravidlo: Klient může "volat" (ovládat) server, ale zpětné volání není možné.
  • Která technologie interakce klient-server je pro vás nejvhodnější a bude použita.
Svá doporučení pro výběr technologie jsem nastínil výše.

Bod č. 1.
Je tedy pochopena „podstata“ interakce klient-server. Byla stanovena technologie interakce. Nyní musíte vytvořit „zkušební pole“, kde bude probíhat vývoj.

V tomto článku budou na příkladech popsány dvě technologie:

Práce s mechanismem WEB služeb.

Budou zváženy příklady práce z 1C 8 a PHP;

Práce s mechanismem požadavku http (webové služby REST).

Budou také zváženy příklady práce z 1C 8 a PHP;
V úkolech souvisejících s vývojem WEB se tradičně přijímá:

  • Vytvořte „testovací prostor“ pro vývoj a ladění na programátorově lokálním WEB serveru (localhost);
  • Po dokončení vývoje musí být výsledky přeneseny na „bojový“ WEB server.

V praxi (zejména když se začínáte „seznamovat“ s technologií WEB služeb), při vytváření „zkušebního terénu“, stejně jako při přenosu projektu na „bojový“ server, vzniká spousta „hrabání“.

Abychom „neztráceli“ spoustu času „bojováním“ s nastavením IIS(Internet Information Server) / mastering serveru apache a nastavení práv Windows přístup, doporučuji následující:

  • (1) Vytvořte "Polygon" na vašem místním pracovním počítači. Operační systém - Windows 7 (profesionální nebo maximální). Veškerá práce musí být provedena pod účet správce.
  • (2) Nasaďte databázi 1C 8 v režimu klient-server (MS SQL server, doporučuji 2008 R2). Použití 1C 8 v režimu klient-server eliminuje potřebu provádět další práci. nastavení přístupových práv k databázi 1C z WEB serveru.
  • (3) Nainstalujte IIS, pokud chybí. Ve Windows jej můžete pravidelně „přeinstalovat“.

Zaškrtávací políčka pro možnosti instalace součástí IIS lze nastavit ve výchozím nastavení.
Důležité věci, kterým musíte věnovat pozornost, jsou následující možnosti (rozšíření ISAPI – to je nezbytné pro fungování mydlových připojení ve WEBových službách a CGI – to je nutné pro fungování PHP)

Po dokončení instalace IIS Přesvědčte se, že to funguje. Za tímto účelem v adresní řádek Webový prohlížeč zadejte:

(4) Publikování (připojení) databáze 1C na WEB server.

A tak WEB server IIS nainstalováno a funkční. Zveřejněme naši databázi 1C a zkontrolujme, že přístup k ní je nyní možný i přes WEB klienta.

Je vhodné publikovat na WEB serveru databázi 1C, která zajišťuje provoz v režimu řízené aplikace (tenký klient).

Publikování databáze 1C se provádí takto:
V režimu konfigurátoru je třeba zavolat položku "Publikovat na webovém serveru"

b) Zadejte parametry publikace:

Tedy v adresáři (složce) wwwroot tvůj jeho IIS musíte vytvořit samostatnou složku (adresář) pro publikování vaší databáze 1C.

adresář wwwroot bude vytvořen automaticky při instalaci služby IIS
Vytvořme a vybereme takovou složku (wsBase10), uvedeme název pro publikaci (budeme ji také nazývat wsBase10).

Pokud náhle obdržíte zprávu jako odpověď,

pak se neboj.

Mechanismus publikování 1C je velmi rozmarný. Zkuste znovu kliknout na „Publikovat“.

A pokud v důsledku toho obdržíte zprávu,

to znamená, že vše fungovalo.

Je velmi důležité pochopit, že při publikování databáze 1C a jejích webových služeb na „bojovém“ serveru (například Windows 2008 R2) často dochází k chybám, pokud se rozhodnete použít webový server. IIS.

Rada: neinstalujte na "bojový" server IIS! Nainstalujte apache.

To vás ochrání před mnoha systémovými chybami. A zveřejnění (znovupublikování - se změnami v konfiguraci) proběhne za apache plynule, bez nutnosti pohrávat si se soubory a nastaveními vrd IIS.

V tomto článku nebudu zvažovat proces instalace a nastavení apache. Na toto téma existují i ​​jiné zdroje.

Nicméně ke spolupráci apache s databází 1C (a webovými službami) existuje několik velmi důležitých požadavků, které musíte znát (předložte je správci systému).

1. Při instalaci apache Nezapomeňte povolit podporu pro rozšíření ISAPI.

2. Povolte podporu cgi-bin, pokud budete pracovat s PHP;

3. Budete muset zadat speciálního „uživatele“ do databáze 1C...

Tento uživatel musí mít ověření operační systém. A musíte určit uživatele, pod jehož jménem se spouští apache.

... S apache jsme skončili a vraťme se znovu k našemu "Polygonu".

Tady vidíme - 1C začíná. WEB server spolu s 1C funguje.
4. Nainstalujte službu PHP pro WINDOWS.

Budete jej potřebovat, pokud v rámci svého úkolu potřebujete vyvinout klienta (webové stránky pro přístup k 1C) nebo server (scénáře pro zpracování http požadavků z 1C) v PHP.

5 Do IIS přidáme adresář wsClient10, ve kterém poběží naše PHP skripty.

PHP skripty, které budeme používat:

  • Vytvořit klientskou část při vývoji WEB služeb 1C;
  • Pro vývoj serverové části, při vývoji webových služeb REST (http požadavky).

6. Nainstalujme program Notepap++. Tento kompaktní a pohodlný program Doporučuji jej používat pro úpravu PHP skriptů.

Po instalaci programu Notepad++ okamžitě zkontrolujeme, zda pro nás PHP funguje. Vytvořme si k tomu jednoduchý skript hello.php. Umístíme jej do adresáře wsClient a spustíme skript z prohlížeče:

Vše OK. PHP funguje. Testovací místo je kompletně připraveno.

3. Vytvoření WEB služby, žádosti o mýdlo, XDTO a JSON. Příklady 1C a PHP. V této fázi byste měli mít „Polygon“ připravený a můžete začít vyvíjet WEB služby.

- Kde začít studovat tuto technologii? Samozřejmě s klasickým problémem jako „Ahoj slovo“!

1. Úkol vytvořit nejjednodušší Webová služba. Podívejme se na příklady v 1C a PHP.

1.1. Přidáme do databáze (wsBase10) webovou službu "_Calculations by Tariffs"

Nastavíme název souboru publikace na "calcOrder10.1cws". Musí být také specifikován jmenný prostor URI. V zásadě můžete zadat jakýkoli název.

1.2. Přidejme operaci „getHello“ v rámci webové služby „_Calculations by Tariffs“.

Podstata operace bude nejjednodušší – vzít tři parametry (řetězce, čísla) jako vstup (od klienta) a vrátit mu (ve výsledku) sjednocující řetězec zpět. Typ návratové hodnoty bude primitivní - řetězec.

Zaškrtávací políčko „V transakci“ nezaškrtneme, protože operace nezmění data v samotné databázi 1C.

Pokud by naše operace změnila data v databázi 1C, pak by zaškrtnutí tohoto políčka dávalo smysl.
Název metody (funkce), která zpracuje příchozí data (a vrátí výsledek), bude „getHello“.

1.3. Přidejme vstupní parametry pro operaci „getHello“.

Směr přenosu je "vstup". To znamená, že jsou přenášeny z klienta na server.

1.4. Pojďme napsat handler pro operaci „getHello“ v modulu webové služby
///////////////////

Funkce getHello(strParametr, floatParametr, integerParametr)
return strParametr+string(floatParametr+integerParametr)
EndFunction

////////

1.5. V tomto okamžiku jsou práce na vytvoření jednoduché WEB služby dokončeny. A nyní je potřeba zveřejnit WEBovou službu "_Výpočty podle tarifů".

Před zveřejněním webové služby na testovacím webu odebereme všechny uživatele ze seznamu našich uživatelů informační základna. To znamená, že seznam uživatelů bude „prázdný“.

- Proč to dělat?

Na testovacím místě se k WEBovým službám bude moci připojit pouze vývojář, a proto nemá smysl poskytovat autentizaci uživatele při připojení k WEBové službě.

To znamená, že si záměrně zjednodušíme práci s WEB službami na testovacím webu.

Při navazování spojení nebudeme muset zadávat přihlašovací jméno a heslo.
Ale na „bojovém“ serveru samozřejmě budete muset poskytnout ověření.
Chcete-li to provést (jak bylo řečeno dříve), budete muset samostatně vytvořit uživatele v „bojové“ databázi, jejímž jménem bude spuštěn samotný WEB server. A poté, při navazování spojení s WEB službou (soap connection), budete také muset zadat přihlašovací jméno a heslo tohoto uživatele.

1.6. A tak zveřejníme WEBovou službu:

Všimněte si, že nemusíme zaškrtávat políčko „Použít ověření operačního systému na webovém serveru“. To je Protože tento režim poskytováno pouze pro WEB server IIS a na „bojovém“ serveru to bude fungovat Apache.

1.7. Vytvoříme klientskou část a otestujeme provoz WEB serveru.

A) Nejprve zavolejte klientovi z 1C.

Udělejme to jednoduše. V jakékoli jiné databázi 1C, kterou máte, vytvoříme externí zpracování. Při tomto zpracování se připojíme k WEBové službě, použijeme operaci „getHello“, předáme tam parametry a obdržíme odpověď ze serveru.
Kód pro "1C" bude něco takového:

/////

&OnClient
Postup Provést dotaz 10 (příkaz)
// Vložte obsah handleru.
LineResult = SERVER_ExecuteWSQuery10();
Warning(StringResult);
Konec procedury
&OnServerBez kontextu
Funkce SERVER_RunWSRequest10()
// Autentizaci na testovacím místě neprovedeme!
Uživatelské jméno = nedefinováno;
Heslo = nedefinováno;
http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",UserName,Password);
Proxy.User = Uživatelské jméno;
Proxy.Password = Nedefinováno;
strResult = Proxy.getHello("Ivanov",100.35,20);
return strResult;
EndFunction ///////////////////////////////////////////////////////////////////////////////////////

Pojďme otestovat fungování funkce SERVER_ExecuteWSRequest10().

OK. Funguje!
b) Nyní provedeme klientské volání webové služby z PHP.
Kód skriptu PHP bude vypadat nějak takto:

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

error_reporting(E_ERROR); // 1. Zakažte nepotřebné zprávy
// 2. Zakázat ukládání do mezipaměti pro SOAP. Pokud se tak nestane,


// 3. Vytvořte mýdlové spojení
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
pole(
"login" => null, //přihlášení, nebudeme provádět autentizaci
"password" => null, //heslo
"stopa" => pravda,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"komprese" =>
);
// 4. Vyplnění pole předávaných parametrů
$params["strParametr"] = "test_Soap10:";
$params["floatParametr"] = 10,34;
$params["integerParametr"] = 12;
// 5. Proveďte operaci getHello
$result = $klient->getHello($params);
// 6. Zobrazte výsledek na obrazovce
var_dump($vysledek);
?>

////
///

Zavoláme skript z prohlížeče a zkontrolujeme jeho fungování:

Vše je v pořádku, volání 1C z WEB stránky funguje!

Pojďme si shrnout některé výsledky:
Problém jednoduché webové služby byl vyřešen. A nyní můžete začít vytvářet složitější webové služby.

A komplikace bude v tom, že (dosud) jsme operovali pouze s primitivními datovými typy. Samozřejmě budeme muset vysílat/přijímat i objektové (agregované) datové typy.

2. Úkol vytvoření WEB služby pomocí balíčků XDTO.

Stejně jako předtím se podívejme na příklady v 1C a PHP.

Položme si následující úkol: WEBová služba by nám měla vrátit nikoli řetězec, ale objektová data – „tabulku hodnot“ (přesněji to bude pole objektů!).

Aby bylo možné popsat různé datové struktury (které budou vyžadovány při příjmu/přenosu na WEB server), poskytuje platforma 1C:8 mechanismus pro balíčky XDTO.

Tito. Nejprve popíšeme všechny datové typy, které potřebujeme, a poté označíme:

  • S jakými balíčky XDTO může naše WEB služba pracovat (můžete zadat buď jeden nebo seznam balíčků);
  • Pro každý parametr operace a výsledek, který vrací, můžete určit, o jaký typ dat (z balíčku XDTO) se bude jednat.
Dále se podíváme na práci s XDTO na příkladu přijetí určité „tarifní tabulky“ ze serveru:

Vytvořme operaci GetTzTariffs_0, která vrátí data typu tzTariffs.

Obrázek ukazuje, že tzTariffs zahrnuje neomezený počet el objektů. Ve skutečnosti je tzTariffs tabulka objektů typu el.

- Jak to vidět?

  • Pokud je parametr "maximum" uveden jako "-1", pak počet těchto objektů není omezen (tabulka s neomezeným počtem řádků);
  • Pokud nepotřebujeme tabulku, ale potřebujeme pouze strukturu (jeden řádek), pak by maximální a minimální hodnoty měly být zadány rovné „1“.
  • Objekt el je zase struktura, která obsahuje atribut typu objektu (eTariff) a atribut primitivního typu (cPrice, komentář).

Když se posunete v hierarchii dolů, můžete vidět, že typ tarifu je struktura (maximální a minimální množství = 1), jejíž jeden z detailů zahrnuje typ kindOfTariff.

Celkový: Balíček XDTO umožňuje jasně popsat hierarchii datových typů, které budou dále používány při interakci s WEB službou.

Tip: Pro webovou službu je lepší použít jeden balíček XDTO, abyste se vyhnuli složitosti a chybám v návrhu.
Pojďme dál... Po:

  • Balíček XTDO byl vytvořen;
  • Všechny datové typy jsou popsány;
  • U WEB služby je použití tohoto balíčku uvedeno;
  • Pro parametry a výsledky operací jsou vybrány vhodné typy (z balíčku XDTO)
poté můžete přejít k „vyplnění“ objektů (struktur, polí struktur) daty.

V našem příkladu by operace GetTzTariffs_0 měla vrátit pole řetězců obsahujících objekty Tariffs.

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

Funkce GetTzTariffs_0()
// Vložte obsah handleru.
Return GetTZTariffs_0();
EndFunction

Funkce GetTZTariffs_0()


// Vyplnění technických specifikací
// 1. řádek

kindOfTariff.active = false;


tarif.druh = druhTarif;

elementTZ.eTarif = tarif;
elementTZ.cCena = 100;

//
// 2. řádek
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);

tarif = FactoryXDTO.Create(tariffType);
tarif.begdate = CurrentDate();
tarif.druh = druhTarif;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTarif = tarif;
elementTZ.cCena = 200;
// Přidání 2. řádku do tabulky
tzTariffs.el.Add(elementTZ);
Návrat tzTarifů;
EndFunction

//////////
Dále uvedeme příklad volání operace "GetTzTariffs_0" ze strany klienta, z 1C.

&OnClient
Postup Provést Query20 (příkaz)
// Vložte obsah handleru.
Upozornění(SERVER_ExecuteWSQuery20());
Konec procedury
&OnServerBez kontextu
Funkce SERVER_ExecuteWSRequest20()
Definice = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definice,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
XDTResult = Proxy.GetTzTariffs_0();
// Přistupme k řádku s indexem nula, pak k atributu eTariff, pak k druhu vnořeného atributu a potom k názvu vnořeného atributu.
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Podobné volání z PHP a zpracování výsledků XDTO by vypadalo takto:
////////////////////////////////////////////////////////////////////////////////////



// funkce webových služeb nebudou fungovat správně.
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
$result = $klient->GetTzTariffs_0();
$mResult = $vysledek->vratit->el;
// mResult - pole objektů. Projdeme prvky pole a zobrazíme výsledky na obrazovce
pro ($i=0; $i {
echo"
";
$eTariff = iconv("utf-8","cp1251",$mResult[$i]->eTarif->fullName);
var_dump($eTarif);
$cPrice = $mResult[$i]->cPrice;
var_dump($cPrice);
$cComment = $mResult[$i]->cComment;
var_dump($cComment);
echo"
";
}
?>

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

Nyní Pojďme si úkol ještě více zkomplikovat. Přeneseme stejný objektový datový typ z klienta do WEB služby (jako parametr). Ať je to tzKind.
Za tímto účelem nejprve popíšeme tento typ v balíčku dataTariffs a poté přidáme operaci GetTzTariffs_1.

Označme typ parametru tzKind.

Příklad toho, jak webová služba pracuje s příchozím parametrem XDTO:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Funkce GetTZTariffs_1(tzKind)
tzTariffsType = FactoryXDTO.Type(" ", "tzTariffs");
tzTariffs = FactoryXDTO.Create(tzTariffsType);
elementTZType = FactoryXDTO.Type(" ", "elementTZ");
tarifType = FactoryXDTO.Type(" ", "tarif");
kindOfTariffType = FactoryXDTO.Type(" ", "kindOfTariff");
// Vyplnění technických specifikací
// 1. řádek
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Doprava";
kindOfTariff.active = false;
tarif = FactoryXDTO.Create(tariffType);
tarif.fullName = "Tarif 1";
tarif.begdate = CurrentDate();
tarif.druh = druhTarif;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTarif = tarif;
elementTZ.cCena = 100;
elementTZ.comment = "Popis tarifu 1";
// Přidejte 1. řádek do tabulky
tzTariffs.el.Add(elementTZ);
// 2. řádek
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = "Dodávka";
kindOfTariff.active = true;
tarif = FactoryXDTO.Create(tariffType);
tarif.fullName = "Tarif 2";
tarif.begdate = CurrentDate();
tarif.druh = druhTarif;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTarif = tarif;
elementTZ.cCena = 200;
elementTZ.comment = "Popis tarifu 2";
// Přidejte 3. řádek do tabulky (vyplňte jej příchozími daty)
tzTariffs.el.Add(elementTZ);
// 3. řádek
kindOfTariff = FactoryXDTO.Create(kindOfTariffType);
kindOfTariff.name = tzKind.el.eKind.name;
kindOfTariff.active = tzKind.el.eKind.active;
tarif = FactoryXDTO.Create(tariffType);
tarif.fullName = "Tarif 3";
tarif.begdate = CurrentDate();
tarif.druh = druhTarif;
elementTZ = FactoryXDTO.Create(elementTZType);
elementTZ.eTarif = tarif;
elementTZ.cCena = 300;
elementTZ.comment = "Popis tarifu 3";
// Přidání 3. řádku do tabulky
tzTariffs.el.Add(elementTZ);
Návrat tzTarifů;
EndFunction

//////////////////////////////////////////////////////////////////////////////////
Ze strany klienta 1C budeme muset připravit data typu tzKind a přenést je do WEB služby.

Zde je příklad takového volání:
/////////////////////////////////////////////////////////////////////////////////

&OnClient
Postup Provést Query30 (příkaz)
// Vložte obsah handleru.
Upozornění(SERVER_ExecuteWSQuery30());
Konec procedury
&OnServerBez kontextu
Funkce SERVER_ExecuteWSRequest30()
Definice = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ");
Proxy = new WSProxy(Definice,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");
// Vytvoří tabulku parametrů předávaných WS
tzKindType = Proxy.FactoryXDTO.Type(" ", "tzKind");
tzKind = Proxy.FactoryXDTO.Create(tzKindType);
kindOfTariffType = Proxy.FactoryXDTO.Type(" ", "kindOfTariff");
kindOfTariff = Proxy.XDTO Factory.Create(kindOfTariffType);
kindOfTariff.name = "Typ zkušebního tarifu";
kindOfTariff.active = false;
elementKindType = Proxy.FactoryXDTO.Type(" ", "elementKind");
elementKind = Proxy.XDTO Factory.Create(elementKindType);
elementKind.eKind = kindOfTariff;
elementKind.qty = 10;
// Přidání řádku do tabulky
tzKind.el.Add(elementKind);
XDTOResult = Proxy.GetTzTzriffs_1(tzKind);
ExampleResult_Name typu tarifu = XDTOResult.el.eTarif.kind.name;
Return ExampleResult_Name of Tariff Type;
EndFunction

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Rád bych upozornil na design: Proxy.FactoryXDTO.Type("...

To znamená, že při vytváření objektu balíčku XDTO na klientovi musíme přistupovat nikoli k naší vlastní továrně XDTO!, ale prostřednictvím proxy. Tedy do továrny serverů XDTO.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Nyní je čas položit si otázku:existuje nějaká alternativa k XDTO objektům ?

Je možné s továrnou XDTO vůbec „nekomunikovat“, vysílat/přijímat z WEB služby nějak jinak.. (zejména pokud klient není 1C, ale např. WEB stránka, aplikace na Android, iOS , atd.).

Odpověď je- Ano můžeš!
Jako typy parametrů můžete například použít řetězec. A do něj „zabalit“ (serializovat) datové struktury.

Tato technologie v programování WEB byla dlouho vyvinuta a nazývá se JSON.
Velkou pomocí je také to, že v PHP se balení/extrahování jakékoli struktury/řetězce pole provádí v jednom kroku!
Příklad v PHP sbalení objektů v JSON/extrahování, vysílání/přijímání do WEB služby:

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

// serializujte pole mDelivery do řetězce a umístěte jej do parametru delivery
// * Nejprve si popišme strukturu doručení
doručení třídy (
var $id;
var $kontrolováno;
var $hodnota;
}
// Naplňte strukturu nějakými daty
$sDelivery = nová dodávka;
$sDelivery->id = "000000005";
$sDelivery->checked = TRUE;
$sDelivery->value = 0;
// Přidejte jej do pole objektů mDelivery
$mDelivery = $sDelivery;
// Převede pole mDelivery na řetězec JSON a výsledek umístí do parametru doručení
$params["delivery"] = json_encode($mDelivery);
// Volání operace ExitCalcOrder na WEBové službě a předání jí parametr (string - delivery);
$vysledek = $klient->ExitCalcOrder($params);
// Získejte výsledek operace ExitCalcOrder do proměnné jsCalcResult (řetězec)
$jsCalcResult = $výsledek->návrat;
// Proveďte zpětnou transformaci: z řetězce jsCalcResult na objekt (pole objektů, typ shoda) arrCalcResult
$arrCalcResult = json_decode($jsCalcResult);
// Zobrazení informací o objektu arrCalcResult na obrazovce
var_dump($arrCalcResult);

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

Ale jak provádět převody JSON v 1C?
Platforma 1C 8 nepodporuje standard JSON, ale to není problém.
Zpracování konverze/extrakce JSON existuje, je dostupné a funguje skvěle
// Copyright © 2010-2012 Alexander Pereverzev
// 1C:JSON . JavaScript Object Notation analyzátor a serializátor.

Jednoduše tedy vložte toto zpracování do své konfigurace a můžete snadno provádět dopředné a zpětné převody JSON:
Příklad serializace 1C objekt na řetězec JSON:

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

CargoData = nová struktura;
CargoData.Insert("code",CargoCode);
CargoData.Insert("číslo",CargoNumber);
CargoData.Insert("plán", QuantityPlan);
CargoData.Insert("character",CargoCharacter);
CargoData.Insert("balení", Balení);
CargoData.Insert("poškození",Poškození obalu);
CargoData.Insert("volume",Volume);
CargoData.Insert("hmotnost",Hmotnost);
CargoData.Insert("stav",Stav);
jsResult = JSON.WriteJSON(LoadData); //Výsledek převede na JSON
return jsResult;

Příklad extraktu objekt v 1C z řetězce JSON:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 1. Obnovte objekty z JSON
JSON = Process.JSON.Create();
mdelivery = JSON.ReadJSON(doručení);
// výsledkem je, že mdelivery je pole. Element pole - zápas.
// To je například mdelivery.["id"] bude obsahovat "000000005"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Na závěr uvedu příklad volání webové služby 1C z PHP, přijímající vrácenou strukturu JSON její zpětné transformace do objektů PHP.

Věnujme pozornost proměnám iconv("cp1251","utf-8","
a iconv("utf-8","cp1251", což bude vyžadováno (při interakci s PHP - 1 C) pro převod řetězců azbuky z kódování cp 1251 na utf -8 a zpět.

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

error_reporting(E_ERROR); // Zakázat zprávy
// Zakázat ukládání do mezipaměti pro SOAP. Pokud se tak nestane,
// funkce webových služeb nebudou fungovat správně.
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["kód"]);
$params["param2"] = iconv("cp1251","utf-8",$_GET["číslo"]);
$vysledek = $klient->executeQuery($params);
$jsResult = $vysledek->vratit;
$dataFreight = json_decode($jsResult);
$statusFreight = $dataFreight->codeNm;
$numberFreight = iconv("utf-8","cp1251",$dataFreight->nameRus);
?>

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

Pravděpodobný scénář je: vzdálený uživatel z některého z jeho programů (například z WEBu, mobilní aplikace atd.) zavolá na vaši WEB službu a... neobdrží výsledky.. Nebo je obdrží, ale něco není v pořádku.

Otázka: - Jak se o takových chybách dozvědět a odladit WEB službu?
Pro sledování chyb (a shromažďování příchozích parametrů „co vedlo webovou službu k chybě“) doporučuji používat protokol.

Tito. v místě, kde se mohou vyskytnout logické chyby, programově uložit informace o příchozích parametrech do registračního logu (LogRecord)

Pokud „zápasíte“ s „runtime chybami“, můžete je zachytit (pokus je výjimkou) a „bod po bodu“ zaznamenat celou situaci.

Výsledkem je, že pomocí protokolu budete moci vidět informace o chybách, reprodukovat parametry výskytu a „porazit“ jej v interaktivním režimu v debuggeru.

Pojďme si to shrnout: Jsou zvažovány příklady práce s WEB službami od 1C a PHP. K přenosu objektových datových struktur mezi klientem a serverem jsme použili dvě technologie:

  • (1) Balíčky XDTO
  • (2) Objekty JSON.

4. Alternativa - webové služby REST (požadavky http). Příklady implementace v 1C a PHP.
V předchozí části jsme se podrobně zabývali technologií WEB služeb. V této části se budeme zabývat alternativní technologií, tzv. Webové služby REST.

Nabízí se správná otázka: - Proč?

WEB služby jsou plně funkční a umožňují řešit problémy jakékoliv složitosti.

Abychom pochopili „proč“, zformulujme základní rozdíly mezi těmito technologiemi.

Technologie WEB služeb je založena na 2 bodech:

  • (1) Používá se připojení SOAP. Jinými slovy je proveden požadavek SOAP.
V mýdle "1C" je spojení vytvořeno následovně:
/////////////////////////////////////////////////////////////////////////////////////////

Definice = new WSDefinitions("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl",UserName,Password);
Proxy = new WSProxy(Definice,"www.URI.com","_Calculations By Tariffs","_Calculations By TariffsSoap");

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

V PHP je to takto:

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

$client = new SoapClient("http://localhost/wsBase10/ws/calcOrder10.1cws?wsdl ",
pole(
"login" => přihlášení, //přihlášení,
"password" => pass, //password
"stopa" => pravda,
"features" => SOAP_USE_XSI_ARRAY_TYPE,
//"komprese" => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
);

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

  • (2) Pro zpracování mydlového připojení v režimu serveru poskytuje platforma 1C 8 speciální webové služby metadatového objektu.

Navíc, pokud ve vašem úkolu musí „1C“ fungovat jako server, pak neexistuje žádná alternativa k technologii 1C WEB.

- Kdy je možná alternativa?

  • Za prvé, když 1C vystupuje pouze jako klient;
  • Za druhé, když server, se kterým potřebujete pracovat (například webová stránka nebo nějaký druh WEB aplikace), není plánováno podporovat připojení SOAP.
- Jaká alternativa k připojení SOAP je možná?

Velmi oblíbená možnost - http připojení.

Ve webových systémech (PHP, Android, iOS) je snazší pracovat s požadavky http než s požadavky SOAP. A pro nepříliš složité projekty je technologie http request docela vhodná.

Klasickým řešením (pomocí metody http request) je úkol integrovat databázi 1C a WEB. Například informace o sortimentu a cenách jsou přenášeny na stránku a informace o přijatých objednávkách jsou přenášeny zpět ze stránky.

Je typické, že v typických konfiguracích 1C je integrace s weby realizována pomocí požadavků http.
Pojďme se tedy podívat na technologii http požadavky Například interakce mezi 1C (klient, 1C 8) a WEB stránkou (PHP, server).

1. Navázání spojení a metody pro předávání parametrů v http požadavku

Příklad navázání připojení k serveru ze strany 1C:
/////////////////////////////////////////////////////////////////////////////

chráněný = nepravdivý;
HTTPConnect = new HTTPConnect("localhost/wsClient10/json/testHTTPQuery11.php", Protected);

////////////////////////////////////////////////////////////////////////////
Jak víte, existují dva způsoby přenosu parametrů z klienta na server prostřednictvím protokolu http:

(1) Metoda "get";

Parametry (jako je jméno a heslo) se zadávají přímo v URL volání serveru.

To znamená, že interaktivní volání skriptu (přímo z webového prohlížeče) by vypadalo takto:

V 1C:8 je pro programové volání serveru (a předávání parametrů metod Get mu) k dispozici metoda „Get“.

Příklad:
chráněný = nepravdivý;
HTTPConnect = new HTTPConnect("localhost", Secure);
HTTPConnect.Get("wsClient10/json/testHTTPQuery11.php?nameVasya&password=123",OutputFileName);

kde OutputFileName: Název souboru, do kterého jsou umístěna data vrácená ze serveru.
To znamená, že v důsledku zpracování požadavku server vrátí výsledek do 1C a poté se (automaticky) vygeneruje soubor, který obsahuje výsledek.

V souladu s tím je v „1C“ nutné (programově) přečíst tento soubor a extrahovat z něj získaný výsledek. To je vše.

(2) metoda "post";

V této volbě nejsou parametry umístěny v URL, ale jsou přenášeny samostatně, v těle http spojení.

Je jasné, že klíčové omezení metody dostat je objem a obsah přenášených dat. Tedy s pomocí dostat Lze předávat pouze znaky a délka řetězce adresy URL je omezena.

Metoda pošta Můžete přenášet data různého obsahu, vč. a libovolné soubory.
Tím pádem, pošta pro integrační úlohy je funkčnější a budeme s ním dále pracovat.

Pro příjem/přenos dat mezi 1C a WEB stránkou použijeme textové soubory.
A data ze souborů budeme „balit/extrahovat“ pomocí nám již známé technologie JSON! To nás prakticky ušetří nutnosti „parsovat“ soubor na straně 1C a na straně PHP.

Chcete-li volat server a přenášet na něj parametry pomocí metody „post“, poskytuje 1C:8 metodu: SendForProcessing

A tak si uveďme příklad, ve kterém na straně 1C jsou provedeny všechny kroky zpracování http požadavek:

Nejprve si zapišme akční plán (zvětšený):

A nyní jeho softwarová implementace v 1C:8

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

// 1. Vyplňte strukturu přenášených dat
postDataToPHP = nová struktura;
postDataToPHP.Insert("param1","ivanon");
postDataToPHP.Insert("param2","ivan");
postDataToPHP.Insert("param3","ivanovich");

// 2. Převeďte data na řetězec JSON
JSON = Process.JSON.Create();
jsPostDataToPHP = JSON.WriteJSON(postDataToPHP);


// 3. Vytvořte dočasnou odchozí zprávu (odeslanou na server pomocí metody POST)
// soubor, vložte do něj řetězec JSON.
tFile = new TextDocument;
stringData = jsPostDataToPHP;
tFile.AddLine(stringData);


// 4. Získejte název dočasného odchozího souboru. Bude obsahovat odchozí data ve formě řetězce JSON
Odchozí název_souboru = GetTemporaryFileName(.txt");

tFile.Write(Název odchozíhoSouboru,TextEncoding.UTF);

// 5. Získejte název dočasného vstupního souboru. Obdrží řetězec JSON: odpověď serveru PHP
InputFileName = GetTemporaryFileName(.txt");


// 6. Navažte spojení HTTP se serverem
chráněný = nepravdivý;
HTTPConnect = new HTTPConnect("localhost/wsClient10/json/testHTTPQuery10.php", Protected);


// 7. Proveďme HTTP požadavek. Přeneseme odchozí soubor na server (soubor obsahuje objekt JSON, tj. odchozí parametry)


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


// A my obdržíme odpověď ze serveru (příchozí soubor). Soubor obsahuje objekt //JSON (tj. data vrácená ze serveru)

// 8. Extrahujte data přijatá ze serveru z příchozího souboru
ResponseFile = nový TextDocument;
ResponseFile.Read(InputFileName,TextEncoding.UTF);
json_Data = ResponseFile.GetString(1);
mData = JSON.ReadJSON(json_Data);


// 9. Zobrazení přijatých dat pro uživatele
Report(mData["v1"]);
Report(mData["v2"]);


// 10. Smažte použité (již nepotřebné) dočasné soubory.
DeleteFiles(OutgoingFileName);
DeleteFiles(InputFileName);

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

A nakonec, příklad v PHP pro zpracování požadavku na straně serveru:

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

// 1. Získejte data řetězce z příchozího souboru
$json_filedata = file_get_contents("php://input");
// 2. Odřízněte všechny nepotřebné (přidají se 2 servisní znaky), které // narušují převod z JSON
$jsData = trim(ltrim($json_filedata));
$dlinaStr = strlen($jsData);
$_jsData = "";
$i=1;
zatímco ($i<$dlinaStr) {
pokud ($i>2) (
$_jsData = $_jsData.substr($jsData, $i, 1);
}
$i++;
}
// 3. Převod dat z JSON na objekt (strukturu)
$mData = json_decode($_jsData);
// 4. Vytvoříme další strukturu, kterou naplníme daty a // vrátíme se do 1C
třída returnData(
var $v1;
var $v2;
}
$sReturnData = new returnData;
$sReturnData->v1 = $mData->param1;
$sReturnData->v2 = $mData->param2;
// 5. Převeďte data struktury na řetězec JSON
$json_returnData = json_encode($sReturnData);
// 6. Vraťte data do 1C (výstupní data budou přesměrována do souboru, který bude vrácen do 1C)
echo $json_returnData;
?>

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

To je vše. Kompaktní a funkční!

5. Úkoly na vyžádání (projektové případy)

Na závěr uvedu ty, které jsou nyní zákazníky de facto nejžádanější a které jsou řešeny pomocí WEB služeb a http požadavků.

Název tématu je opravdu otázka, protože... Sám nevím, co to je a poprvé se s tím pokusím pracovat v rámci tohoto článku. Jediné, co mohu zaručit, je, že níže uvedený kód bude fungovat, ale moje fráze budou pouze domněnky a dohady o tom, jak tomu všemu sám rozumím. Tak pojďme...

Úvod

Musíme začít tím, proč koncept webových služeb vznikl. V době, kdy se tento koncept objevil ve světě, již existovaly technologie, které umožňovaly interakci aplikací na dálku, kdy jeden program mohl volat nějakou metodu v jiném programu, kterou bylo možné spustit na počítači umístěném v jiném městě nebo dokonce zemi. To vše se označuje zkratkou RPC (Remote Procedure Calling). Příklady zahrnují technologie CORBA a pro Javu - RMI (Remote Method Invoking). A zdá se, že je v nich všechno dobré, zvláště v CORBA, protože... Dá se s tím pracovat v jakémkoli programovacím jazyce, ale stále tomu něco chybělo. Domnívám se, že nevýhodou CORBA je, že funguje přes některé vlastní síťové protokoly namísto jednoduchého HTTP, které se vejde přes každý firewall. Myšlenkou webové služby bylo vytvořit RPC, které by se vkládalo do HTTP paketů. Tak začal vývoj standardu. Jaké jsou základní pojmy tohoto standardu:
  1. MÝDLO. Před voláním vzdálené procedury musíte toto volání popsat v souboru XML ve formátu SOAP. SOAP je jednoduše jedním z mnoha značek XML, které se používají ve webových službách. Vše, co chceme někam poslat přes HTTP, se nejprve převede do XML SOAP popisu, pak se nacpe do HTTP paketu a přes TCP/IP se pošle na jiný počítač v síti.
  2. WSDL. Existuje webová služba, tzn. program, jehož metody lze volat na dálku. Norma však vyžaduje, aby byl tento program doprovázen popisem, který říká, že „ano, máte pravdu – toto je skutečně webová služba a můžete z ní volat takové a takové metody“. Tento popis je reprezentován jiným souborem XML, který má jiný formát, a to WSDL. Tito. WSDL je pouze soubor XML popisující webovou službu a nic víc.
Proč se ptáš tak stručně? Nemůžeš být konkrétnější? Pravděpodobně je to možné, ale k tomu se budete muset obrátit na knihy, jako je T. Mashnin, „Java Web Services“. Na prvních 200 stránkách je zde podrobný popis každé značky standardů SOAP a WSDL. Vyplatí se to dělat? Podle mě ne, protože... to vše se v Javě vytváří automaticky a stačí napsat obsah metod, které mají být volány vzdáleně. V Javě se tedy objevilo API jako JAX-RPC. Pokud někdo neví, když říká, že Java má takové a takové API, znamená to, že existuje balíček se sadou tříd, které zapouzdřují danou technologii. JAX-RPC se postupem času vyvíjel od verze k verzi a nakonec se stal JAX-WS. WS očividně znamená WebService a možná si myslíte, že jde pouze o přejmenování RPC na populární módní slovo v dnešní době. To není pravda, protože Nyní webové služby ustoupily od původní myšlenky a umožňují nejen volat vzdálené metody, ale také jednoduše posílat zprávy dokumentů ve formátu SOAP. Zatím nevím, proč je to potřeba; je nepravděpodobné, že odpověď zde bude „jen pro případ, že by to bylo potřeba“. Sám bych se rád učil od zkušenějších soudruhů. A jako poslední se pak objevil JAX-RS pro tzv. RESTful webové služby, ale to je téma na samostatný článek. Úvod zde může skončit, protože... Dále se naučíme pracovat s JAX-WS.

Obecný přístup

Ve webových službách je vždy klient a server. Server je naše webová služba a někdy se mu říká koncový bod (jako koncový bod, kam dosáhnou zprávy SOAP od klienta). Musíme provést následující:
  1. Popište rozhraní naší webové služby
  2. Implementujte toto rozhraní
  3. Spusťte naši webovou službu
  4. Napište klienta a vzdáleně zavolejte požadovanou metodu webové služby
Webovou službu můžete spustit různými způsoby: buď popište třídu hlavní metodou a spusťte webovou službu přímo jako server, nebo ji nasaďte na server, jako je Tomcat nebo jakýkoli jiný. Ve druhém případě sami nespouštíme nový server a neotevíráme další port na počítači, ale jednoduše sdělíme kontejneru servletů Tomcat, že „napsali jsme zde třídy webových služeb, prosím, publikujte je, aby každý, kdo vás kontaktuje, mohl použijte naši webovou službu." Bez ohledu na způsob spuštění webové služby budeme mít stejného klienta.

Server

Spustíme IDEA a vytvoříme nový projekt Vytvořit nový projekt. Uveďme jméno HelloWebService a stiskněte tlačítko další, poté tlačítko Dokončit. Ve složce src vytvoříme balíček ru.javarush.ws. V tomto balíčku vytvoříme rozhraní HelloWebService: package ru. javarush. ws; // jedná se o anotace, tzn. způsob, jak označit naše třídy a metody, // ve vztahu k technologii webových služeb import javax. jws. WebMethod; importovat javax. jws. Webová služba; importovat javax. jws. mýdlo. SOAPBinding; // říkáme, že naše rozhraní bude fungovat jako webová služba@Webová služba // říkáme, že webová služba bude sloužit k volání metod@SOAPBinding (style = SOAPBinding. Styl. RPC) veřejné rozhraní HelloWebService ( // říkáme, že tuto metodu lze volat na dálku@WebMethod public String getHelloString(Název řetězce) ; ) V tomto kódu jsou třídy WebService a WebMethod takzvané anotace a nedělají nic jiného, ​​než označují naše rozhraní a jeho metodu jako webovou službu. Totéž platí pro třídu SOAPBinding. Jediný rozdíl je v tom, že SOAPBinding je anotace s parametry. V tomto případě je použit parametr style s hodnotou indikující, že webová služba bude fungovat nikoli přes zprávy dokumentů, ale jako klasické RPC, tzn. zavolat metodu. Pojďme implementovat naši logiku rozhraní a vytvořit v našem balíčku třídu HelloWebServiceImpl. Mimochodem podotýkám, že zakončení třídy pomocí Impl je v Javě konvence, podle které se tak označuje implementace rozhraní (Impl - od slova implementace, tedy implementace). Toto není požadavek a můžete si třídu pojmenovat, jak chcete, ale dobré mravy to vyžadují: package ru. javarush. ws; // stejná anotace jako při popisu rozhraní, importovat javax. jws. Webová služba; // ale zde se používá s parametrem endpointInterface, // označující úplný název třídy rozhraní naší webové služby@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") veřejná třída HelloWebServiceImpl implementuje službu HelloWebService ( @Override public String getHelloString (název řetězce) ( // stačí vrátit pozdrav return "Dobrý den, " + jméno + "!" ; ) ) Spusťte naši webovou službu jako samostatný server, tzn. bez účasti jakéhokoli Tomcatu a aplikačních serverů (toto je téma na samostatnou diskusi). Chcete-li to provést, ve struktuře projektu ve složce src Vytvoříme balíček ru.javarush.endpoint a v něm vytvoříme třídu HelloWebServicePublisher s hlavní metodou: package ru. javarush. koncový bod; // třída pro provoz webového serveru s webovými službami importovat javax. xml. ws. Koncový bod; // třída naší webové služby import ru. javarush. ws. HelloWebServiceImpl; public class HelloWebServicePublisher ( public static void main (String... args) ( // spusťte webový server na portu 1986 // a na adresu uvedenou v prvním argumentu, // spuštění webové služby předané ve druhém argumentu Koncový bod. publikovat( "http://localhost:1986/wss/hello", nový HelloWebServiceImpl () ); ) ) Nyní spustíme tuto třídu kliknutím Shift+F10. V konzole se nic nezobrazí, ale server běží. Můžete to ověřit zadáním řádku http://localhost:1986/wss/hello?wsdl do prohlížeče. Stránka, která se otevře, na jedné straně dokazuje, že máme webový server (http://) běžící na portu 1986 na našem počítači (localhost), a na druhé straně ukazuje WSDL popis naší webové služby. Pokud aplikaci zastavíte, popis bude nedostupný, stejně jako samotná webová služba, takže to neuděláme, ale přejdeme k psaní klienta.

Klient

Ve složce projektu src Vytvoříme balíček ru.javarush.client a v něm třídu HelloWebServiceClient s hlavní metodou: package ru. javarush. klient; // potřeboval získat popis wsdl a přes něj // dosažení samotné webové služby importovat java. síť. URL; // tato výjimka nastane při práci s objektem URL importovat java. síť. MalformedURLException; // třídy pro analýzu xml s popisem wsdl // a dostanete se na servisní značku v něm importovat javax. xml. jmenný prostor. QName; importovat javax. xml. ws. Servis; // rozhraní naší webové služby (potřebujeme další) import ru. javarush. ws. HelloWebService; public class HelloWebServiceClient ( public static void main (string args) vyvolá MalformedURLException ( // vytvořit odkaz na popis wsdl URL url = nová adresa URL ( "http://localhost:1986/wss/hello?wsdl") ; // Na parametry dalšího konstruktoru se podíváme v úplně první značce popisu WSDL - definice // podívejte se na 1. argument v atributu targetNamespace // podívejte se na 2. argument v atributu name QName qname = nový QName ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ; // Nyní můžeme dosáhnout servisní značky v popisu wsdl, Servisní služba = Servis. vytvořit (url, qname) ; // a pak až na značku portu vnořenou v něm, takže // získat odkaz na objekt webové služby vzdálený od nás HelloWebService hello = služba. getPort(HelloWebService.class); // Hurá! Nyní můžete zavolat vzdálenou metodu Systém. ven. println (ahoj. getHelloString ( "JavaRush" ) ) ; ) ) Maximálně jsem komentoval kód ve výpisu. Nemám co dodat, tak pojďme (Shift+F10). V konzoli bychom měli vidět text: Hello, JavaRush! Pokud jste to neviděli, pravděpodobně jste zapomněli spustit webovou službu.

Závěr

Toto téma poskytlo krátký exkurz do webových služeb. Ještě jednou řeknu, že hodně z toho, co jsem napsal, je můj odhad, jak to funguje, a proto byste mi neměli příliš věřit. Byl bych vděčný, kdyby mě znalí lidé opravili, protože pak se něco naučím. UPD.

Název tématu je opravdu otázka, protože... Sám nevím, co to je a poprvé se s tím pokusím pracovat v rámci tohoto článku. Jediné, co mohu zaručit, je, že níže uvedený kód bude fungovat, ale moje fráze budou pouze domněnky a dohady o tom, jak tomu všemu sám rozumím. Tak pojďme...

Úvod

Musíme začít tím, proč koncept webových služeb vznikl. V době, kdy se tento koncept objevil ve světě, již existovaly technologie, které umožňovaly interakci aplikací na dálku, kdy jeden program mohl volat nějakou metodu v jiném programu, kterou bylo možné spustit na počítači umístěném v jiném městě nebo dokonce zemi. To vše se označuje zkratkou RPC (Remote Procedure Calling). Příklady zahrnují technologie CORBA a pro Javu - RMI (Remote Method Invoking). A zdá se, že je v nich všechno dobré, zvláště v CORBA, protože... Dá se s tím pracovat v jakémkoli programovacím jazyce, ale stále tomu něco chybělo. Domnívám se, že nevýhodou CORBA je, že funguje přes některé vlastní síťové protokoly namísto jednoduchého HTTP, které se vejde přes každý firewall. Myšlenkou webové služby bylo vytvořit RPC, které by se vkládalo do HTTP paketů. Tak začal vývoj standardu. Jaké jsou základní pojmy tohoto standardu:
  1. MÝDLO. Před voláním vzdálené procedury musíte toto volání popsat v souboru XML ve formátu SOAP. SOAP je jednoduše jedním z mnoha značek XML, které se používají ve webových službách. Vše, co chceme někam poslat přes HTTP, se nejprve převede do XML SOAP popisu, pak se nacpe do HTTP paketu a přes TCP/IP se pošle na jiný počítač v síti.
  2. WSDL. Existuje webová služba, tzn. program, jehož metody lze volat na dálku. Norma však vyžaduje, aby byl tento program doprovázen popisem, který říká, že „ano, máte pravdu – toto je skutečně webová služba a můžete z ní volat takové a takové metody“. Tento popis je reprezentován jiným souborem XML, který má jiný formát, a to WSDL. Tito. WSDL je pouze soubor XML popisující webovou službu a nic víc.
Proč se ptáš tak stručně? Nemůžeš být konkrétnější? Pravděpodobně je to možné, ale k tomu se budete muset obrátit na knihy, jako je T. Mashnin, „Java Web Services“. Na prvních 200 stránkách je zde podrobný popis každé značky standardů SOAP a WSDL. Vyplatí se to dělat? Podle mě ne, protože... to vše se v Javě vytváří automaticky a stačí napsat obsah metod, které mají být volány vzdáleně. V Javě se tedy objevilo API jako JAX-RPC. Pokud někdo neví, když říká, že Java má takové a takové API, znamená to, že existuje balíček se sadou tříd, které zapouzdřují danou technologii. JAX-RPC se postupem času vyvíjel od verze k verzi a nakonec se stal JAX-WS. WS očividně znamená WebService a možná si myslíte, že jde pouze o přejmenování RPC na populární módní slovo v dnešní době. To není pravda, protože Nyní webové služby ustoupily od původní myšlenky a umožňují nejen volat vzdálené metody, ale také jednoduše posílat zprávy dokumentů ve formátu SOAP. Zatím nevím, proč je to potřeba; je nepravděpodobné, že odpověď zde bude „jen pro případ, že by to bylo potřeba“. Sám bych se rád učil od zkušenějších soudruhů. A jako poslední se pak objevil JAX-RS pro tzv. RESTful webové služby, ale to je téma na samostatný článek. Úvod zde může skončit, protože... Dále se naučíme pracovat s JAX-WS.

Obecný přístup

Ve webových službách je vždy klient a server. Server je naše webová služba a někdy se mu říká koncový bod (jako koncový bod, kam dosáhnou zprávy SOAP od klienta). Musíme provést následující:
  1. Popište rozhraní naší webové služby
  2. Implementujte toto rozhraní
  3. Spusťte naši webovou službu
  4. Napište klienta a vzdáleně zavolejte požadovanou metodu webové služby
Webovou službu můžete spustit různými způsoby: buď popište třídu hlavní metodou a spusťte webovou službu přímo jako server, nebo ji nasaďte na server, jako je Tomcat nebo jakýkoli jiný. Ve druhém případě sami nespouštíme nový server a neotevíráme další port na počítači, ale jednoduše sdělíme kontejneru servletů Tomcat, že „napsali jsme zde třídy webových služeb, prosím, publikujte je, aby každý, kdo vás kontaktuje, mohl použijte naši webovou službu." Bez ohledu na způsob spuštění webové služby budeme mít stejného klienta.

Server

Spustíme IDEA a vytvoříme nový projekt Vytvořit nový projekt. Uveďme jméno HelloWebService a stiskněte tlačítko další, poté tlačítko Dokončit. Ve složce src vytvoříme balíček ru.javarush.ws. V tomto balíčku vytvoříme rozhraní HelloWebService: package ru. javarush. ws; // jedná se o anotace, tzn. způsob, jak označit naše třídy a metody, // ve vztahu k technologii webových služeb import javax. jws. WebMethod; importovat javax. jws. Webová služba; importovat javax. jws. mýdlo. SOAPBinding; // říkáme, že naše rozhraní bude fungovat jako webová služba@Webová služba // říkáme, že webová služba bude sloužit k volání metod@SOAPBinding (style = SOAPBinding. Styl. RPC) veřejné rozhraní HelloWebService ( // říkáme, že tuto metodu lze volat na dálku@WebMethod public String getHelloString(Název řetězce) ; ) V tomto kódu jsou třídy WebService a WebMethod takzvané anotace a nedělají nic jiného, ​​než označují naše rozhraní a jeho metodu jako webovou službu. Totéž platí pro třídu SOAPBinding. Jediný rozdíl je v tom, že SOAPBinding je anotace s parametry. V tomto případě je použit parametr style s hodnotou indikující, že webová služba bude fungovat nikoli přes zprávy dokumentů, ale jako klasické RPC, tzn. zavolat metodu. Pojďme implementovat naši logiku rozhraní a vytvořit v našem balíčku třídu HelloWebServiceImpl. Mimochodem podotýkám, že zakončení třídy pomocí Impl je v Javě konvence, podle které se tak označuje implementace rozhraní (Impl - od slova implementace, tedy implementace). Toto není požadavek a můžete si třídu pojmenovat, jak chcete, ale dobré mravy to vyžadují: package ru. javarush. ws; // stejná anotace jako při popisu rozhraní, importovat javax. jws. Webová služba; // ale zde se používá s parametrem endpointInterface, // označující úplný název třídy rozhraní naší webové služby@WebService(endpointInterface= "ru.javarush.ws.HelloWebService") veřejná třída HelloWebServiceImpl implementuje službu HelloWebService ( @Override public String getHelloString (název řetězce) ( // stačí vrátit pozdrav return "Dobrý den, " + jméno + "!" ; ) ) Spusťte naši webovou službu jako samostatný server, tzn. bez účasti jakéhokoli Tomcatu a aplikačních serverů (toto je téma na samostatnou diskusi). Chcete-li to provést, ve struktuře projektu ve složce src Vytvoříme balíček ru.javarush.endpoint a v něm vytvoříme třídu HelloWebServicePublisher s hlavní metodou: package ru. javarush. koncový bod; // třída pro provoz webového serveru s webovými službami importovat javax. xml. ws. Koncový bod; // třída naší webové služby import ru. javarush. ws. HelloWebServiceImpl; public class HelloWebServicePublisher ( public static void main (String... args) ( // spusťte webový server na portu 1986 // a na adresu uvedenou v prvním argumentu, // spuštění webové služby předané ve druhém argumentu Koncový bod. publikovat( "http://localhost:1986/wss/hello", nový HelloWebServiceImpl () ); ) ) Nyní spustíme tuto třídu kliknutím Shift+F10. V konzole se nic nezobrazí, ale server běží. Můžete to ověřit zadáním řádku http://localhost:1986/wss/hello?wsdl do prohlížeče. Stránka, která se otevře, na jedné straně dokazuje, že máme webový server (http://) běžící na portu 1986 na našem počítači (localhost), a na druhé straně ukazuje WSDL popis naší webové služby. Pokud aplikaci zastavíte, popis bude nedostupný, stejně jako samotná webová služba, takže to neuděláme, ale přejdeme k psaní klienta.

Klient

Ve složce projektu src Vytvoříme balíček ru.javarush.client a v něm třídu HelloWebServiceClient s hlavní metodou: package ru. javarush. klient; // potřeboval získat popis wsdl a přes něj // dosažení samotné webové služby importovat java. síť. URL; // tato výjimka nastane při práci s objektem URL importovat java. síť. MalformedURLException; // třídy pro analýzu xml s popisem wsdl // a dostanete se na servisní značku v něm importovat javax. xml. jmenný prostor. QName; importovat javax. xml. ws. Servis; // rozhraní naší webové služby (potřebujeme další) import ru. javarush. ws. HelloWebService; public class HelloWebServiceClient ( public static void main (string args) vyvolá MalformedURLException ( // vytvořit odkaz na popis wsdl URL url = nová adresa URL ( "http://localhost:1986/wss/hello?wsdl") ; // Na parametry dalšího konstruktoru se podíváme v úplně první značce popisu WSDL - definice // podívejte se na 1. argument v atributu targetNamespace // podívejte se na 2. argument v atributu name QName qname = nový QName ("http://ws.site/" , "HelloWebServiceImplService" ) ; // Nyní můžeme dosáhnout servisní značky v popisu wsdl, Servisní služba = Servis. vytvořit (url, qname) ; // a pak až na značku portu vnořenou v něm, takže // získat odkaz na objekt webové služby vzdálený od nás HelloWebService hello = služba. getPort(HelloWebService.class); // Hurá! Nyní můžete zavolat vzdálenou metodu Systém. ven. println (ahoj. getHelloString ( "JavaRush" ) ) ; ) ) Maximálně jsem komentoval kód ve výpisu. Nemám co dodat, tak pojďme (Shift+F10). V konzoli bychom měli vidět text: Hello, JavaRush! Pokud jste to neviděli, pravděpodobně jste zapomněli spustit webovou službu.

Závěr

Toto téma poskytlo krátký exkurz do webových služeb. Ještě jednou řeknu, že hodně z toho, co jsem napsal, je můj odhad, jak to funguje, a proto byste mi neměli příliš věřit. Byl bych vděčný, kdyby mě znalí lidé opravili, protože pak se něco naučím. UPD.

Dnes jsou WEB služby využívány téměř všude – poskytují nám informace o letech letadlem a vlakem, směnných kurzech a počasí. Není divu, že 1C má také schopnost vytvářet své vlastní WEB služby, což jí umožňuje jednat jako dodavatel i spotřebitel. Tento mechanismus je zabudován do platformy 1C:Enterprise 8.3 a vývojáři mohou dokonce do standardní konfigurace přidávat své vlastní objekty typu WEB služeb. Jejich architektura je postavena na sadě služeb, které umožňují výměnu informací s jiným softwarem.

Vytvoření webové služby 1C

Jednou z hlavních výhod 1C WEB služeb je absence nutnosti poskytovat přímý přístup k datům informační bezpečnosti. Správně nakonfigurovaná webová služba 1C umožňuje dalším aplikacím používat funkce zvenčí. V takových případech by měla funkce sama určovat právo používat data podle zadaných parametrů podle pravidel předepsaných vývojářem.

Jak vytvořit webovou službu v 1C?

Aby byla určitá funkce systému 1C dostupná externímu softwaru, je nutné provést následující algoritmus akcí:

  1. Přejděte do konfigurace a přidejte objekt WEB služby do určité větve stromu;
  2. Popište všechny operace, které může naše funkce provádět. Popis funkcí se provádí v modulu ve vestavěném jazyce 1C;
  3. Přidejte popis parametrů funkcí webové služby. Vezměte prosím na vědomí, že datové typy jsou popsány s ohledem na existující typy mechanismu XDTO zavedené v platformě verze 8.1;
  4. Publikovat vytvořenou webovou službu na serveru. Mechanismus zabudovaný do platformy 1C podporuje následující standardy:
  • SSL/TLS
  • WS-I BP

Příklad vytvoření jednoduché WEB služby

Abychom co nejjasněji demonstrovali fungování mechanismu WEBových služeb, vytvořte si příklad – funkcionalitu, která určuje délku zadávaného řetězce. Software předá řetězec jako parametr požadavku a funkce popsaná v 1C vrátí počet znaků. Při vytváření je třeba pamatovat na to, že zveřejněním tohoto mechanismu k němu budou mít přístup různé programy. Protože ne každý software je schopen přijímat azbuku, budeme konfigurační objekty pojmenovávat pomocí latinských znaků.

Otevřete konfigurátor, najděte ve stromu větev „WEB services“ a přidejte novou službu „wa_LengthString“. Musíte také přidat novou operaci na kartě „Operace“. Nazvěme to „CalcLengthString“, ve vlastnostech určete typ návratové hodnoty – int nebo integer a vytvořte v něm parametr „InputString“. Typ hodnoty ponecháme jako řetězec.

Nyní je potřeba zaregistrovat akci funkce CalcLengthString v modulu WEB služby. Chcete-li to provést, otevřete vlastnosti vytvořené funkce a klikněte na tlačítko ve formě lupy vpravo vedle vstupního pole „Název procedury“. 1C automaticky vytvoří funkci v našem modulu WEB služeb a otevře ji, abychom mohli popsat akci CalcLengthString. Využijme toho a napišme akci funkce – určení délky vstupního řetězce.


Tím je vlastně tvorba jednoduché WEB služby dokončena. Nyní je nutné „umístit“ tuto službu do veřejné domény, aby software třetích stran nebo jiné systémy 1C mohly tuto funkci využívat.

Abychom mohli vytvořenou webovou službu s její funkčností publikovat, potřebujeme mít na stránky přístup. Než začneme službu publikovat, musíme zkontrolovat název souboru ve vlastnostech vytvořeného modulu wa_LengthString. Měl by být jasný, jednoduchý a měl by mít příponu „1cws“.


Nyní je čas publikovat webovou službu, kterou jsme vytvořili na serveru. Tato funkce se objevila v platformě verze 8.3 a mnoho společností si již plně uvědomilo výhody této funkce. Pro zahájení publikování je třeba v konfigurátoru otevřít formulář „Administrace/Publikování na webovém serveru...“.


V okně, které se otevře, musíme nakonfigurovat webové služby 1C a vyplnit určitá pole:

  • Název. Označuje složku na webovém serveru, ve které bude uložen popis naší webové služby. Dávejte pozor na velká a malá písmena, protože někdy servery rozlišují mezi velkými a malými písmeny;
  • Webový server. Musíte vybrat server ze serverů nainstalovaných na vašem počítači;
  • Katalog. Musíte vybrat cestu ke složce, kde jsou uložena data webového serveru pro nastavení připojení. Používají se pouze latinská písmena;
  • Dva znaky booleovského typu. První se nám bude hodit, pokud potřebujeme nakonfigurovat přístup ke konfiguraci přes webového klienta. Chcete-li publikovat službu 1C, musíte zaškrtnout druhé políčko.

Zbývá pouze zkontrolovat, zda má požadovaná WEB služba zaškrtnuté políčko v prvním sloupci a kliknout na „Publikovat“.


Protože je tento mechanismus stále zcela nový, můžete se setkat s chybou jako „Při provádění operace se souborem došlo k chybě...“. V tomto případě stačí znovu kliknout na „Publikovat“. Ve většině případů to pomůže a zobrazí se zpráva oznamující, že webová služba byla publikována.

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

V reakci na takovou žádost o adresu musí prohlížeč zobrazit strukturu souboru XML. Pokud uvidíte prázdnou stránku, chybu nebo podivné znaky (problémy s kódováním), musíte znovu zkontrolovat všechny kroky. Je také dobré se ujistit, že je server správně nakonfigurován a máte k němu přístup. Po úspěšném zveřejnění budou moci webovou službu 1C používat aplikace třetích stran.


Klíčová slova: webová služba, webová služba, SOAP, WSDL, ws link

Zřeknutí se odpovědnosti a podmínky použití

Všechny ochranné známky náhodně uvedené v tomto článku patří jejich příslušným vlastníkům.
Tento článek je publikován pod licencí Creative Commons Attribution-Share Alike 3.0 Unported License. http://creativecommons.org/licenses/by-sa/3.0/

Další vyloučení odpovědnosti (po mnoha případech)

Platforma 1C:Enterprise 8 se neustále vyvíjí. Proto kód uvedený v tomto článku vygeneruje chybu v nejnovějších verzích platformy. K tomu dochází zejména v důsledku skutečnosti, že se změnilo pořadí volání metod proxy objektu webové služby: například složité objekty musí být explicitně převedeny na objekt XDTO příslušného typu pomocí Factory příslušné služby. . O tom si můžete přečíst na našem fóru nebo v knize „1C:Enterprise Integration Technologies“ http://v8.1c.ru/metod/books/book.jsp?id=288

Úvod

Když se objeví nová verze softwarového produktu, přirozeně ze všeho nejdřív chcete pochopit, co je v něm nového. V případě 1C:Enterprise 8.1 se pro mě takovou novou „funkcí“ staly webové služby. O webových službách bylo napsáno a řečeno mnoho, protože tato technologie existuje podle počítačových standardů poměrně dlouho. Proto se nebudu opakovat, všechny odkazuji na Yandex pro informace. Řeknu pouze, že s vydáním nového vydání platformy 1C:Enterprise 8.1 má 1Snikov příležitost vytvářet a používat technologii webových služeb, abych tak řekl, ve svém původním prostředí. V tomto článku chci ukázat, jak používat externí webové služby ve vašem vývoji.

Pro ty, kteří jsou úplně „mimo mísu“: o webových službách „na dosah ruky“

OK, speciálně pro tebe Pokusím se vám říci něco o tom, co je webová služba a proč přesně Tento Zdálo se mi to jako „lahodná“ inovace platformy. Možná víte o technologii COM nebo jste slyšeli něco o OLE? Dříve nebo později se s touto technologií setká každý jednotlivý pracovník (zejména pokud potřebujete rychle přenést nějaký adresář „Zaměstnanci“ a personální oddělení, které předvídá nutnost znovu nashromáždit všech 1500 zaměstnanců, je připraveno vás pověsit na první vhodný hřebík, který se objeví).
Ano, jádrem technologie COM je myšlenka možnosti volání programového kódu (a přístup k datům) jedné aplikace z jiné aplikace. Navíc, možnosti to ne na úrovni jednotlivých procedur a funkcí, ale tím, že se dostanete k dispozici objektů jinou aplikaci. Při použití OLE vytvoříme v naší aplikaci objekt, který je " zástupce"nebo chcete-li," obal"nějakého objektu aplikace, se kterým chceme interagovat (tzv. "OLE objekt" nebo "COM objekt"). Prostřednictvím tohoto "obalového" objektu se nám zpřístupní vlastnosti a metody objektu jiné aplikace , a pouze ty, které developer Jít Aplikace nám umožnily používat jejich zveřejněním v popisu rozhraní. (No, nechtěl jsem se dostat do plevele, ale není jiná cesta...)
Teď si to představme přesně to samé aplikace je umístěna na jiném počítači, a to ani ne v lokální síti (DCOM, CORBA a další sprosté zkratky takové případy zvládají dobře), ale někde daleko, daleko na internetu. Zde přicházejí na scénu webové služby (rovněž doplněné o srozumitelné zkratky: SOAP, WSDL atd.), které vám v tomto případě umožňují provést podobný „trik“: tzn. přijímat data a manipulovat s objekty z aplikace běžící na počítači na druhé straně internetu.
Pod " externí„Webovou službou myslím webovou službu poskytovanou některým dodavatele službou (tedy ne naší aplikací.) V souladu s tím „interní“ – webovou službou, kterou budeme poskytovat z, nebo přesněji, na základě naše aplikace. Při používání externích webových služeb musíme pochopit, že ačkoli je objekt „wrapper“ vytvořen v naší „lokální“ aplikaci, „prováděcí kód“ tohoto objektu se nachází možná na druhé straně Zeměkoule. Ve stejné době, výměna mezi nás A jim se odehrává na nyní všudypřítomném XML s jeho dobře známými „klady“ (všestrannost a struktura) a „nevýhodami“ (nadýmání) a jako „přenosová linka“ se používá staré dobré http.
Ano, a nezapomeňte na internetový provoz! Navíc v případě externích webových služeb bude většina zapnutá přicházející komponent.
Vše ostatní je v Yandexu. Pokračujme...

Odkud jsou nohy, tzn. křídla rostou

Když jsem se prohrabal Yandexem, našel jsem skvělou webovou službu od společnosti Aeroflot, která vám umožňuje přijímat informace o příletech a odletech letadel v reálném čase, a rozhodl jsem se vytvořit jakýsi „letištní displej“ v 1C:Enterprise. Samotná služba žije zde: http://webservices.aeroflot.ru/desc_flightinfo.asp

Řekl: "Pojďme!"

Pro začátek jsem vytvořil prázdnou konfiguraci „1C:Enterprise 8.1“ (v době psaní tohoto článku jsem měl k dispozici verzi platformy 8.1.5.123). Poté jsem do své konfigurace přidal nový objekt typu WS-link. Po výzvě k zadání adresy URL importovaného WSDL jsem zadal odkaz na soubor WSDL, který je uveden na stránce služby: http://webservices.aeroflot.aero/flightstatus.wsdl (Soubor WSDL je popis webová služba. Podrobnosti naleznete na webu Yandex ) a vytvořené zařízení hrdě pojmenovali „Aeroflot“. Dvojitým kliknutím na tento objekt jsem získal strom se strukturou webové služby.

Tento strom představuje „portrét“ webové služby, jak ji vidí 1Ska. To nejzajímavější je na větvi „Webové služby“: toto jména A porty webové služby (ve skutečnosti může soubor WSDL popisovat ne jednu, ale několik webových služeb, pak bude mít každá webová služba svou vlastní větev) a jsou uvedeny metody webová služba. Jedná se o samotné „provázky“, jejichž zatažením si zpřístupníte data, která webová služba poskytuje. Větev "Datový model" obsahuje popis knihoven datových typů, které webová služba používá.
Stručné shrnutí toho, jak webovou službu používat, obvykle najdete na stejném místě jako odkaz na soubor WSDL. V případě Aeroflotu je to stránka http://webservices.aeroflot.aero/flightstatus.asmx

"Teď vzlet, teď přistání..."

Pro práci s webovou službou jsem do konfigurace přidal zpracování „Zobrazení odjezdů“ a v ní - jeden formulář, který jsem označil jako hlavní. Na formuláři jsem umístil výběrové pole „Výběr letiště“, vstupní pole „Datum letu“, panel „Panel stolu“ se dvěma stránkami „Přílety“ a „Odlety“, přičemž jsem odškrtl příznak „Rozdělit na stránky“ v vlastnosti panelu a pole tabulky "Tabulka".
Interakce s webovou službou probíhá na principu „request-response“ a pro webovou službu je vytvořen speciální zprostředkující objekt. Proto jsem přidal podrobnosti formuláře „ServiceAeroflot“ vlastního typu.
Pokud si pozorně přečtete popis služby, můžete vidět, že webová služba poskytuje údaje o příchodech a odchodech prostřednictvím volání na metodu Příjezd a Odjezd. V tomto případě obě metody berou jako parametry kód letiště a požadované datum. Webová služba navíc poskytuje možnost získat seznam letišť, pro která jsou v systému dostupná data. Následující scénář interakce s webovou službou je zcela zřejmý:
1. Získejte seznam letišť;
2. Vyberte požadované letiště a datum;
3. Získejte údaje o příletech nebo odletech;
Ale před přístupem k webové službě musíte inicializovat zprostředkující objekt (například WSProxy), což jsem udělal v obslužné rutině otevírání formuláře:
ServiceAeroflot=WSLinks.Aeroflot.CreateWSProxy(" http: //www.aeroflot.ru/", "FlightStatus", "FlightStatusSoap");
Prvním parametrem je URI jmenného prostoru webové služby. Zjistíte to otevřením vlastností webové služby ve stromu odkazů WS. Druhý a třetí parametr přenáší název a port webové služby.
(nezaměňujte pojmy „jméno“, „port“, „proxy“ atd., jak se používají u webových služeb, se známějšími pojmy protokolu TCP/IP. Pokud mezi nimi existuje korespondence, je spíše sémantický V obecném případě musíte pochopit, že například port webové služby a port TCP jsou zcela odlišné věci).
Inicializoval jsem tedy objekt Aeroflot Service typu WSProxy, který je v podstatě „obalem“ webové služby. Prostřednictvím něj mohu přistupovat k metodám webových služeb jako k „nativním“ metodám platformy.
Nejprve jsem obdržel seznam letišť a vyplnil seznam do výběrového pole „Vybrat letiště“:

SelectionList=FormElements.AirportSelection.SelectionList; SelectionList.Clear(); AirportList=Aeroflot Service.AirportList().GetList("seznam"); TotalAirports=ListAirports.Count(); For ui=0 to TotalAirports-1 Cycle Airport=ListAirports.Get(ies); SelectionList.Add(Letiště.kód, ""+Letiště.město+" : "+Název.letiště); EndCycle;
Zde potřebujeme malou poznámku ke konstrukci Seznam letišť = ServiceAeroflot.AirportList().GetList("seznam");
Faktem je, že hodnoty vrácené metodami webových služeb jsou na platformě reprezentovány objekty typu XDTO Object. Protože téma technologie XDTO přesahuje rámec tohoto článku, řeknu pouze, že pro transformací Tento objekt do seznamu (což je), zavolal jsem jeho metodu GetList(). Zbytek kódu je zcela zřejmý, včetně názvů polí struktury letiště, které jsem našel na stránce popisu webové služby.
Nyní můžete spustit konfiguraci a ujistit se, že seznam polí výběru je vyplněn názvy letišť:

"Den odjezdu, den příjezdu..."

Nyní mám téměř vše připraveno, aby moje výsledková tabulka fungovala. Nezbývá než to "vymalovat a vyhodit" :) To je to, co udělám:

Procedure FillTableboard(Arrival=True) TableTableboard.Columns.Clear(); TableTableboard.Columns.Add("Kód letu", "Kód letu"); TableTableboard.Columns.Add(" Kód letecké společnosti", "Airline"); TableTable.Columns.Add("FlightNumber", "Number"); TableTable.Columns.Add(" Airport Transit", "Letištní tranzit"); TableTable.Columns.Add("Letiště", "Letiště"+?(Přílety,"odlety,","přílety")); TableTable.Columns.Add(" Časový harmonogram", "Podle plánu"); TableTableboard.Columns.Add(" Časově plánováno", "Plánováno"); TableTableboard.Columns.Add(" TimeActual", "Skutečný"); TableTable.Columns.Add("Vypočítaný čas", "Vypočítaný"); TableTable.Columns.Add("Čas přistání", ?(Přílet,"Přistání","Vzlet")); Tabulka. Columns. Add("Combined Flight", "Combined Flight"); TableTable.Columns.Add("Status", "Status"); If Not Arrival Then TableTable.Columns.Add("Registration", "Registration"); TableTable .Columns .Add("Landing", "Landing"); EndIf; Prvky formuláře. Tabulka výsledkové tabulky. Vytvořit Columns(); Prvky formuláře. Tabulka výsledkové tabulky. Sloupce. Kód letu. Viditelnost = False; Pokud nedorazí, pak prvky formuláře. Tabulka hodnocení Tabulka. Sloupce. Odhadovaný čas. Viditelnost = False; EndIf; If Arrival Then Data=Aeroflot Service.Arrival(Výběr letiště, Datum letu).Get List("list "); Jinak Data=Aeroflot Service.Departure(Výběr letiště, Let Date).Get List("list "); EndIf; Total Records=Data.Number(); For ii=0 pro 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 = Vstup.letiště; NewLine.TimeSchedule=Záznam.naplánován; NewLine.TimePlanned=Záznam.plán; NewLine.TimeActual=Záznam.skutečnost; NewLine.TimeCalculated=Record.calc; NewLine.LandingTime=Record.real; NewLine.UnionFlight=Record.union_flight_no; NewRow.Status=Record.Status; If Not Arrival Then NewLine.Registration=Record.is_check; NewLine.Landing = Entry.is_board; endIf; EndCycle; Konec procedury

Abych si ověřil, jak to všechno funguje, přidal jsem na příkazový panel formuláře tlačítko „Aktualizovat“ s odpovídajícím obrázkem a do jeho manipulátoru jsem napsal následující:

Procedure CommandPanel1 Update(Button) FillTableboard(FormElements.TableboardPanel.CurrentPage=FormElements.TableboardPanel.Pages.Arrivals); Konec procedury
Uložím, spustím, vyberu, kliknu, získám:

Doslov

Po napsání a zveřejnění článku se překvapivě ukázalo, že respektovaný ZAV již podobný příklad zveřejnil na IT-Land: http://itland.ru/biblio/detail.php?ID=1060
Abyste se vyhnuli případnému nařčení z plagiátorství, důrazně doporučuji přečíst si i tento článek a porovnat přístupy autorů.