Crmgo Blog

Zrušení modalit

Zrušení modalit

https://xn----1-bedvffifm4g.xn--p1ai/news/%D0%BE%D1%82%D0%BA%D0%B0%D0%B7-%D0%BE%D1%82-%D0%BC%D0%BE%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BE%D0%BA%D0%BE%D0%BD-%D0%B2-1%D1%81-8-3/ Použitelnost Článek se zabývá asynchronním modelem tvorby obchodní logiky, který byl přidán do platformy „1C:Podnik“ verze 8.3. Uvedené informace jsou aktuální pro aktuální vydání platformy. Odmítnutí používání modálních oken v platformě 1C:Podnik 8.3 Při vývoji konfigurace na platformě 1C:Podnik 8 se občas objeví potřeba…

Zrušení modalit

https://xn----1-bedvffifm4g.xn--p1ai/news/%D0%BE%D1%82%D0%BA%D0%B0%D0%B7-%D0%BE%D1%82-%D0%BC%D0%BE%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BE%D0%BA%D0%BE%D0%BD-%D0%B2-1%D1%81-8-3/

 

Použití Článek se zabývá asynchronním modelem tvorby obchodní logiky, který byl přidán do platformy „1C:Podnikání“ verze 8.3. Uvedené informace jsou aktuální pro aktuální vydání platformy. Odmítnutí používání modálních oken v platformě 1C:Podnikání 8.3 Při vývoji konfigurace na platformě 1C:Podnikání 8 se občas vyskytne potřeba pozastavit práci programu do té doby, než uživatel přijme nějaké rozhodnutí nebo provede nějaké akce. Například při stisknutí tlačítka pro vyplnění tabulkové části by se uživatele mělo zeptat, zda má být tabulková část vyčištěna, aby nedošlo ke ztrátě dříve zadaných dat. Takové chování může zajistit například následující kód: &NaKlientu Procedura VyplnitZbozi(Prikaz) Odpoved = Otazka(“Tabulková část bude vyčištěna. Pokračovat?“, RezimDialoguOtazky.AnalNE); Pokud Odpoved = KodNavratuDialogu.Anal Pak //algoritmus vyplnění KonecPokud; KonecProcedury V důsledku práce tohoto fragmentu kódu dojde k pozastavení provádění programového kódu, na obrazovce se zobrazí otázka, rozhraní aplikace kromě dialogu s otázkou se stane nedostupným, systém čeká na přijetí rozhodnutí uživatelem, provádění kódu bude pokračovat až po odpovědi na otázku. K pozastavení provádění kódu a blokování rozhraní také dochází při otevírání modálních oken pomocí volání metody OtevritModalne(). Při práci s konfigurací v režimu webového klienta prostřednictvím prohlížeče se v tomto případě otevře nové okno – vyskakovací okno, které zablokuje nejen aktuální kartu, ale i celé rozhraní prohlížeče, včetně ostatních otevřených oken a karet. Vyskakovací okna na internetu jsou často používána k zlému šíření nežádoucí reklamy, proto prohlížeče obsahují funkce pro blokování vyskakovacích oken. V takovém případě je pro práci s konfiguracemi 1C:Podnikání 8 prostřednictvím prohlížeče nutné zakázat blokování vyskakovacích oken. Problémy také vznikají při práci na mobilních zařízeních. Například modální okna nejsou na iPadu podporována. Pro řešení uvedených problémů by se měly používat blokovací okna místo modálních. Pro uživatele to vypadá vizuálně stejně: okno blokuje rozhraní webového klienta. Blokovací okno je však „nakresleno“ nad hlavním oknem a blokuje se pouze aktuální karta prohlížeče, ve které je otevřena konfigurace, což umožňuje přepínání na jiné karty, protože modální okna prohlížeče se při tom nepoužívají. Tím pádem se v prohlížeči neotevírají vyskakovací okna a zajišťuje se práce prostřednictvím webového klienta na mobilních zařízeních. U kořenového prvku konfigurace existuje vlastnost „Režim používání modalit“, která určuje, zda lze v konfiguraci otevírat modální okna. Pokud je vybrána možnost „Používat“, lze modální okna otevírat. Pokud je vybrána možnost „Nepoužívat“, modální okna nejsou přípustná. Při pokusu o volání metody, která otevírá modální okno, systém zobrazí chybovou zprávu: Při této hodnotě vlastnosti „Režim používání modalit“ jsou přípustná pouze blokovací okna. Pokud je vybrána možnost „Používat s upozorněními“, zobrazí se při otevírání modálních oken v okně zpráv text: Tento režim práce může být použit jako přechodný při přepracování konfigurace s cílem odmítnout používání modálních oken. Hlavní rozdíl mezi blokovacími a modálními okny spočívá v tom, že otevření blokovacího okno nezpůsobuje pozastavení provádění kódu. Vývojáři si tedy budou muset přepsat programový kód, který používá modální okna, s ohledem na tuto vlastnost. Kód je třeba rozdělit na dvě části: otevření blokovacího okna; zpracování výběru uživatele. Fragment kódu uvedený na začátku článku je třeba přepsat následovně: &NaKlientu Procedura VyplnitZbozi(Prikaz) Upozorneni = Novy PopisUpozorneni(“VyplnitZboziOtazkaZavereni“, TentoObjekt); TextOtazky = “Tabulková část bude vyčištěna. Pokračovat?”; ZobraziOtazku(Upozorneni, TextOtazky, RezimDialoguOtazky.AnalNE); KonecProcedury &NaKlientu Procedura VyplnitZboziOtazkaZavereni(Vysledek, DalsiParametry) Export Pokud Vysledek = KodNavratuDialogu.Anal Pak //algoritmus vyplnění KonecPokud; KonecProcedury Po provedení procedury ZobraziOtazku() se systém nezastaví a nečeká na odpověď uživatele, provádění kódu pokračuje. Uživatel bude moci provést výběr až po dokončení práce celé procedury. Přitom bude volána exportní procedura VyplnitZboziOtazkaZavereni(). Její název jsme předali v konstruktoru objektu PopisUpozorneni. Procedura, která bude volána po provedení výběru, může být umístěna v modulu formuláře, modulu příkazu, obecném ne globálním modulu. V probraném příkladu je volaná procedura umístěna v modulu řízeného formuláře, proto jsme předali v parametru TentoObjekt. Proberme volání procedury umístěné v obecném modulu. K tomu přidáme nový obecný modul ZpracovaniUpozorneni, nastavíme pro něj příznak „Klient (řízená aplikace)“ a příznak „Globální“ nebudeme nastavovat. V tomto modulu umístíme proceduru VyplnitZboziOtazkaZavereni(). Pak bude obslužná rutina příkazu pro vyplnění vypadat takto: &NaKlientu Procedura VyplnitZbozi(Prikaz) Upozorneni = Novy PopisUpozorneni(“VyplnitZboziOtazkaZavereni“, ZpracovaniUpozorneni); TextOtazky = “Tabulková část bude vyčištěna. Pokračovat?”; ZobraziOtazku(Upozorneni, TextOtazky, RezimDialoguOtazky.AnalNE); KonecProcedury Po volání jakékoli metody, která otevírá blokovací okno, by procedura měla skončit a kód, který se má dále provádět, by měl být umístěn v proceduře, která bude volána po zavření okna. Pro předání kontextu (pomocných dat, určitých parametrů, hodnot proměnných) z procedury, která otevírá modální okno, do procedury, která se volá při jeho zavření, je určen třetí nepovinný parametr konstruktoru objektu PopisUpozorneni – DalsiParametry. Tento objekt (jakéhokoli typu) bude předán do procedury popsané v PopisUpozorneni jako poslední parametr. Na příkladu výše uvedeného úryvku kódu to lze provést takto: &NaKlientu Procedura VyplnitZbozi(Prikaz) Parametr1 = 0; Parametr2 = 0; SeznamParametru = Novy Struktura(“Parametr1, Parametr2“, Parametr1, Parametr2); Upozorneni = Novy PopisUpozorneni(“VyplnitZboziOtazkaZavereni“, TentoObjekt, SeznamParametru); ZobraziOtazku(Upozorneni, “Tabulková část bude vyčištěna. Pokračovat?”, RezimDialoguOtazky.AnalNE); KonecProcedury &NaKlientu Procedura VyplnitZboziOtazkaZavereni(Vysledek, DalsiParametry) Export Pokud Vysledek = KodNavratuDialogu.Anal Pak //analyzujeme DalsiParametry.Parametr1 //analyzujeme DalsiParametry.Parametr2 KonecPokud; KonecProcedury Pokud je třeba předat pouze jednu hodnotu, lze strukturu nepoužít a přiřadit tuto hodnotu parametru DalsiParametry konstruktoru objektu PopisUpozorneni. Proberme několik příkladů práce s blokovacími okny. Úkol 1. Otevření jiného formuláře Z formuláře dokumentu po stisknutí tlačítka „Otevřít parametry“ je třeba otevřít formulář, na kterém jsou umístěna dvě zaškrtávací políčka Parametr1 a Parametr2, která musí uživatel nastavit. Po zavření formuláře vypsat do řádku zpráv hodnoty parametrů. Vytvoříme obecný formulář „FormularParametru“, na kterém umístíme atributy Parametr1 a Parametr2, stejně jako příkaz ZavritFormul: Obslužná rutina příkazu vypadá následovně: Obslužná rutina příkazu vypadá následovně: &NaKlientu Procedura ZavritFormul(Prikaz) SeznamParametru = Novy Struktura(“Parametr1, Parametr2“, Parametr1, Parametr2); Zavrit(SeznamParametru); KonecProcedury Pro formulář nastavíme vlastnost RezimOteviraniOkna na „Blokovat celé rozhraní“: Na formuláři dokumentu umístíme příkaz OtevritParametry, jehož obslužnou rutinu popíšeme následovně: &NaKlientu Procedura OtevritParametry(Prikaz) Upozorneni = Novy PopisUpozorneni(“OtevritParametryZavereni“, TentoObjekt); OtevritFormul(“ObecnyFormul.FormularParametru“, , , , , , Upozorneni); KonecProcedury &NaKlientu Procedura OtevritParametryZavereni(Vysledek, DalsiParametry) Export Pokud TypZn(Vysledek) = Typ(“Struktura“) Pak Pro kazdy KlicHodnota z Vysledek Cyklus Zprava = Novy ZpravaUzivateli; Zprava.Text = “Klíč: “”” + KlicHodnota.Klic + “””, hodnota = ” + KlicHodnota.Hodnota; Zprava.Zpravit(); KonecCyklu; KonecPokud; KonecProcedury V uživatelském režimu, spuštěním konfigurace pod webovým klientem, získáme následující výsledky práce: Pro zvětšení klikněte na obrázek. Režim otevření okna lze také zadat v posledním parametru procedury OtevritFormul. &NaKlientu Procedura OtevritParametry(Prikaz) Upozorneni = Novy PopisUpozorneni(“OtevritParametryZavereni“, TentoObjekt); OtevritFormul(“ObecnyFormul.FormularParametru“, , , , , , Upozorneni, RezimOteviraniOknaFormularu.BlokovatCeleRozhrani); KonecProcedury Úkol 2. Otázka při zavírání formuláře Při zavírání okna zpracování položit uživateli otázku, zda skutečně chce okno zavřít. Tento úkol lze vyřešit pomocí následujícího kódu umístěného v modulu formuláře zpracování: &NaKlientu Promenna MusiZavritFormul; &NaKlientu Procedura PredZavrenim(Odmítnuti, StandardniZpracovani) Pokud NE MusiZavritFormul = Pravda Pak Odmítnuti = Pravda; Upozorneni = Novy PopisUpozorneni(“PredZavrenimZavereni“, TentoObjekt); ZobraziOtazku(Upozorneni, “Opravdu chcete zavřít okno?”, RezimDialoguOtazky.AnalNE); KonecPokud; KonecProcedury &NaKlientu Procedura PredZavrenimZavereni(Vysledek, DalsiParametry) Export Pokud Vysledek = KodNavratuDialogu.Anal Pak MusiZavritFormul = Pravda; Zavrit(); Jinak MusiZavritFormul = Nedefinováno; KonecPokud; KonecProcedury V proceduře PredZavrenim formuláře se uživateli položí otázka, příznak Odmítnuti se nastaví na Pravda, zavření formuláře se zruší. Po kladné odpovědi na otázku se proměnná MusiZavritFormul nastaví na Pravda a formulář se znovu zavře. Úkol 3. Zadání číselné hodnoty Při stisknutí tlačítka na formuláři zpracování otevřít standardní dialog zadání čísla. K tomu je třeba použít metodu ZobraziVvodCisla() místo VvestCislo(), která otevírá blokovací okno místo modálního. &NaKlientu Procedura VvodCisla(Prikaz) Upozorneni = Novy PopisUpozorneni(“VvodCislaZavereni“, TentoObjekt); ZobraziVvodCisla(Upozorneni, 0, “Zadejte množství”, 15, 3); KonecProcedury &NaKlientu Procedura VvodCislaZavereni(Vysledek, DalsiParametry) Export Pokud NE Vysledek = Nedefinováno Pak Zprava = Novy ZpravaUzivateli; Zprava.Text = “Zadali jste množství ” + Vysledek; Zprava.Zpravit(); KonecPokud; KonecProcedury Po zavření okna zadání čísla bude volána procedura, do jejíhož prvního parametru bude předáno zadané číslo nebo hodnota Nedefinováno, pokud uživatel zadání odmítl. Úkol 4. Výběr barvy Při stisknutí tlačítka na formuláři zpracování pomocí standardního dialogu výběru barvy uživatel určí potřebnou barvu. Tuto barvu nastavit pro pozadí stisknutého tlačítka. Přidáme na formulář příkaz VyberBarvy s následující obslužnou rutinou: &NaKlientu Procedura VyberBarvy(Prikaz) DialogVyberuBarvy = Novy DialogVyberuBarvy; Upozorneni = Novy PopisUpozorneni(“VyberBarvyZavereni“, TentoObjekt); DialogVyberuBarvy.Zobrazit(Upozorneni); KonecProcedury &NaKlientu Procedura VyberBarvyZavereni(Vysledek, DalsiParametry) Export Pokud NE Vysledek = Nedefinováno Pak Elementy.VyberBarvy.BarvaPozadi = Vysledek; KonecPokud; KonecProcedury Pro objekty DialogVyberuBarvy (také DialogUpravovaniStandardnihoObdobi, KonstruktorFormatnihoRetezce, DialogRozpisuRezhlednehoZadani, DialogVyberuPisma) metoda Zobrazit() otevírá blokovací okno. Po zavření okna bude volána procedura, do jejíhož prvního parametru bude předáno vybraná hodnota (barva, písmo atd.) nebo hodnota Nedefinováno, pokud uživatel výběr odmítl. Je třeba si uvědomit, že objekt DialogVyberuSouboru nemá metodu Zobrazit() na rozdíl od dialogů výběru barvy nebo písma, protože implementace těchto dialogů je zásadně odlišná. Pro použití dialogu výběru souboru na webovém klientu je třeba předem připojit rozšíření pro práci se soubory. Dialogy realizované prostřednictvím rozšíření pro práci se soubory nezpůsobují takové problémy při práci jako modální okna prohlížečů, proto nebyla implementována možnost otevírání blokovacích oken pro objekt DialogVyberuSouboru. Na závěr uvedeme, že od vydání 8.3.10 byla ve webovém klientovi ukončena podpora modálních oken. V takovém případě, pokud v konfiguraci dojde k volání modální metody, dojde k vygenerování výjimky. Také ve webovém klientovi byla ukončena podpora režimu rozhraní „V samostatných oknech“. Kromě toho nelze ani v tenkém, ani ve webovém klientovi otevřít formulář v samostatném okně (při práci v režimu rozhraní „V kartách“). Takové radikální kroky umožnily odmítnout režim rozhraní, který již není podporován všemi moderními prohlížeči. Jaký praktický závěr lze z této informace udělat? Závěr je poměrně jednoduchý – pokud z nějakého důvodu ve vaší konfiguraci stále existují modální volání, bude se v těchto místech ve webovém klientovi zobrazovat okno se zprávou o chybě. Rádi bychom varovali před pokusy „vygooglit“ nějaké rychlé řešení tohoto problému, protože většina rad se svádí na tento recept: v konfiguratoru na úrovni konfigurace ve vlastnosti „Režim používání modalit“ nastavit hodnotu „Používat“. Samozřejmě, v tuto chvíli to nebude fungovat jen proto, že samotné moderní prohlížeče již nepodporují modální volání. A máte pouze dvě cesty, jak vyřešit výše popsaný problém: Aktualizovat platformu na vydání 8.3.10+ (8.3.11), nastavit vlastnost konfigurace „Režim kompatibility“ na „Nepoužívat“ a přepsat fragmenty kódu, které používají modální metody na asynchronní model tvorby obchodní logiky Doporučit vašim klientům používat zastaralé prohlížeče, kde byly modální volání ještě podporovány (Mozilla Firefox verze 37 a nižší, Chrоme nižší než verze 37 atd.). Mimochodem, od vydání 8.3.11 již nejsou podporovány webové prohlížeče Microsoft Internet Explorer verzí 8 a 9. S webovými prohlížeči jsme se v souvislosti s modalitou vyrovali, nyní je na řadě vyjasnit situaci s ostatními klienty. Od verze 8.3.5 se vlastnost „Režim používání modalit“ v tenkém a tlustém klientovi bere v úvahu pouze tehdy, je-li uveden parametr příkazového řádku /EnableCheckModal. Tento parametr se automaticky dosazuje do příkazového řádku pouze při spuštění aplikace z konfiguratoru. Pokud tento parametr není uveden, nedochází k generování výjimek a nezobrazují se příslušná upozornění. Tj. v praxi v případě použití tlustého a tenkého klienta nedochází k žádnému radikálnímu změně v práci při použití režimu modalit – modální volání budou fungovat stejně jako dříve, aniž by vydávala jakákoliv upozornění, jako ve webovém klientovi. Abychom položili tečku za „i“, poznamenejme, že od verze 8.3.9 se v tlustém klientovi ignoruje vlastnost konfigurace „Režim používání synchronních volání rozšíření platformy a externích komponent“, přičemž příslušné synchronní metody fungují bez generování výjimek a zobrazování upozornění. Uvedená ignorovaná vlastnost byla přidána ve verzi 8.3.5 s cílem podpory asynchronní práce s externími komponentami, kryptografií a rozšířeními pro práci se soubory ve webovém prohlížeči Google Chrome. Je zřejmé, že k tlustému klientu to nemá žádný vztah, a proto „tiché“ ignorování této vlastnosti jednoduše vyloučilo zbytečné kontroly používání synchronních metod při použití konfigurace. Mimochodem! Protože platforma důsledně směřuje k webu, od verze 8.3.8 vývojáři zavedli určitá omezení na programový kód, který souvisí s logikou zavírání formuláře nebo aplikace, prováděný v tlustém a tenkém klientovi. Určitě si přečtěte náš článek, který podrobně osvětluje tento nuance. Kromě toho v kurzu „Profesionální vývoj rozhraní a formulářů v 1C:Podnikání 8.3“ je kapitara věnovaná odmítnutí modalit a můžete si z ní vypůjčit spoustu užitečných a aktuálních informací na toto téma. Kolegové, existují dvě věci, které lze číst donekonečna: feed na VKontakte a seznam změn v dalším vydání platformy, takže pojďme shrnout konečné výsledky ;) V průběhu zkoumání příkladů umožňujících přechod od prvků synchronního modelu k asynchronnímu jste si možná všimli, že obecně bylo programového kódu více. Čím více kódu, tím více roste složitost jeho další údržby a ladění. Kromě toho se množství kódu ještě více zvýší, pokud budeme v procesu vývoje používat větší počet dialogů. Proto je třeba v procesu vývoje aplikačních řešení zaměřených na práci ve webovém klientovi pamatovat na paradigmata práce, která se v současné době používají v moderních webových aplikacích. Proto pokud má vaše konfigurace mnoho interaktivních dialogů s uživatelem, zobrazovaných upozornění, má smysl přečíst tuto funkčnost ve prospěch jiných přístupů k organizaci interakce s uživatelem.

Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.

Rubriky: 1C