Asynchrónne volania na rozšírenia a externé komponenty. Prečo sa vyskytuje chyba „Používanie synchrónnych metód na klientovi je zakázané“?

Realizované vo verzii 8.3.5.1383, 8.3.6.1977.

Moderné tendencie

Trendy vývoja prehliadačov vedú k čoraz väčšiemu percentu „asynchrónnosti“ v platforme. Prvý krok bol. Teraz existujú asynchrónne výzvy na prácu s rozšíreniami kryptografie, prácu so súbormi a externými komponentmi.

Dôvodom ďalšieho posunu smerom k asynchrónnosti bolo, že vývojári prehliadača Google Chrome opustili podporu predchádzajúcej technológie NPAPI (Netscape Plugin Application Programming Interface). Táto technológia bola použitá na pripojenie externých modulov - rozšírení - k prehliadaču.

Takéto rozšírenia sú presne to, čo 1C:Enterprise používa na prácu s kryptografiou, na prácu so súbormi a na pripojenie externých komponentov. Toto je dosť dôležitá funkcia. Kryptografia sa využíva pri správe elektronických dokumentov a vďaka externým komponentom dokážu aplikácie spolupracovať so skenermi čiarových kódov a ďalšími zariadeniami maloobchodu.

A teraz, namiesto predchádzajúcej synchrónnej technológie NPAPI, vývojári Google Chrome vytvorili novú technológiu Native Messaging. Zároveň dôrazne odporučili, aby všetci vývojári rozšírení nepoužívali starú technológiu, pretože nebude podporovaná.

Bez zachádzania do detailov je nová technológia lepšia a bezpečnejšia. Toto je dobré. Jedným z jeho významných rozdielov je však to, že poskytuje výlučne asynchrónnu interakciu s rozšíreniami prehliadača. A to si vyžaduje radikálnu zmenu všetkých existujúcich metód práce s rozšíreniami a externými komponentmi v 1C:Enterprise. Pretože všetky sú založené na synchrónnej interakcii.

Asynchrónne metódy

Tento problém sme vyriešili rovnakým spôsobom ako problém modálneho volania. Pre všetky synchrónne metódy využívajúce technológiu NPAPI sme vytvorili ich asynchrónne náprotivky. Líšia sa hlavne prítomnosťou predpony Začať a skutočnosť, že sa im odovzdá prvý parameter PopisUpozornenia, od ktorého bude vykonávanie programového kódu pokračovať po dokončení volanej akcie.

Napríklad namiesto metódy Šifrovať() Teraz odporúčame použiť metódu StartEncrypt():

CryptographyManager.Encrypt(<ИсходныеДанные>, <Получатели>) Cryptography Manager.Start Encryption(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

Namiesto metódy GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Začnite prijímať súbory ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Namiesto SetExternalComponent()- StartInstallingExternalComponents():

SetExternalComponent(<Местоположение>) Spustite inštaláciu externých komponentov (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

V skutočnosti je všetko veľmi podobné tomu, čo sme robili predtým, keď sme sa zbavili modality. Fungovanie nových asynchrónnych metód má však zásadnú vlastnosť, ktorú metódy, ktoré spôsobujú nemodálne dialógy, nemajú.

Pri asynchrónnom volaní nemodálneho dialógu očakávame iba nejakú reakciu používateľa a nič viac. V tom zmysle, že sa nemôže stať nič neočakávané.

A v procese volania asynchrónnych metód práce s rozšíreniami a komponentmi môžu nastať výnimočné situácie. Rozšírenie sa nenainštalovalo, komponent sa nenačítal atď.

Spracovanie takýchto výnimiek zvyčajne poskytujete v kóde aplikácie. Pomocou operátora Skúšam... Výnimka. Teraz je to však nemožné, pretože v čase asynchrónneho volania sa kód aplikácie nevykoná. Operátor teda nefunguje Skúšam... Výnimka.

  • NameProcedureProcessingErrors;
  • ErrorProcessingModule.

Ak sa počas asynchrónneho volania niečo pokazí a dôjde k výnimke, vykoná sa procedúra, na ktorú poukazujú tieto vlastnosti. Tieto dve vlastnosti má zmysel využívať len pri asynchrónnych metódach práce s rozšíreniami. Pri volaní nemodálnych dialógov tieto vlastnosti nepotrebujete.

Vlastnosť konfigurácie

Rovnako ako v prípade odmietnutia modality, celé aplikačné riešenie ako celok musí vedieť, „čo to je“. Buď je modálny alebo nemodálny. Buď je synchrónny alebo asynchrónny.

Predtým sme na vyriešenie problému s modalitou pridali špeciálnu konfiguračnú vlastnosť Spôsob použitia modality. Teraz, aby sme vyriešili problém so synchronicitou, pridali sme vlastnosť, ktorá má podobný význam Režim používania synchrónnych volaní na rozšírenia a externé komponenty.

Podstata jeho použitia je nasledovná:

  • Nepoužívať- toto je nový, asynchrónny režim prevádzky. Pre nové konfigurácie je to štandardný režim. Používanie starých, synchrónnych metód je zakázané. Neprechádzajú syntaktickou kontrolou, nie sú v kontexte stopy. Pokus o vykonanie synchrónnej metódy vyvolá výnimku.
  • Používajte s upozornením- tento režim je určený pre vývojárov. Nebráni sa použitiu starších, synchrónnych metód. Ale zakaždým, keď je na klientovi zavolaná synchrónna metóda, vygeneruje varovnú správu. Tento režim odporúčame používať v „recyklačných“ konfiguráciách. Je vhodný na vizuálne vyhľadávanie synchrónnych hovorov a ich sledovanie počas procesu revízie.
  • Použite- režim, ktorý zabezpečuje kompatibilitu novej verzie platformy so starými konfiguráciami, ktoré využívajú synchrónne metódy na prácu s rozšíreniami a externými komponentmi.

Všetky metódy a vlastnosti, o ktorých sme doteraz hovorili, sú implementované vo verzii 8.3.5.1383 . Môžete ich použiť vo svojich aplikačných riešeniach. A vývojári napríklad prejdú na subsystémy asynchrónnej prevádzky, ktoré využívajú kryptografické nástroje, pracujú so súbormi a externými komponentmi.

Prirodzene, rovnako ako pri modálnych hovoroch, pravdepodobne máte otázku. Musím svoje aplikačné riešenie prerobiť? A vo všeobecnosti, musím použiť tieto asynchrónne metódy v mojom novom aplikačnom riešení?

Kedy je to potrebné?

Odpoveď na túto otázku je v podstate rovnaká, ako sme uviedli predtým. Keď hovorili o opustení modality.

Po prvé, nie každá verzia technologickej platformy podporuje režim asynchrónnych volaní na rozšírenia a externé komponenty. Tento prevádzkový režim existuje od verzie 8.3.5.1383. Ak teda pracujete na nižších verziách platformy, nemusíte sa zatiaľ obávať, že by ste synchrónne metódy opustili.

Po druhé, nie všetky aplikačné riešenia musia nevyhnutne používať tento režim. Kritické aplikácie sú tie, s ktorými sa bude pracovať pomocou webového klienta v prehliadači Google Chrome. Takéto aplikácie sú z veľkej časti aplikácie spustené . Ak sa vaše aplikačné riešenie určite nebude používať v tomto režime, nemôžete zatiaľ opustiť synchrónne metódy.

Napriek prvému a druhému bodu však existujú globálne trendy, ktoré môžu ovplyvniť vaše plány. My, spoločnosť 1C, vyvíjame všetky štandardné riešenia na základe toho, že ich možno použiť akýmkoľvek dostupným spôsobom. Nové aplikačné riešenia, ako aj všetky v nich použité knižnice preto budeme implementovať v režime bez použitia synchrónnych volaní.

To znamená, že je pre vás lepšie začať ovládať tento režim prevádzky hneď. Aj keď ho vaša aplikácia možno ešte nepoužíva, odporúčame začať s prekladom hneď, ak je to možné. Odporúčame vám však pristupovať k tomuto procesu kreatívne. V rovnakom duchu ako pri opustení modality. To znamená, že nie je potrebné mechanicky nahrádzať synchrónne metódy asynchrónnymi. Najprv je užitočné zamyslieť sa nad tým, či je možné zmeniť algoritmus alebo skript tak, aby sme na tomto mieste úplne upustili od používania synchrónnych metód?

Refaktorovanie

Na jednej strane, ak je konfigurácia veľká a je v nej veľa synchrónnych volaní, potom môže byť „ručné“ prepracovanie takejto konfigurácie časovo veľmi náročnou úlohou.

Na druhej strane od verzie 8.3.5.1068 má platforma funkcie, ktoré vám umožňujú konvertovať synchrónne hovory na ich asynchrónne náprotivky.

Preto sme vzali tieto už existujúce nástroje, rozšírili ich a preorientovali ich z „odchodu od modality“ na „prechod na asynchrónnosť“. Vo svojej podstate je prechod na asynchrónne metódy podobný akciám, ktoré sa vykonávajú pri opustení modality. Staré, „nemoderné“, synchrónne (modálne) hovory je potrebné nahradiť novými, „módnymi“, asynchrónnymi hovormi pomocou Spracovanie upozornení.

V tejto aktualizovanej forme sú vám vo verzii k dispozícii nástroje na refaktorovanie 8.3.6.1977 .

Keďže „dôraz“ týchto nástrojov sa posunul smerom k asynchrónnosti, niektoré príkazy sme premenovali. Namiesto výrazu „nemodálny“ sa teraz používa výraz „zastaraný synchrónny“:

Okrem toho sme pridali novú kartu do nastavení konfigurátora Refaktorovanie. V predvolenom nastavení sú obe transformácie povolené. Ale ak to potrebujete, s jeho pomocou môžete vykonať iba jeden z typov transformácií počas automatického refaktorovania.

05.12.2014

Realizované vo verzii 8.3.5.1383, 8.3.6.1977.

Moderné tendencie

Trendy vývoja prehliadačov vedú k čoraz väčšiemu percentu „asynchrónnosti“ v platforme. Prvým krokom bolo opustiť túto modalitu. Teraz existujú asynchrónne výzvy na prácu s rozšíreniami kryptografie, prácu so súbormi a externými komponentmi.

Dôvodom ďalšieho posunu smerom k asynchrónnosti bolo, že vývojári prehliadača Google Chrome opustili podporu predchádzajúcej technológie NPAPI (Netscape Plugin Application Programming Interface). Táto technológia bola použitá na pripojenie externých modulov - rozšírení - k prehliadaču.

Takéto rozšírenia sú presne to, čo 1C:Enterprise používa na prácu s kryptografiou, na prácu so súbormi a na pripojenie externých komponentov. Toto je dosť dôležitá funkcia. Kryptografia sa využíva pri správe elektronických dokumentov a vďaka externým komponentom dokážu aplikácie spolupracovať so skenermi čiarových kódov a ďalšími zariadeniami maloobchodu.

A teraz, namiesto predchádzajúcej synchrónnej technológie NPAPI, vývojári Google Chrome vytvorili novú technológiu Native Messaging. Zároveň dôrazne odporučili, aby všetci vývojári rozšírení nepoužívali starú technológiu, pretože nebude podporovaná.

Bez zachádzania do detailov je nová technológia lepšia a bezpečnejšia. Toto je dobré. Jedným z jeho významných rozdielov je však to, že poskytuje výlučne asynchrónnu interakciu s rozšíreniami prehliadača. A to si vyžaduje radikálnu zmenu všetkých existujúcich metód práce s rozšíreniami a externými komponentmi v 1C:Enterprise. Pretože všetky sú založené na synchrónnej interakcii.

Asynchrónne metódy

Tento problém sme vyriešili rovnakým spôsobom ako problém modálneho volania. Pre všetky synchrónne metódy využívajúce technológiu NPAPI sme vytvorili ich asynchrónne náprotivky. Líšia sa najmä prítomnosťou predpony Štart a tým, že prvým parametrom je Popis výstrahy, od ktorého bude po dokončení volanej akcie pokračovať vykonávanie programového kódu.

Napríklad namiesto metódy Encrypt() teraz odporúčame použiť metódu StartEncrypt():

CryptographyManager.Encrypt(<ИсходныеДанные>, <Получатели>) Cryptography Manager.Start Encryption(<ОписаниеОповещения>, <ИсходныеДанные>, <Получатели>)

Namiesto metódy GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Začnite prijímať súbory ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Namiesto InstallExternalComponent() - StartInstallingExternalComponent():

SetExternalComponent(<Местоположение>) Spustite inštaláciu externých komponentov (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

V skutočnosti je všetko veľmi podobné tomu, čo sme robili predtým, keď sme sa zbavili modality. Fungovanie nových asynchrónnych metód má však zásadnú vlastnosť, ktorú metódy, ktoré spôsobujú nemodálne dialógy, nemajú.

Pri asynchrónnom volaní nemodálneho dialógu očakávame iba nejakú reakciu používateľa a nič viac. V tom zmysle, že sa nemôže stať nič neočakávané.

A v procese volania asynchrónnych metód práce s rozšíreniami a komponentmi môžu nastať výnimočné situácie. Rozšírenie sa nenainštalovalo, komponent sa nenačítal atď.

Spracovanie takýchto výnimiek zvyčajne poskytujete v kóde aplikácie. Použitie operátora Skús... Výnimka. Teraz je to však nemožné, pretože v čase asynchrónneho volania sa kód aplikácie nevykoná. Operátor Pokus... výnimka teda nefunguje.

  • ErrorProcedureName;
  • Modul spracovania chýb.

Ak sa počas asynchrónneho volania niečo pokazí a dôjde k výnimke, vykoná sa procedúra, na ktorú poukazujú tieto vlastnosti. Tieto dve vlastnosti má zmysel využívať len pri asynchrónnych metódach práce s rozšíreniami. Pri volaní nemodálnych dialógov tieto vlastnosti nepotrebujete.

Vlastnosť konfigurácie

Rovnako ako v prípade odmietnutia modality, celé aplikačné riešenie ako celok musí vedieť, „čo to je“. Buď je modálny alebo nemodálny. Buď je synchrónny alebo asynchrónny.

Predtým, aby sme vyriešili problém s modalitou, sme do konfigurácie pridali špeciálnu vlastnosť: Režim používania modality. Teraz, aby sme vyriešili problém so synchronizáciou, pridali sme vlastnosť podobného významu: Režim pre použitie synchrónnych volaní rozšírení a externých komponentov.

Podstata jeho použitia je nasledovná:

  • Nepoužívať je nový asynchrónny režim prevádzky. Pre nové konfigurácie je to štandardný režim. Používanie starých, synchrónnych metód je zakázané. Neprechádzajú syntaktickou kontrolou, nie sú v kontexte stopy. Pokus o vykonanie synchrónnej metódy vyvolá výnimku.
  • Používajte s upozornením – tento režim je určený pre vývojárov. Nebráni sa použitiu starších, synchrónnych metód. Ale zakaždým, keď je na klientovi zavolaná synchrónna metóda, vygeneruje varovnú správu. Tento režim odporúčame používať v „recyklačných“ konfiguráciách. Je vhodný na vizuálne vyhľadávanie synchrónnych hovorov a ich sledovanie počas procesu revízie.
  • Použitie - režim, ktorý zabezpečuje kompatibilitu novej verzie platformy so starými konfiguráciami, ktoré využívajú synchrónne metódy pre prácu s rozšíreniami a externými komponentmi.

Všetky metódy a vlastnosti, o ktorých sme doteraz hovorili, sú implementované vo verzii 8.3.5.1383. Môžete ich použiť vo svojich aplikačných riešeniach. A vývojári BSP napríklad prenesú do asynchrónnej prevádzky podsystémy, ktoré využívajú kryptografické nástroje, pracujú so súbormi a externými komponentmi.

Prirodzene, rovnako ako pri modálnych hovoroch, pravdepodobne máte otázku. Musím svoje aplikačné riešenie prerobiť? A vo všeobecnosti, musím použiť tieto asynchrónne metódy v mojom novom aplikačnom riešení?

Kedy je to potrebné?

Odpoveď na túto otázku je v podstate rovnaká, ako sme uviedli predtým. Keď hovorili o opustení modality.

Po prvé, nie každá verzia technologickej platformy podporuje režim asynchrónnych volaní na rozšírenia a externé komponenty. Tento prevádzkový režim existuje od verzie 8.3.5.1383. Ak teda pracujete na nižších verziách platformy, nemusíte sa zatiaľ obávať, že by ste synchrónne metódy opustili.

Po druhé, nie všetky aplikačné riešenia musia nevyhnutne používať tento režim. Kritické aplikácie sú tie, s ktorými sa bude pracovať pomocou webového klienta v prehliadači Google Chrome. Takéto aplikácie sú z veľkej časti aplikáciami fungujúcimi v modeli služieb. Ak sa vaše aplikačné riešenie určite nebude používať v tomto režime, nemôžete zatiaľ opustiť synchrónne metódy.

Napriek prvému a druhému bodu však existujú globálne trendy, ktoré môžu ovplyvniť vaše plány. My, spoločnosť 1C, vyvíjame všetky štandardné riešenia na základe toho, že ich možno použiť akýmkoľvek dostupným spôsobom. Nové aplikačné riešenia, ako aj všetky v nich použité knižnice preto budeme implementovať v režime bez použitia synchrónnych volaní.

To znamená, že je pre vás lepšie začať ovládať tento režim prevádzky hneď. Aj keď ho vaša aplikácia možno ešte nepoužíva, odporúčame začať s prekladom hneď, ak je to možné. Odporúčame vám však pristupovať k tomuto procesu kreatívne. V rovnakom duchu ako pri opustení modality. To znamená, že nie je potrebné mechanicky nahrádzať synchrónne metódy asynchrónnymi. Najprv je užitočné zamyslieť sa nad tým, či je možné zmeniť algoritmus alebo skript tak, aby sme na tomto mieste úplne upustili od používania synchrónnych metód?

Refaktorovanie

Na jednej strane, ak je konfigurácia veľká a je v nej veľa synchrónnych volaní, potom môže byť „ručné“ prepracovanie takejto konfigurácie časovo veľmi náročnou úlohou.

Na druhej strane od verzie 8.3.5.1068 má platforma nástroje, ktoré vám umožňujú konvertovať synchrónne hovory na ich asynchrónne náprotivky.

Preto sme vzali tieto už existujúce nástroje, rozšírili ich a preorientovali ich z „odchodu od modality“ na „prechod na asynchrónnosť“. Vo svojej podstate je prechod na asynchrónne metódy podobný akciám, ktoré sa vykonávajú pri opustení modality. Staré, „nemoderné“, synchrónne (modálne) hovory je potrebné nahradiť novými, „módnymi“ asynchrónnymi hovormi, ktoré využívajú spracovanie upozornení.

V tejto aktualizovanej podobe vám boli nástroje na refaktorovanie k dispozícii vo verzii 8.3.6.1977.

Keďže „dôraz“ týchto nástrojov sa posunul smerom k asynchrónnosti, niektoré príkazy sme premenovali. Namiesto výrazu „nemodálny“ sa teraz používa výraz „zastaraný synchrónny“:

Okrem toho sme do nastavení konfigurátora pridali novú záložku Refaktoring. V predvolenom nastavení sú obe transformácie povolené. Ale ak to potrebujete, s jeho pomocou môžete vykonať iba jeden z typov transformácií počas automatického refaktorovania:

Článok sa bude zaoberať hlavnými dôvodmi opustenia modality v platforme 1C:Enterprise a hlavnými metódami konverzie sekcií kódu na nový asynchrónny model.

Použiteľnosť

Článok pojednáva o asynchrónnom modeli konštrukcie obchodnej logiky, pridanej platforme „1C:Enterprise“ vydanie 8.3. Uvedené informácie sú relevantné pre aktuálne verzie platforiem.

Odmietnutie používania modálnych okien v platforme 1C:Enterprise 8.3

Pri vývoji konfigurácie na platforme 1C:Enterprise 8 vzniká potreba pravidelne pozastavovať program, kým sa používateľ nerozhodne alebo nevykoná nejakú akciu.

Napríklad pri kliknutí na tlačidlo vyplniť tabuľkovú časť by sa mal používateľ spýtať, či je potrebné vymazať tabuľkovú časť, aby sa nestratili predtým zadané údaje.

Toto správanie je možné dosiahnuť napríklad nasledujúcim kódom:

&OnClient
Postup Vyplňte Produkty(tím)
Odpoveď = Otázka („Časť tabuľky bude vymazaná. Pokračovať?“, Režim dialóguOtázka.ÁnoNie);
Ak odpoveď = Návratový kód dialógu.Áno Potom
//algoritmus plnenia
Koniec Ak ;
EndProcedure

V dôsledku tohto fragmentu kódu sa pozastaví vykonávanie programového kódu, na obrazovke sa zobrazí otázka, rozhranie aplikácie okrem dialógu s otázkou bude nedostupné, systém čaká, kým používateľ vykoná a spúšťanie kódu bude pokračovať až po zodpovedaní otázky.

Otváranie modálnych okien volaním metódy OpenModal() tiež spôsobuje prestávky vo vykonávaní kódu a blokovanie rozhrania.

Pri práci s konfiguráciou v režime webového klienta cez prehliadač sa v tomto prípade otvorí nové okno - vyskakovacie okno, ktoré zablokuje nielen aktuálnu kartu, ale aj celé rozhranie prehliadača vrátane ostatných otvorených okien a kariet.

Vyskakovacie okná na internete sa často používajú na škodlivú distribúciu nechcených reklám, a preto prehliadače obsahujú funkcie blokovania automaticky otváraných okien.

V tomto prípade, aby ste mohli pracovať s konfiguráciami 1C:Enterprise 8 prostredníctvom prehliadača, musíte zakázať blokovanie kontextových okien.

Problémy vznikajú aj pri práci na mobilných zariadeniach. Napríklad na iPade nie sú podporované modálne okná.

Na vyriešenie týchto problémov by ste mali používať blokovacie okná namiesto modálnych. Pre používateľa vyzerá vizuálne všetko rovnako: okno blokuje rozhranie webového klienta.

Blokovacie okno je však „vykreslené“ v hornej časti hlavného okna a blokovaná je iba aktuálna karta prehliadača, na ktorej je otvorená konfigurácia, čo vám umožňuje prepnúť na iné karty, pretože modálne okná prehliadača sa nepoužívajú.

V prehliadači sa teda neotvárajú vyskakovacie okná a je zabezpečená práca cez webového klienta na mobilných zariadeniach.

Koreňový prvok konfigurácie má vlastnosť „Modality mode“, ktorá určuje, či je možné v konfigurácii otvárať modálne okná.

Ak je vybratá možnosť „Použiť“, je možné otvoriť modálne okná. Ak je vybratá možnosť „Nepoužívať“, modálne okná nie sú povolené. Keď sa pokúsite zavolať metódu, ktorá otvorí modálne okno, systém zobrazí chybové hlásenie:

S touto hodnotou vlastnosti „Modality use mode“ sú povolené iba blokovacie okná.

Ak je vybratá možnosť „Použiť s upozorneniami“, pri otvorení modálnych okien sa v okne správy zobrazí nasledujúci text:

Túto pracovnú možnosť možno použiť ako prechodnú pri prepracovaní konfigurácie, aby sa upustilo od používania modálnych okien.

Hlavný rozdiel medzi blokovaním okien a modálnymi oknami je v tom, že otvorením blokovacieho okna sa nepozastaví vykonávanie kódu.

Preto budú musieť vývojári prepísať programový kód, ktorý používa modálne okná, aby zohľadnili túto funkciu.

Kód je potrebné rozdeliť na dve časti:

  • otvorenie blokovacieho okna;
  • spracovanie výberu užívateľa.

Fragment kódu uvedený na začiatku článku je potrebné prepísať takto:

&OnClient
Postup Vyplňte Produkty(tím)
Upozornenie = Nové PopisUpozornenia(, ThisObject );

Režim dialóguOtázka.ÁnoNie);
EndProcedure
&OnClient
Postup (Výsledok, Extra možnosti) Export
Ak Výsledok = Návratový kód dialógu.Áno Potom
//algoritmus plnenia
Koniec Ak ;
EndProcedure

Po vykonaní procedúry ShowQuestion() sa systém nezastaví, čaká na odpoveď užívateľa, vykonávanie kódu pokračuje.

Používateľ si bude môcť vybrať až po dokončení celého postupu. V tomto prípade sa zavolá procedúra exportu FillItemsQuestionComplete(). Jeho názov sme odovzdali konštruktorovi objektu DescriptionAlerts.

Procedúra, ktorá sa zavolá po vykonaní výberu, sa môže nachádzať vo formulárovom module, príkazovom module alebo všeobecnom neglobálnom module.

V uvažovanom príklade sa volaná procedúra nachádza v module riadeného formulára, takže sme odovzdali parameter ThisObject.

Uvažujme o volaní procedúry umiestnenej vo všeobecnom module. Ak to chcete urobiť, pridajte nový spoločný modul Spracovanie upozornení, nastavte mu príznak „Klient (spravovaná aplikácia)“ a nenastavujte príznak „Globálne“. Do tohto modulu umiestnime procedúru Vyplňte otázky o produktoch ().

Potom bude obslužný program príkazu fill vyzerať takto:

&OnClient
Postup Vyplňte Produkty(tím)
Upozornenie = Nové PopisUpozornenia(„Vyplňte dokončenie otázky o produkte“,
ProcessingAlerts);
Text otázky = „Časť tabuľky bude vymazaná. Ďalej?" ;
ShowQuestion (upozornenie , text otázky , Režim dialóguOtázka.ÁnoNie);
EndProcedure

Po zavolaní akejkoľvek metódy, ktorá otvorí blokovacie okno, sa musí procedúra ukončiť a kód, ktorý sa spustí ako ďalší, by sa mal umiestniť do procedúry, ktorá sa zavolá po zatvorení okna.

Na prenos kontextu (pomocné údaje, určité parametre, hodnoty premenných) z procedúry, ktorá otvára modálne okno, do procedúry volanej pri jej zatvorení, je poskytnutý tretí voliteľný parameter konštruktora objektu: DescriptionAlerts – Additional Parameters.

Tento objekt (akéhokoľvek typu) bude odovzdaný do procedúry opísanej v popise výstrahy ako posledný parameter.

Pomocou príkladu časti kódu diskutovanej vyššie to možno urobiť takto:

&OnClient
Postup Vyplňte Produkty(tím)
Parameter1 = 0 ;
Parameter2 = 0 ;
Zoznam parametrov= Nová štruktúra („Parameter1, Parameter2″, Parameter1, Parameter2);
Upozornenie = Nové PopisUpozornenia(„Vyplňte dokončenie otázky o produkte“, TentoObjekt ,
Zoznam parametrov);
ShowQuestion (Upozornenie: „Časť stola bude vymazaná. Pokračovať?“,
Režim dialóguOtázka.ÁnoNie);
EndProcedure
&OnClient
Postup Vyplňte dokončenie otázky o produktoch(Výsledok, Extra možnosti) Export
Ak Výsledok = Návratový kód dialógu.Áno Potom
//analyzovať ďalšie parametre.Parameter1
//analyzovať ďalšie parametre.Parameter2
Koniec Ak ;
EndProcedure

Ak potrebujete odovzdať iba jednu hodnotu, nemôžete použiť štruktúru, ale priradiť túto hodnotu parametru Additional Parameters konštruktora objektu DescriptionAlerts.

Pozrime sa na niekoľko príkladov práce s blokovaním okien.

Úloha 1: Otvorte ďalší formulár

Z formulára dokumentu kliknutím na tlačidlo „Otvoriť parametre“ musíte otvoriť formulár, v ktorom sú dve začiarkavacie políčka Parameter1 a Parameter2, ktoré musí používateľ nastaviť. Po zatvorení formulára zobrazte hodnoty parametrov v riadku správy.

Vytvoríme všeobecný formulár „ParametersForm“, na ktorý umiestnime podrobnosti Parameter1 a Parameter2, ako aj príkaz CloseForm:

Obsluha príkazov vyzerá takto:

Obslužný program príkazu vyzerá takto: &OnClient
Postup CloseForm (príkaz)
Zoznam parametrov= Nová štruktúra ( "Parameter1, Parameter2", Parameter1, Parameter2);
Zavrieť ( Zoznam parametrov); EndProcedure

Pre formulár nastavte vlastnosť WindowOpenMode na „Blokovať celé rozhranie“:

Na formulár dokumentu umiestnime príkaz OpenParameters, ktorého obsluha je opísaná takto:

&OnClient
Postup OpenOptions(tím)
Upozornenie = Nové PopisUpozornenia("Otvoriť možnosti Dokončiť", TentoObjekt);
OpenForm ( "GeneralForm.FormParameters", , , , , , Oznámenie);
EndProcedure
&OnClient
Postup OpenOptionsComplete(Výsledok, Extra možnosti) Export
Ak TypeValue (Výsledok) = Typ (“Štruktúra”) Potom
Pre každú kľúčovú hodnotu zo slučky výsledkov
Správa = Nové Správa používateľovi;
Message.Text = “Kľúč: “” ” + KeyValue.Key + “””, hodnota = “
+ KeyValue.Value;
Správa.Správa();
EndCycle ;
Koniec Ak ;
EndProcedure

V užívateľskom režime, spustením konfigurácie pod webovým klientom, dostaneme nasledujúce výsledky:

Pre zväčšenie kliknite na obrázok.

Režim otvárania okna je možné určiť aj v poslednom parametri procedúry OpenForm.

&OnClient
Postup OpenOptions(tím)
Upozornenie = Nové PopisUpozornenia("Otvoriť možnosti Dokončiť", TentoObjekt);
OpenForm ( "GeneralForm.FormParameters", , , , , , Upozornenie
FormWindowOpenMode.LockEntireInterface
);
EndProcedure

Úloha 2. Otázka pri zatváraní formulára

Pri zatváraní okna spracovania sa opýtajte používateľa, či naozaj chce okno zatvoriť.

Tento problém je možné vyriešiť pomocou nasledujúceho kódu umiestneného v module formulára spracovania:

&OnClient
Perem Je potrebné zatvoriť formulár;
&OnClient
Postup pred zatvorením (porucha, Štandardné spracovanie)
Ak nie Je potrebné zatvoriť formulár= Pravda vtedy
Odmietnuť = Pravda ;
Upozornenie = Nové PopisUpozornenia(„Pred uzavretímDokončením“, TentoObjekt);
ShowQuestion (Upozornenie: „Naozaj chcete zavrieť okno?“,
Režim dialóguOtázka.ÁnoNie
);
Koniec Ak ;
EndProcedure
&OnClient
Postup Pred dokončením uzávierky(Výsledok, Extra možnosti) Export
Ak Výsledok = Návratový kód dialógu.Áno Potom
Je potrebné zatvoriť formulár= Pravda ;
Zavrieť();
Inak
Je potrebné zatvoriť formulár= Nedefinované ;
Koniec Ak ;
EndProcedure

V procedúre formulára BeforeClosing sa používateľovi položí otázka, príznak odmietnutia sa nastaví na hodnotu True a zatvorenie formulára sa zruší.

Po kladnej odpovedi na otázku sa premenná Need toCloseForm nastaví na hodnotu True a formulár sa opäť zatvorí.

Úloha 3: Zadanie číselnej hodnoty

Keď kliknete na tlačidlo vo formulári spracovania, otvorí sa štandardné dialógové okno na zadanie čísla.

Ak to chcete urobiť, musíte namiesto metódy EnterNumber() použiť metódu ShowNumberInput(), ktorá otvorí blokovacie okno namiesto modálneho.

&OnClient
Postup zadávania čísel (príkaz)
Upozornenie = Nové PopisUpozornenia("EnterNumberComplete", TentoObjekt);
ShowEnterNumbers(Výstraha, 0, „Zadajte množstvo“, 15, 3);
EndProcedure
&OnClient
Postup Zadávanie číselDokončujem(Výsledok, Extra možnosti) Export

Správa = Nové Správa používateľovi;
Message.Text = „Zadali ste množstvo“ + Výsledok;
Správa.Správa();
Koniec Ak ;
EndProcedure

Po zatvorení okna na zadanie čísla sa vyvolá procedúra, ktorej prvým parametrom bude zadané číslo alebo Nedefinovaná hodnota, ak používateľ odmietol zadať.

Úloha 4. Výber farby

Po kliknutí na tlačidlo vo formulári spracovania pomocou štandardného dialógového okna výberu farby užívateľ zadá požadovanú farbu. Túto farbu nastavte pre pozadie kliknutého tlačidla.

Pridajte príkaz SelectColor do formulára s nasledujúcim obslužným programom:

&OnClient
Výber farby procedúry (príkaz)
Dialógové okno výberu farby= Nové Dialógové okno výberu farby;
Upozornenie = Nové PopisUpozornenia("Výber farieb je dokončený", TentoObjekt);
Dialógové okno výberu farby. Zobraziť(Upozornenie);
EndProcedure
&OnClient
Postup ChoiceColorsCompletion(Výsledok, Extra možnosti) Export
Ak NIE, Výsledok = Nedefinované, Potom
Elements.Color Selection.Background Color= výsledok;
Koniec Ak ;
EndProcedure

Pre objekty dialógového okna výberu farby (ako aj dialógové okno na úpravu štandardného obdobia, konštruktor formátovacej čiary, dialógové okno plánu pravidelných úloh, dialógové okno výberu písma) metóda Show() otvorí blokovacie okno.

Po zatvorení okna sa vyvolá procedúra, ktorej prvým parametrom bude odovzdaná zvolená hodnota (farba, písmo a pod.) alebo hodnota Nedefinovaná, ak používateľ voľbu odmietol.

Je potrebné poznamenať, že objekt FileSelectionDialog nemá metódu Show() na rozdiel od dialógov na výber farby alebo písma, pretože implementácia týchto dialógov je výrazne odlišná.

Ak chcete použiť dialógové okno výberu súboru vo webovom klientovi, musíte najskôr povoliť príponu súboru.

Dialógové okná implementované cez príponu súboru nevytvárajú rovnaké prevádzkové problémy ako okná modálneho prehliadača, takže otváranie blokujúcich okien pre objekt FileSelectionDialog nebolo implementované.

Na záver poznamenávame, že počnúc vydaním 8.3.10 bola podpora pre modálne okná vo webovom klientovi ukončená. V tomto prípade, ak sa v konfigurácii zavolá modálna metóda, vygeneruje sa výnimka. Vo webovom klientovi bola tiež ukončená podpora režimu rozhrania V samostatných oknách. Navyše v tenkých aj webových klientoch už nie je možné otvárať formulár v samostatnom okne (pri práci v režime rozhrania Záložky). Takéto drastické kroky umožnili opustiť režim rozhrania, ktorý už nepodporujú všetky moderné prehliadače.

Aký praktický záver možno vyvodiť z týchto informácií? A záver je celkom jednoduchý - ak sú z nejakého dôvodu vo vašej konfigurácii stále modálne volania, potom sa na týchto miestach vo webovom klientovi zobrazí okno s chybovým hlásením. Chcel by som varovať pred pokusmi „vygoogliť“ nejaké rýchle riešenie tohto problému, pretože... Väčšina rád sa týka tohto receptu: v konfigurátore na úrovni konfigurácie nastavte vlastnosť „Modality use mode“ na „Use“. Prirodzene, v súčasnosti to nebude fungovať len preto, že samotné moderné prehliadače už nepodporujú modálne volania.

A máte len dva spôsoby, ako vyriešiť problém popísaný vyššie:

  1. Aktualizujte platformu na vydanie 8.3.10+ (8.3.11), nastavte konfiguračnú vlastnosť „Režim kompatibility“ na „Nepoužívať“ a prepíšte fragmenty kódu, ktoré používajú modálne metódy, na asynchrónny model obchodnej logiky
  2. Odporučte svojim klientom, aby používali staršie prehliadače, ktoré stále podporovali modálne volania (Mozilla Firefox verzie 37 a nižšie, Chrome verzie nižšie než 37 atď.).

Mimochodom, počnúc vydaním 8.3.11 už nie sú podporované webové prehliadače Microsoft Internet Explorer verzie 8 a 9.

Webovým prehliadačom sme sa venovali vo svetle modality, teraz je čas objasniť situáciu s ostatnými klientmi.

Počnúc verziou 8.3.5 sa vlastnosť Modality Usage Mode v tenkých a hrubých klientoch rešpektuje iba vtedy, ak je zadaná možnosť príkazového riadka /EnableCheckModal. Tento parameter sa automaticky vloží do príkazového riadku až pri spustení aplikácie z konfigurátora. Ak tento parameter nie je zadaný, negenerujú sa žiadne výnimky a príslušné upozornenia sa nezobrazujú. Tie. v praxi pri použití hrubého a tenkého klienta nie je pozorovaná zásadná zmena v prevádzke pri použití modálneho režimu - modálne volania budú fungovať rovnako ako predtým, bez vytvárania akýchkoľvek upozornení, ako vo webovom klientovi.

Na doplnenie písmen i si všimnite, že počnúc verziou 8.3.9 hrubý klient ignoruje konfiguračnú vlastnosť „Režim používania synchrónnych volaní na rozšírenia platformy a externé komponenty“, zatiaľ čo zodpovedajúce synchrónne metódy fungujú bez generovania výnimiek a zobrazovania upozornení. Uvedená ignorovaná vlastnosť bola pridaná vo verzii 8.3.5 na podporu asynchrónnej práce s externými komponentmi, kryptografie a rozšírení pre prácu so súbormi vo webovom prehliadači Google Chrome. Je jasné, že to nemá nič spoločné s hrubým klientom, a preto „tiché“ ignorovanie tejto vlastnosti jednoducho odstránilo zbytočné kontroly používania synchrónnych metód pri použití konfigurácie.

Mimochodom! Vzhľadom na to, že platforma s istotou smeruje k webu, s verziou 8.3.8 vývojári zaviedli určité obmedzenia na programový kód, ktorý súvisí s logikou zatvárania formulára alebo aplikácie, vykonávanej v hrubých a tenkých klientoch. Nezabudnite si prečítať náš článok podrobne pokrývajúci túto nuanciu. Okrem toho je v kurze „Profesionálny vývoj rozhraní a formulárov v 1C: Enterprise 8.3“ kapitola venovaná opusteniu modality a na túto tému môžete získať veľa užitočných a relevantných informácií.

Kolegovia, existujú dve veci, ktoré môžete čítať donekonečna: informačný kanál VKontakte a zoznam zmien v ďalšom vydaní platformy, takže zhrňme konečné výsledky;)

V procese zvažovania príkladov, ktoré vám umožňujú prejsť z prvkov synchrónneho modelu na asynchrónny, ste si už pravdepodobne všimli, že vo všeobecnom prípade existuje viac programového kódu. Čím viac kódu je, tým viac narastá náročnosť jeho ďalšej údržby a ladenia.

Množstvo kódu sa navyše ešte zvýši, ak počas vývojového procesu použijeme viac dialógov. Preto si v procese vývoja aplikačných riešení zameraných na prácu vo webovom klientovi treba pamätať na pracovnú paradigmu, ktorá sa v súčasnosti používa v moderných webových aplikáciách. Preto, ak vaša konfigurácia obsahuje veľa interaktívnych dialógov s používateľom a varovaní, potom má zmysel prehodnotiť túto funkciu v prospech niektorých iných prístupov k organizácii interakcie používateľa.

Namiesto záveru

Náš cyklus „Prvé kroky vo vývoji 1C“ sa skončil. Ak ste si ju prečítali celú, tak s najväčšou pravdepodobnosťou ste si už všimli, ako sa platforma v poslednej dobe vyvíja míľovými krokmi. Materiál v tejto sérii bol napísaný relatívne nedávno, ale boli sme nútení ho vážne aktualizovať, pretože... Aj za tak krátky čas sa objavilo množstvo nových dôležitých funkcionalít a zmien. Takéto veľké zmeny môžu byť pre programátora 1C trochu mätúce, ak celý ten čas nevyrástol a nevyvíjal sa profesionálne s platformou.

Na špecializovaných internetových zdrojoch si často môžete prečítať požiadavky začínajúcich programátorov a ich zrelších kolegov o odporúčanie materiálov, ktoré by im pomohli pochopiť rozsiahle a niekedy zdanlivo nekonečné možnosti platformy 1C. Už tradične vám odporúčame venovať pozornosť našim kurzom programovania

Prečo sa vyskytuje chyba „Používanie synchrónnych metód na klientovi je zakázané“?

Ak sa pri dokončovaní lekcií stretnete s takouto chybou, je veľmi jednoduché ju opraviť.

Vráťte sa do konfigurátora a vyberte položku ponuky „Konfigurácia“ -> „Otvoriť konfiguráciu“:

V okne, ktoré sa otvorí, kliknite pravým tlačidlom myši na položku „Konfigurácia“ a z ponuky, ktorá sa otvorí, vyberte položku „Vlastnosti“:

Otvorí sa okno s konfiguračnými vlastnosťami (vpravo):

Prejdite úplne dole a nájdite tam položku „Režim modality“:

Nastavte jeho hodnotu na "použiť":

Pozor! Upozorňujeme, že ak používate platformu 1C odlišnú od tej, ktorú sme si stiahli v prvej lekcii (neskoršia verzia), budete mať k dispozícii aj pole „Režim používania synchrónnych hovorov...“. Tiež je potrebné nastaviť na "Použiť".

Nakoniec vyberte položku ponuky „Konfigurácia“ -> „Uložiť konfiguráciu“:

Pripravený! Teraz sa chyba už nebude vyskytovať.

Vysvetlivky nižšie - pre tých, ktorých zaujíma, čo sme urobili.

V našej konfigurácii sme povolili režim modality. V predvolenom nastavení je tento režim zakázaný a to nám neumožňuje používať príkazy ako EnterNumber, EnterString, EnterDate, OpenValue.

Faktom je, že tieto príkazy sú modálne. Ich vyvolaním sa pred používateľom objaví okno (napríklad na zadávanie informácií), ktoré blokuje možnosť práce s programom až do zatvorenia okna.

A keďže prítomnosť takýchto okien je pri práci s 1C prostredníctvom webového prehliadača mimoriadne nežiaduca, pri vývoji nových konfigurácií je režim modality štandardne vypnutý.