Asinkroni pozivi proširenjima i vanjskim komponentama. Zašto se pojavljuje pogreška "Korištenje sinkronih metoda na klijentu je zabranjeno"?

Implementirano u verziji 8.3.5.1383, 8.3.6.1977.

Moderne tendencije

Trendovi razvoja preglednika dovode do sve većeg postotka "asinkronije" u platformi. Prvi korak bio je. Sada postoje asinkroni pozivi za rad s ekstenzijama kriptografije, rad s datotekama i vanjskim komponentama.

Razlog sljedećeg pomaka prema asinkroniji bio je taj što su programeri preglednika Google Chrome napustili podršku za prethodnu NPAPI (Netscape Plugin Application Programming Interface) tehnologiju. Ova tehnologija korištena je za povezivanje vanjskih modula - proširenja - s preglednikom.

1C:Enterprise koristi takva proširenja za rad s kriptografijom, za rad s datotekama i za povezivanje vanjskih komponenti. Ovo je vrlo važna funkcija. Kriptografija se koristi u elektroničkom upravljanju dokumentima, a zahvaljujući vanjskim komponentama aplikacije mogu raditi sa skenerima barkodova i ostalom maloprodajnom opremom.

A sada, umjesto prethodne sinkrone NPAPI tehnologije, programeri Google Chromea stvorili su novu tehnologiju Native Messaging. Istodobno, snažno su preporučili svim razvijačima proširenja da ne koriste staru tehnologiju jer neće biti podržana.

Ne ulazeći u detalje, nova tehnologija je bolja i sigurnija. Ovo je dobro. Ali jedna od njegovih značajnih razlika je ta što pruža isključivo asinkronu interakciju s ekstenzijama preglednika. A to zahtijeva radikalnu promjenu svih postojećih metoda rada s proširenjima i vanjskim komponentama u 1C:Enterprise. Budući da se svi temelje na sinkronoj interakciji.

Asinkrone metode

Riješili smo ovaj problem na isti način na koji smo riješili problem modalnog poziva. Za sve sinkrone metode koje koriste NPAPI tehnologiju, stvorili smo njihove asinkrone parnjake. Uglavnom se razlikuju po prisutnosti prefiksa Početi i činjenica da im se prosljeđuje prvi parametar Opis upozorenja, iz kojeg će se nastaviti izvršavanje programskog koda nakon završetka pozvane akcije.

Na primjer, umjesto metode Šifriraj() Sada preporučujemo korištenje metode StartEncrypt():

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

Umjesto metode GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Počnite primati datoteke ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Umjesto Postavi vanjsku komponentu()- Započni instaliranje vanjskih komponenti():

Postavi vanjsku komponentu (<Местоположение>) Počnite instalirati vanjske komponente (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Zapravo, sve je vrlo slično onome što smo radili prije kada smo se riješili modaliteta. Ali funkcioniranje novih asinkronih metoda ima bitnu značajku koju metode koje uzrokuju nemodalne dijaloge nemaju.

Kada asinkrono pozivamo nemodalni dijalog, očekujemo samo neku reakciju korisnika i ništa više. U smislu da se ne može dogoditi ništa neočekivano.

A u procesu pozivanja asinkronih metoda rada s proširenjima i komponentama mogu se pojaviti iznimne situacije. Ekstenzija se nije instalirala, komponenta se nije učitala itd.

U svom aplikacijskom kodu obično osiguravate rukovanje takvim iznimkama. Korištenje operatora Pokušavam... Iznimka. Ali sada to postaje nemoguće, jer se u trenutku asinkronog poziva aplikacijski kod ne izvršava. Sukladno tome, operater ne radi Pokušavam... Iznimka.

  • NameProcedureProcessingErrors;
  • ErrorProcessingModule.

Ako nešto pođe po zlu tijekom asinkronog poziva i dogodi se iznimka, izvršit će se procedura na koju ukazuju ova svojstva. Ova dva svojstva ima smisla koristiti samo u asinkronim metodama rada s ekstenzijama. Pri pozivanju nemodalnih dijaloga ne trebaju vam ova svojstva.

Svojstvo konfiguracije

Kao i u slučaju odbijanja modaliteta, cijelo aplikacijsko rješenje u cjelini mora znati "što je." Ili je modalan ili nemodalan. Ili je sinkroni ili asinkroni.

Prethodno smo dodali posebno svojstvo konfiguracije da bismo riješili problem s modalnošću Način korištenja modaliteta. Sada, kako bismo riješili problem sa sinkronicitetom, dodali smo svojstvo slično po značenju Način korištenja sinkronih poziva prema ekstenzijama i vanjskim komponentama.

Suština njegove upotrebe je sljedeća:

  • Nemojte koristiti- ovo je novi, asinkroni način rada. Za nove konfiguracije ovo je standardni način rada. Korištenje starih, sinkronih metoda je zabranjeno. Ne prolaze sintaktičku kontrolu, nisu u ključu konteksta. Pokušaj izvršenja sinkrone metode izbacuje iznimku.
  • Koristite uz upozorenje- ovaj način rada namijenjen je programeru. To ne sprječava korištenje starijih, sinkronih metoda. Ali svaki put kada se na klijentu pozove sinkrona metoda, ona proizvodi poruku upozorenja. Preporučujemo korištenje ovog načina rada u konfiguracijama "recikliranja". Pogodan je za vizualno traženje sinkronih poziva i njihovo praćenje tijekom procesa revizije.
  • Koristiti- način rada koji osigurava kompatibilnost nove verzije platforme sa starim konfiguracijama koje koriste sinkrone metode za rad s ekstenzijama i vanjskim komponentama.

Sve metode i svojstva o kojima smo do sada govorili implementirani su u verziju 8.3.5.1383 . Možete ih koristiti u svojim aplikacijskim rješenjima. A programeri će se, primjerice, prebaciti na podsustave asinkronog rada koji koriste alate za kriptografiju, rade s datotekama i vanjskim komponentama.

Naravno, kao i kod modalnih poziva, vjerojatno imate pitanje. Trebam li ponovno izraditi svoje aplikacijsko rješenje? I općenito, trebam li koristiti ove asinkrone metode u svom novom aplikacijskom rješenju?

Kada je to potrebno?

Odgovor na ovo pitanje je u biti isti kao što smo dali prije. Kad su govorili o napuštanju modaliteta.

Prvo, ne podržava svaka verzija tehnološke platforme način asinkronih poziva ekstenzijama i vanjskim komponentama. Ovaj način rada postoji počevši od verzije 8.3.5.1383. Stoga, ako radite na nižim verzijama platforme, za sada ne morate brinuti o napuštanju sinkronih metoda.

Drugo, ne moraju sva aplikacijska rješenja nužno koristiti ovaj način rada. Kritične aplikacije su one s kojima će se raditi pomoću web klijenta u pregledniku Google Chrome. Takve su aplikacije velikim dijelom aplikacije koje se izvode. Ako se vaše aplikacijsko rješenje definitivno neće koristiti u ovom načinu rada, za sada ne možete napustiti sinkrone metode.

Međutim, unatoč prvoj i drugoj točki, postoje globalni trendovi koji mogu utjecati na vaše planove. Mi, tvrtka 1C, razvijamo sva standardna rješenja na temelju činjenice da se mogu koristiti na bilo koji od dostupnih načina. Stoga ćemo nova aplikativna rješenja, kao i sve biblioteke koje se u njima koriste, implementirati u načinu rada bez korištenja sinkronih poziva.

To znači da je bolje da sada počnete svladavati ovaj način rada. Iako ga vaša aplikacija možda još ne koristi, preporučujemo da odmah započnete prijevod ako je moguće. Međutim, potičemo vas da ovom procesu pristupite kreativno. Na isti način kao i kod napuštanja modaliteta. Odnosno, nema potrebe za mehaničkom zamjenom sinkronih metoda s asinkronim. Prvo, korisno je razmisliti je li moguće promijeniti algoritam ili skriptu tako da u ovom trenutku potpuno napustimo korištenje sinkronih metoda?

Refactoring

S jedne strane, ako je konfiguracija velika i ima puno sinkronih poziva, tada "ručna" prerada takve konfiguracije može biti dugotrajan zadatak.

S druge strane, počevši od verzije 8.3.5.1068, platforma ima značajke koje vam omogućuju pretvaranje sinkronih poziva u njihove asinkrone analoge.

Stoga smo uzeli ove već postojeće alate, proširili ih i preusmjerili s "odmicanja od modalnosti" na "prijelaz na asinkroniju". U svojoj srži, prijelaz na asinkrone metode sličan je radnjama koje se izvode pri napuštanju modaliteta. Stare, "nemoderne", sinkrone (modalne) pozive potrebno je zamijeniti novim, "modernim", asinkronim pozivima koji koriste Obrada upozorenja.

U ovom ažuriranom obliku alati za refaktoriranje postali su vam dostupni u verziji 8.3.6.1977 .

Budući da se "naglasak" ovih alata pomaknuo prema asinkroniji, preimenovali smo neke naredbe. Umjesto "nemodalnog", sada se koristi izraz "zastarjelo sinkrono":

Osim toga, dodali smo novu karticu u postavke konfiguratora Refactoring. Prema zadanim postavkama obje su transformacije omogućene. Ali, ako vam zatreba, uz njegovu pomoć možete izvesti samo jednu od vrsta transformacija tijekom automatskog refaktoriranja.

05.12.2014

Implementirano u verziji 8.3.5.1383, 8.3.6.1977.

Moderne tendencije

Trendovi razvoja preglednika dovode do sve većeg postotka "asinkronije" u platformi. Prvi korak je bio napuštanje modaliteta. Sada postoje asinkroni pozivi za rad s ekstenzijama kriptografije, rad s datotekama i vanjskim komponentama.

Razlog sljedećeg pomaka prema asinkroniji bio je taj što su programeri preglednika Google Chrome napustili podršku za prethodnu NPAPI (Netscape Plugin Application Programming Interface) tehnologiju. Ova tehnologija korištena je za povezivanje vanjskih modula - proširenja - s preglednikom.

1C:Enterprise koristi takva proširenja za rad s kriptografijom, za rad s datotekama i za povezivanje vanjskih komponenti. Ovo je vrlo važna funkcija. Kriptografija se koristi u elektroničkom upravljanju dokumentima, a zahvaljujući vanjskim komponentama aplikacije mogu raditi sa skenerima barkodova i ostalom maloprodajnom opremom.

A sada, umjesto prethodne sinkrone NPAPI tehnologije, programeri Google Chromea stvorili su novu tehnologiju Native Messaging. Istodobno, snažno su preporučili svim razvijačima proširenja da ne koriste staru tehnologiju jer neće biti podržana.

Ne ulazeći u detalje, nova tehnologija je bolja i sigurnija. Ovo je dobro. Ali jedna od njegovih značajnih razlika je ta što pruža isključivo asinkronu interakciju s ekstenzijama preglednika. A to zahtijeva radikalnu promjenu svih postojećih metoda rada s proširenjima i vanjskim komponentama u 1C:Enterprise. Budući da se svi temelje na sinkronoj interakciji.

Asinkrone metode

Ovaj smo problem riješili na isti način kao i problem modalnog poziva. Za sve sinkrone metode koje koriste NPAPI tehnologiju, stvorili smo njihove asinkrone parnjake. Uglavnom se razlikuju po prisutnosti prefiksa Start i po tome što je prvi parametar opis upozorenja, iz kojeg će se nastaviti izvršavanje programskog koda nakon završetka pozvane radnje.

Na primjer, umjesto metode Encrypt(), sada preporučujemo korištenje metode StartEncrypt():

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

Umjesto metode GetFiles() - StartGettingFiles():

GetFiles(<ПолучаемыеФайлы>, <ПолученныеФайлы>, <РасположениеФайлов>, <Интерактивно>) Počnite primati datoteke ((<ОписаниеОповещения>, <ПолучаемыеФайлы>, <РасположениеФайлов>, <Интерактивно>)

Umjesto InstallExternalComponent() - StartInstallingExternalComponent():

Postavi vanjsku komponentu (<Местоположение>) Počnite instalirati vanjske komponente (<ОписаниеОповещенияОЗавершении>, <Местоположение>)

Zapravo, sve je vrlo slično onome što smo radili prije kada smo se riješili modaliteta. Ali funkcioniranje novih asinkronih metoda ima bitnu značajku koju metode koje uzrokuju nemodalne dijaloge nemaju.

Kada asinkrono pozivamo nemodalni dijalog, očekujemo samo neku reakciju korisnika i ništa više. U smislu da se ne može dogoditi ništa neočekivano.

A u procesu pozivanja asinkronih metoda rada s proširenjima i komponentama mogu se pojaviti iznimne situacije. Ekstenzija se nije instalirala, komponenta se nije učitala itd.

U svom aplikacijskom kodu obično pružate rukovanje takvim iznimkama. Korištenje operatora Try... Exception. Ali sada to postaje nemoguće, jer se u trenutku asinkronog poziva aplikacijski kod ne izvršava. Sukladno tome, operator Attempt... Exception ne radi.

  • ErrorProcedureName;
  • Modul za rukovanje pogreškama.

Ako nešto pođe po zlu tijekom asinkronog poziva i dogodi se iznimka, izvršit će se procedura na koju ukazuju ova svojstva. Ova dva svojstva ima smisla koristiti samo u asinkronim metodama rada s ekstenzijama. Pri pozivanju nemodalnih dijaloga ne trebaju vam ova svojstva.

Svojstvo konfiguracije

Kao i u slučaju odbijanja modaliteta, cijelo aplikacijsko rješenje u cjelini mora znati "što je." Ili je modalan ili nemodalan. Ili je sinkroni ili asinkroni.

Prethodno smo, kako bismo riješili problem s modalitetom, konfiguraciji dodali posebno svojstvo: Način korištenja modaliteta. Sada, kako bismo riješili problem sa sinkronijom, dodali smo svojstvo slično po značenju: Način za korištenje sinkronih poziva ekstenzija i vanjskih komponenti.

Suština njegove upotrebe je sljedeća:

  • Ne koristi novi je, asinkroni način rada. Za nove konfiguracije ovo je standardni način rada. Korištenje starih, sinkronih metoda je zabranjeno. Ne prolaze sintaktičku kontrolu, nisu u ključu konteksta. Pokušaj izvršavanja sinkrone metode izbacuje iznimku.
  • Koristite uz upozorenje - ovaj je način rada namijenjen razvojnom programeru. To ne sprječava korištenje starijih, sinkronih metoda. Ali svaki put kada se na klijentu pozove sinkrona metoda, ona proizvodi poruku upozorenja. Preporučujemo korištenje ovog načina rada u konfiguracijama "recikliranja". Pogodan je za vizualno traženje sinkronih poziva i njihovo praćenje tijekom procesa revizije.
  • Upotreba - način rada koji osigurava kompatibilnost nove verzije platforme sa starim konfiguracijama koje koriste sinkrone metode za rad s ekstenzijama i vanjskim komponentama.

Sve metode i svojstva o kojima smo do sada govorili implementirani su u verziji 8.3.5.1383. Možete ih koristiti u svojim aplikacijskim rješenjima. A BSP programeri će, na primjer, prebaciti podsustave koji koriste kriptografske alate, rade s datotekama i vanjskim komponentama na asinkroni rad.

Naravno, kao i kod modalnih poziva, vjerojatno imate pitanje. Trebam li ponovno izraditi svoje aplikacijsko rješenje? I općenito, trebam li koristiti ove asinkrone metode u svom novom aplikacijskom rješenju?

Kada je to potrebno?

Odgovor na ovo pitanje je u biti isti kao što smo dali prije. Kad su govorili o napuštanju modaliteta.

Prvo, ne podržava svaka verzija tehnološke platforme način asinkronih poziva ekstenzijama i vanjskim komponentama. Ovaj način rada postoji počevši od verzije 8.3.5.1383. Stoga, ako radite na nižim verzijama platforme, za sada ne morate brinuti o napuštanju sinkronih metoda.

Drugo, ne moraju sva aplikacijska rješenja nužno koristiti ovaj način rada. Kritične aplikacije su one s kojima će se raditi pomoću web klijenta u pregledniku Google Chrome. Takve su aplikacije velikim dijelom aplikacije koje rade u uslužnom modelu. Ako se vaše aplikacijsko rješenje definitivno neće koristiti u ovom načinu rada, za sada ne možete napustiti sinkrone metode.

Međutim, unatoč prvoj i drugoj točki, postoje globalni trendovi koji mogu utjecati na vaše planove. Mi, tvrtka 1C, razvijamo sva standardna rješenja na temelju činjenice da se mogu koristiti na bilo koji od dostupnih načina. Stoga ćemo nova aplikativna rješenja, kao i sve biblioteke koje se u njima koriste, implementirati u načinu rada bez korištenja sinkronih poziva.

To znači da je bolje da sada počnete svladavati ovaj način rada. Iako ga vaša aplikacija možda još ne koristi, preporučujemo da odmah započnete prijevod ako je moguće. Međutim, potičemo vas da ovom procesu pristupite kreativno. Na isti način kao i kod napuštanja modaliteta. Odnosno, nema potrebe za mehaničkom zamjenom sinkronih metoda s asinkronim. Prvo, korisno je razmisliti je li moguće promijeniti algoritam ili skriptu tako da u ovom trenutku potpuno napustimo korištenje sinkronih metoda?

Refactoring

S jedne strane, ako je konfiguracija velika i ima puno sinkronih poziva, tada "ručna" prerada takve konfiguracije može biti dugotrajan zadatak.

S druge strane, počevši od verzije 8.3.5.1068, platforma ima alate koji vam omogućuju pretvaranje sinkronih poziva u njihove asinkrone analoge.

Stoga smo uzeli ove već postojeće alate, proširili ih i preusmjerili s "odmicanja od modalnosti" na "prijelaz na asinkroniju". U svojoj srži, prijelaz na asinkrone metode sličan je radnjama koje se izvode pri napuštanju modaliteta. Stare, "nemoderne", sinkrone (modalne) pozive potrebno je zamijeniti novim, "modernim", asinkronim pozivima koji koriste obradu obavijesti.

U ovom ažuriranom obliku, alati za refaktoriranje postali su vam dostupni u verziji 8.3.6.1977.

Budući da se "naglasak" ovih alata pomaknuo prema asinkroniji, preimenovali smo neke naredbe. Umjesto "nemodalnog", sada se koristi izraz "zastarjelo sinkrono":

Osim toga, dodali smo novu karticu Refactoring postavkama konfiguratora. Prema zadanim postavkama obje su transformacije omogućene. Ali, ako vam zatreba, uz njegovu pomoć možete izvršiti samo jednu od vrsta transformacija tijekom automatskog refaktoriranja:

U članku će se raspravljati o glavnim razlozima napuštanja modaliteta u platformi 1C:Enterprise i glavnim metodama za pretvaranje dijelova koda u novi asinkroni model.

Primjenjivost

U članku se govori o asinkronom modelu za izgradnju poslovne logike, dodanoj platformi “1C:Enterprise” izdanje 8.3. Prikazane informacije relevantne su za trenutna izdanja platforme.

Odbijanje korištenja modalnih prozora u platformi 1C:Enterprise 8.3

Prilikom razvoja konfiguracije na platformi 1C:Enterprise 8 povremeno se javlja potreba za pauziranjem programa dok korisnik ne donese odluku ili ne izvrši neku radnju.

Na primjer, kada se klikne na gumb za popunjavanje tabelarnog odjeljka, korisnik treba biti upitan treba li obrisati tablični dio kako se prethodno uneseni podaci ne bi izgubili.

Ovo se ponašanje može postići, na primjer, pomoću sljedećeg koda:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Odgovor = Pitanje (“Dio tablice bit će izbrisan. Nastaviti?”, Način dijalogaPitanje.DaNe);
Ako je odgovor = Povratni kod dijaloga. Da Zatim
//algoritam punjenja
Završi ako ;
Kraj postupka

Kao rezultat ovog fragmenta koda, izvršenje programskog koda bit će obustavljeno, pitanje će se prikazati na ekranu, sučelje aplikacije osim dijaloga s pitanjem postat će nedostupno, sustav čeka da korisnik napravi odluka, a izvršavanje koda će se nastaviti tek nakon odgovora na pitanje.

Otvaranje modalnih prozora pozivom metode OpenModal() također uzrokuje pauze u izvršavanju koda i blokiranje sučelja.

Kada radite s konfiguracijom u načinu web klijenta putem preglednika, u ovom slučaju otvorit će se novi prozor - skočni prozor koji će blokirati ne samo trenutnu karticu, već i cijelo sučelje preglednika, uključujući druge otvorene prozore i kartice.

Skočni prozori na internetu često se koriste za zlonamjernu distribuciju neželjenih reklama, zbog čega preglednici sadrže značajke blokiranja skočnih prozora.

U ovom slučaju, da biste radili s konfiguracijama 1C:Enterprise 8 putem preglednika, morate onemogućiti blokiranje skočnih prozora.

Problemi nastaju i pri radu na mobilnim uređajima. Na primjer, modalni prozori nisu podržani na iPadu.

Da biste riješili ove probleme, trebali biste koristiti blokirajuće prozore umjesto modalnih. Za korisnika, vizualno sve izgleda isto: prozor blokira sučelje web klijenta.

Međutim, prozor za blokiranje je "nacrtan" na vrhu glavnog prozora, a blokirana je samo trenutna kartica preglednika u kojoj je otvorena konfiguracija, što vam omogućuje prebacivanje na druge kartice, budući da se modalni prozori preglednika ne koriste.

Tako se skočni prozori ne otvaraju u pregledniku i osiguran je rad putem web klijenta na mobilnim uređajima.

Korijenski element konfiguracije ima svojstvo "Modality mode", koje određuje mogu li se modalni prozori otvoriti u konfiguraciji.

Ako je odabrana opcija "Koristi", tada se mogu otvoriti modalni prozori. Ako je odabrana opcija "Ne koristi", modalni prozori nisu dopušteni. Kada pokušate pozvati metodu koja otvara modalni prozor, sustav prikazuje poruku o pogrešci:

S ovom vrijednošću svojstva "Modality usage mode" dopušteno je samo blokiranje prozora.

Ako je odabrana opcija "Koristi s upozorenjima", kada se otvore modalni prozori, u prozoru s porukom prikazuje se sljedeći tekst:

Ova radna opcija može se koristiti kao posredna prilikom prerade konfiguracije kako bi se napustila uporaba modalnih prozora.

Glavna razlika između prozora za blokiranje i modalnih prozora je u tome što otvaranje prozora za blokiranje ne pauzira izvršavanje koda.

Stoga će programeri morati ponovno napisati programski kod koji koristi modalne prozore kako bi uzeli u obzir ovu značajku.

Kod je potrebno podijeliti u dva dijela:

  • otvaranje prozora za blokiranje;
  • obrada odabira korisnika.

Fragment koda naveden na početku članka potrebno je prepisati na sljedeći način:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Upozorenje = Novo Opis upozorenja(, OvajObjekt );

Način dijalogaPitanje.DaNe);
Kraj postupka
&NaKlijentu
Postupak (rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
//algoritam punjenja
Završi ako ;
Kraj postupka

Nakon izvršenja procedure ShowQuestion(), sustav ne staje, čeka se odgovor korisnika, izvršavanje koda se nastavlja.

Korisnik će se moći odlučiti tek nakon što završi cijeli postupak. U ovom slučaju, bit će pozvana procedura izvoza FillItemsQuestionComplete(). Proslijedili smo njegovo ime konstruktoru objekta DescriptionAlerts.

Procedura koja će biti pozvana nakon odabira može se nalaziti u modulu obrasca, naredbenom modulu ili općem neglobalnom modulu.

U razmatranom primjeru, pozvana procedura nalazi se u modulu upravljanog obrasca, pa smo proslijedili parametar ThisObject.

Razmotrimo pozivanje procedure koja se nalazi u zajedničkom modulu. Da biste to učinili, dodajte novi zajednički modul Obrada obavijesti, postavite oznaku "Klijent (upravljana aplikacija)" za njega i nemojte postavljati oznaku "Globalno". Smjestimo proceduru Fill in Products Question Completion () u ovaj modul.

Tada će obrađivač naredbe fill izgledati ovako:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Upozorenje = Novo Opis upozorenja("Ispunite pitanje o proizvodima",
Obrada upozorenja);
Question Text = “Tabelarni dio će biti izbrisan. Nastaviti?" ;
ShowQuestion (Upozorenje, Tekst pitanja, Način dijalogaPitanje.DaNe);
Kraj postupka

Nakon pozivanja bilo koje metode koja otvara blokirajući prozor, procedura mora izaći, a kod koji se sljedeći pokreće treba smjestiti u proceduru koja će biti pozvana nakon što se prozor zatvori.

Za prijenos konteksta (pomoćnih podataka, određenih parametara, vrijednosti varijable) iz procedure koja otvara modalni prozor u proceduru koja se poziva kada se zatvori, predviđen je treći izborni parametar konstruktora objekta: DescriptionAlerts – Dodatni parametri.

Ovaj objekt (bilo koje vrste) bit će proslijeđen proceduri opisanoj u Opisu upozorenja kao posljednji parametar.

Koristeći primjer odjeljka koda koji je gore razmotren, to se može učiniti ovako:

&NaKlijentu
Postupak Ispunite proizvode(Tim )
Parametar1 = 0;
Parametar2 = 0;
Popis parametara= Nova struktura (“Parametar1, Parametar2″, Parametar1, Parametar2);
Upozorenje = Novo Opis upozorenja("Ispunite pitanje o proizvodima", ovaj objekt ,
Popis parametara);
ShowQuestion (Upozorenje, "Dio tablice bit će izbrisan. Nastaviti?",
Način dijalogaPitanje.DaNe);
Kraj postupka
&NaKlijentu
Postupak IspuniteProductsQuestionCompletion(Rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
//analiziraj dodatne parametre.Parametar1
//analiziraj dodatne parametre.Parametar2
Završi ako ;
Kraj postupka

Ako trebate proslijediti samo jednu vrijednost, tada ne možete koristiti strukturu, već dodijeliti ovu vrijednost parametru Dodatni parametri konstruktora objekta DescriptionAlerts.

Pogledajmo nekoliko primjera rada s blokiranjem prozora.

Zadatak 1: Otvorite drugi obrazac

Iz obrasca dokumenta klikom na gumb “Otvori parametre” potrebno je otvoriti obrazac na kojem se nalaze dva checkboxa Parametar1 i Parametar2 koje korisnik mora postaviti. Nakon zatvaranja obrasca, prikazati vrijednosti parametara u retku poruke.

Kreiramo opći obrazac “ParameterForm”, na koji postavljamo detalje Parameter1 i Parameter2, kao i naredbu CloseForm:

Rukovatelj naredbom izgleda ovako:

Rukovatelj naredbom izgleda ovako: &OnClient
Procedura CloseForm (naredba)
Popis parametara= Nova struktura ( “Parametar1, Parametar2”, Parametar1, Parametar2);
Zatvoriti ( Popis parametara); Kraj postupka

Za obrazac postavite svojstvo WindowOpenMode na "Blokiraj cijelo sučelje":

Na formu dokumenta postavljamo naredbu OpenParameters čiji je rukovatelj opisan na sljedeći način:

&NaKlijentu
Postupak OpenOptions(Tim )
Upozorenje = Novo Opis upozorenja("Otvori opcije Završi", OvajObjekt );
OpenForm ( “Opći obrazac.Parametri obrasca”, , , , , , Obavijest);
Kraj postupka
&NaKlijentu
Postupak OpenOptionsComplete(Rezultat, Dodatne mogućnosti) Izvoz
Ako je TypeValue (Rezultat) = Type (“Structure”) Onda
Za svaki KeyValue iz petlje rezultata
Poruka = ​​Novo Poruka korisniku;
Message.Text = “Ključ: “” ” + KeyValue.Key + “””, vrijednost = ”
+ KeyValue.Value;
Poruka.Izvješće();
Kraj ciklusa ;
Završi ako ;
Kraj postupka

U korisničkom načinu rada, izvođenjem konfiguracije pod web klijentom, dobivamo sljedeće rezultate:

Kliknite na sliku za povećanje.

Način otvaranja prozora također se može odrediti u zadnjem parametru procedure OpenForm.

&NaKlijentu
Postupak OpenOptions(Tim )
Upozorenje = Novo Opis upozorenja("Otvori opcije Završi", OvajObjekt );
OpenForm ( “Opći obrazac.Parametri obrasca”, , , , , , Upozorenje
FormWindowOpenMode.LockEntireInterface
);
Kraj postupka

Zadatak 2. Pitanje pri zatvaranju forme

Prilikom zatvaranja prozora obrade pitajte korisnika želi li doista zatvoriti prozor.

Ovaj problem se može riješiti korištenjem sljedećeg koda koji se nalazi u modulu obrasca obrade:

&NaKlijentu
Perem Potrebno je zatvoriti obrazac;
&NaKlijentu
Postupak prije zatvaranja (neuspjeh, Standardna obrada)
Ako ne Potrebno je zatvoriti obrazac= Istina Onda
Odbiti = Istina ;
Upozorenje = Novo Opis upozorenja(“Prije završetka zatvaranja”, OvajObjekt );
ShowQuestion (Upozorenje, "Jeste li sigurni da želite zatvoriti prozor?",
Način dijalogaPitanje.DaNe
);
Završi ako ;
Kraj postupka
&NaKlijentu
Postupak Prije završetka zatvaranja(Rezultat, Dodatne mogućnosti) Izvoz
Ako je rezultat = Povratni kod dijaloga. Da Zatim
Potrebno je zatvoriti obrazac= Istina ;
Zatvoriti();
Inače
Potrebno je zatvoriti obrazac= Nedefinirano;
Završi ako ;
Kraj postupka

U proceduri obrasca Prije zatvaranja, korisniku se postavlja pitanje, zastavica odbijanja se postavlja na True i zatvaranje obrasca se poništava.

Nakon potvrdnog odgovora na pitanje, varijabla Need toCloseForm postavlja se na True i forma se ponovno zatvara.

Zadatak 3: Unos numeričke vrijednosti

Klikom na gumb na obrascu za obradu otvara se standardni dijalog za unos broja.

Da biste to učinili, trebate koristiti metodu ShowNumberInput() umjesto EnterNumber(), koja otvara prozor za blokiranje umjesto modalnog.

&NaKlijentu
Postupak Unos brojeva (naredba)
Upozorenje = Novo Opis upozorenja(“EnterNumberComplete”, OvajObjekt );
ShowEnterNumbers(Upozorenje, 0, “Unesite količinu”, 15, 3);
Kraj postupka
&NaKlijentu
Postupak Dovršavanje unosa brojeva(Rezultat, Dodatne mogućnosti) Izvoz

Poruka = ​​Novo Poruka korisniku;
Message.Text = “Unijeli ste količinu” + Rezultat;
Poruka.Izvješće();
Završi ako ;
Kraj postupka

Nakon zatvaranja prozora za unos broja poziva se procedura čiji će prvi parametar biti uneseni broj ili Nedefinirana vrijednost ako je korisnik odbio unos.

Zadatak 4. Odabir boje

Kada kliknete na gumb na obrascu za obradu, koristeći standardni dijalog za odabir boje, korisnik određuje željenu boju. Postavite ovu boju za pozadinu kliknutog gumba.

Dodajte naredbu SelectColor u obrazac sa sljedećim rukovateljem:

&NaKlijentu
Odabir boje postupka (naredba)
Dijaloški okvir za odabir boje= Novo Dijaloški okvir za odabir boje;
Upozorenje = Novo Opis upozorenja(“Odabir boje završen”, OvajObjekt );
Dijaloški okvir za odabir boje. Prikaži (upozorenje);
Kraj postupka
&NaKlijentu
Postupak ChoiceColorsCompletion(Rezultat, Dodatne mogućnosti) Izvoz
Ako NIJE Rezultat = Nedefinirano Onda
Elementi. Odabir boja. Boja pozadine= Rezultat;
Završi ako ;
Kraj postupka

Za objekte dijaloškog okvira za odabir boje (kao i dijaloški okvir za uređivanje standardnog razdoblja, konstruktor retka formata, dijaloški okvir redovnog rasporeda zadataka, dijaloški okvir za odabir fonta), metoda Show() otvara prozor za blokiranje.

Nakon zatvaranja prozora poziva se procedura čijem prvom parametru se prosljeđuje odabrana vrijednost (boja, font itd.) ili vrijednost Nedefinirano ako je korisnik odbio izbor.

Treba napomenuti da objekt FileSelectionDialog nema Show() metodu, za razliku od dijaloga za odabir boje ili fonta, jer je implementacija ovih dijaloga značajno drugačija.

Da biste koristili dijaloški okvir za odabir datoteke na web klijentu, prvo morate omogućiti ekstenziju datoteke.

Dijalozi implementirani putem ekstenzije datoteke ne stvaraju iste operativne probleme kao modalni prozori preglednika, tako da otvaranje blokirajućih prozora za objekt FileSelectionDialog nije implementirano.

Zaključno, napominjemo da je počevši od izdanja 8.3.10 podrška za modalne prozore prekinuta u web klijentu. U ovom slučaju, ako se u konfiguraciji pozove modalna metoda, generira se iznimka. Također, podrška za način sučelja je ukinuta u web klijentu U odvojenim prozorima. Osim toga, ni u tankom ni u web klijentu više nije moguće otvoriti obrazac u zasebnom prozoru (kada radite u načinu sučelja Bookmarks). Takvi drastični koraci omogućili su napuštanje načina sučelja, koje više ne podržavaju svi moderni preglednici.

Kakav se praktični zaključak može izvući iz ovih informacija? A zaključak je vrlo jednostavan - ako iz nekog razloga još uvijek postoje modalni pozivi u vašoj konfiguraciji, tada će se na tim mjestima u web klijentu prikazati prozor s porukom o pogrešci. Želio bih upozoriti da ne pokušavate "guglati" nekim brzim rješenjem za ovaj problem, jer... Većina savjeta svodi se na ovaj recept: u konfiguratoru na razini konfiguracije postavite svojstvo “Modality usage mode” na “Use”. Naravno, u ovom trenutku to neće funkcionirati samo zato što sami moderni preglednici više ne podržavaju modalne pozive.

I imate samo dva načina da riješite gore opisani problem:

  1. Ažurirajte platformu za izdanje 8.3.10+ (8.3.11), postavite konfiguracijsko svojstvo "Način kompatibilnosti" na "Ne koristi" i prepišite fragmente koda koji koriste modalne metode u model asinkrone poslovne logike
  2. Preporučite svojim klijentima da koriste starije preglednike koji još podržavaju modalne pozive (Mozilla Firefox verzije 37 i niže, Chrome verzije ispod 37 itd.).

Usput, počevši od izdanja 8.3.11, web preglednici Microsoft Internet Explorer verzije 8 i 9 više nisu podržani.

Bavili smo se web preglednicima u svjetlu modaliteta, sada je vrijeme da razjasnimo situaciju s drugim klijentima.

Počevši od verzije 8.3.5, svojstvo Modality Usage Mode u tankim i debelim klijentima poštuje se samo ako je navedena opcija naredbenog retka /EnableCheckModal. Ovaj parametar se automatski ubacuje u naredbeni redak samo kada se aplikacija pokrene iz konfiguratora. Ako ovaj parametar nije naveden, tada se ne generiraju iznimke i odgovarajuća upozorenja se ne prikazuju. Oni. u praksi, pri korištenju debelog i tankog klijenta, ne uočava se temeljna promjena u radu pri korištenju modalnog načina rada - modalni pozivi radit će isto kao što su radili prije, bez ikakvih upozorenja, kao u web klijentu.

Da stavimo točku na i, imajte na umu da počevši od verzije 8.3.9, debeli klijent zanemaruje svojstvo konfiguracije “Način korištenja sinkronih poziva proširenjima platforme i vanjskim komponentama”, dok odgovarajuće sinkrone metode rade bez generiranja iznimaka i prikazivanja upozorenja. Navedeno ignorirano svojstvo dodano je u verziji 8.3.5 za podršku asinkronog rada s vanjskim komponentama, kriptografijom i ekstenzijama za rad s datotekama u web pregledniku Google Chrome. Jasno je da to nema nikakve veze s debelim klijentom, pa je stoga "tiho" ignoriranje ovog svojstva jednostavno eliminiralo nepotrebne provjere za korištenje sinkronih metoda prilikom korištenja konfiguracije.

Usput! Zbog činjenice da platforma samouvjereno korača prema webu, s verzijom 8.3.8 programeri su uveli određena ograničenja na programski kod koji je povezan s logikom zatvaranja obrasca ili aplikacije, koja se izvršava u debelim i tankim klijentima. Obavezno pročitajte naš članak koji detaljno pokriva ovu nijansu. Osim toga, u tečaju "Profesionalni razvoj sučelja i obrazaca u 1C: Enterprise 8.3" postoji poglavlje posvećeno napuštanju modaliteta, a možete prikupiti mnogo korisnih i relevantnih informacija o ovoj temi.

Kolege, postoje dvije stvari koje možete beskonačno čitati: VKontakte feed i popis promjena u sljedećem izdanju platforme, pa sumiramo konačne rezultate;)

U procesu razmatranja primjera koji vam omogućuju prijelaz s elemenata sinkronog modela na asinkroni, vjerojatno ste već primijetili da u općem slučaju postoji više programskog koda. Što je više koda, to se više povećava složenost njegovog daljnjeg održavanja i otklanjanja pogrešaka.

Osim toga, količina koda će se još više povećati ako koristimo više dijaloga tijekom procesa razvoja. Stoga se u procesu razvoja aplikativnih rješenja usmjerenih na rad u web klijentu treba prisjetiti paradigme rada koja se trenutno koristi u modernim web aplikacijama. Stoga, ako vaša konfiguracija ima mnogo interaktivnih dijaloga s korisnikom i upozorenja, onda ima smisla ponovno razmotriti ovu funkcionalnost u korist nekih drugih pristupa organizaciji interakcije korisnika.

Umjesto zaključka

Naš ciklus “Prvi koraci u razvoju 1C” je došao kraju. Ako ga pročitate u cijelosti, onda ste najvjerojatnije već primijetili kako se platforma u posljednje vrijeme razvija velikom brzinom. Materijal u ovoj seriji napisan je relativno nedavno, ali bili smo prisiljeni ozbiljno ga ažurirati, jer... Čak iu tako kratkom vremenu pojavilo se puno novih važnih funkcionalnosti i promjena. Takve velike promjene mogu biti pomalo zbunjujuće za 1C programera ako sve ovo vrijeme nije rastao i profesionalno se razvijao s platformom.

Na specijaliziranim internetskim resursima često možete pročitati zahtjeve programera početnika i njihovih zrelijih kolega da preporuče materijale koji bi im pomogli da razumiju opsežne i ponekad naizgled beskrajne mogućnosti platforme 1C. Već tradicionalno preporučujemo da obratite pažnju na naše tečajeve programiranja

Zašto se pojavljuje pogreška "Korištenje sinkronih metoda na klijentu je zabranjeno"?

Ako naiđete na takvu pogrešku tijekom dovršetka lekcija, vrlo ju je lako popraviti.

Vratite se u konfigurator i odaberite stavku izbornika "Konfiguracija" -> "Otvori konfiguraciju":

U prozoru koji se otvori kliknite desnom tipkom miša na stavku "Konfiguracija" i odaberite "Svojstva" iz izbornika koji se otvori:

Otvorit će se prozor sa svojstvima konfiguracije (desno):

Pomaknite se do samog dna i tamo pronađite stavku "Način modaliteta":

Postavite njegovu vrijednost na "Koristiti":

Pažnja! Imajte na umu da ako koristite platformu 1C koja se razlikuje od one koju smo preuzeli u prvoj lekciji (kasnija verzija), tada ćete također imati polje "Način za korištenje sinkronih poziva...". Također je potrebno postaviti na "Upotreba".

Na kraju odaberite stavku izbornika "Konfiguracija" -> "Spremi konfiguraciju":

Spreman! Sada se greška više neće javljati.

Objašnjenja ispod - za one koje zanima što smo radili.

Omogućili smo način rada u našoj konfiguraciji. Prema zadanim postavkama, ovaj način rada je onemogućen i to nam ne dopušta korištenje naredbi kao što su EnterNumber, EnterString, EnterDate, OpenValue.

Činjenica je da su te naredbe modalne. Njihovim pozivanjem se pred korisnikom pojavljuje prozor (npr. za unos podataka) koji blokira mogućnost rada s programom dok se prozor ne zatvori.

A budući da je prisutnost takvih prozora krajnje nepoželjna pri radu s 1C putem web-preglednika, pri razvoju novih konfiguracija način modaliteta je prema zadanim postavkama isključen.