Asinhroni pozivi ekstenzijama i vanjskim komponentama. Zašto se pojavljuje greška "Upotreba sinhronih metoda na klijentu je zabranjena"?

Implementirano u verziji 8.3.5.1383, 8.3.6.1977.

Moderne tendencije

Trendovi razvoja pretraživača dovode do sve većeg procenta „asinhronije“ na platformi. Prvi korak je bio. Sada postoje asinhroni pozivi za rad sa ekstenzijama kriptografije, rad sa datotekama i eksternim komponentama.

Razlog za sljedeći korak ka asinhroniji je to što su programeri Google Chrome pretraživača napustili podršku za prethodnu NPAPI (Netscape Plugin Application Programming Interface) tehnologiju. Ova tehnologija je korištena za povezivanje eksternih modula - ekstenzija - na pretraživač.

1C:Enterprise koristi takve ekstenzije za rad s kriptografijom, rad s datotekama i povezivanje vanjskih komponenti. Ovo je prilično važna funkcionalnost. Kriptografija se koristi u elektronskom upravljanju dokumentima, a zahvaljujući eksternim komponentama, aplikacije mogu raditi sa skenerima bar kodova i drugom maloprodajnom opremom.

I sada, umjesto prethodne sinhrone NPAPI tehnologije, Google Chrome programeri su kreirali novu tehnologiju Native Messaging. Istovremeno, snažno su preporučili da svi programeri ekstenzija 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 u tome što pruža isključivo asinkronu interakciju sa ekstenzijama pretraživača. A to zahtijeva radikalnu promjenu u svim postojećim metodama rada s ekstenzijama i vanjskim komponentama u 1C:Enterprise. Zato što su svi zasnovani na sinhronoj interakciji.

Asinhrone metode

Ovaj problem smo riješili na isti način na koji smo riješili problem modalnog pozivanja. Za sve sinhrone metode koje koriste NPAPI tehnologiju, kreirali smo njihove asinhrone parnjake. Uglavnom se razlikuju po prisutnosti prefiksa Počni i činjenica da im se prosljeđuje prvi parametar DescriptionAlerts, iz kojeg će se izvršavanje programskog koda nastaviti nakon završetka pozvane akcije.

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

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

Umjesto metode GetFiles() - StartGettingFiles():

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

Umjesto SetExternalComponent()- StartInstallingExternalComponents():

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

U stvari, uglavnom, sve je vrlo slično onome što smo radili prije kada smo se riješili modaliteta. Ali funkcioniranje novih asinkronih metoda ima suštinsku osobinu koju metode koje uzrokuju nemodalne dijaloge nemaju.

Prilikom asinhronog pozivanja dijaloga bez mode, očekujemo samo neku reakciju korisnika i ništa više. U smislu da se ništa neočekivano ne može dogoditi.

A u procesu pozivanja asinhronih metoda rada s ekstenzijama i komponentama mogu se pojaviti izuzetne situacije. Ekstenzija se nije instalirala, komponenta se nije učitala itd.

Obično pružate rukovanje takvim izuzecima u kodu aplikacije. Korištenje operatera Pokušavam... Izuzetak. Ali sada to postaje nemoguće, jer u vrijeme asinhronog poziva, kod aplikacije se ne izvršava. Shodno tome, operater ne radi Pokušavam... Izuzetak.

  • NameProcedureProcessingErrors;
  • ErrorProcessingModule.

Ako nešto pođe po zlu tokom asinhronog poziva i dođe do izuzetka, biće izvršena procedura na koju ukazuju ova svojstva. Ima smisla koristiti ova dva svojstva samo u asinkronim metodama rada sa ekstenzijama. Kada pozivate dijaloge bez modela, ova svojstva vam nisu potrebna.

Svojstvo konfiguracije

Kao iu slučaju odbijanja modaliteta, cjelokupno aplikativno rješenje u cjelini mora znati „šta je to“. Ili je modalan ili nemodalan. Ili je sinhrona ili asinhrona.

Ranije, da bismo riješili problem s modalitetom, dodali smo posebno svojstvo konfiguracije Način korištenja modaliteta. Sada, da bismo riješili problem sa sinhronicitetom, dodali smo svojstvo slično njemu po značenju Način korištenja sinkronih poziva ekstenzija i eksternih komponenti.

Suština njegove upotrebe je sljedeća:

  • Nemojte koristiti- ovo je novi, asinhroni način rada. Za nove konfiguracije ovo je standardni način rada. Korištenje starih, sinhronih metoda je zabranjeno. Ne prolaze sintaksičku kontrolu, nisu u kontekstu. Pokušaj izvršavanja sinhrone metode dovodi do izuzetka.
  • Koristite uz upozorenje- ovaj mod je namijenjen programeru. To ne sprječava korištenje starijih, sinhronih metoda. Ali svaki put kada se sinhroni metod pozove na klijentu, on proizvodi poruku upozorenja. Preporučujemo korištenje ovog načina rada u konfiguracijama za „recikliranje“. Pogodan je za vizuelno traženje sinhronih poziva i njihovo praćenje tokom procesa revizije.
  • Koristi- način rada koji osigurava kompatibilnost nove verzije platforme sa starim konfiguracijama koje koriste sinhrone 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 aplikativnim rješenjima. A programeri će se, na primjer, prebaciti na asinhrone operativne podsisteme koji koriste kriptografske alate, rade s datotekama i vanjskim komponentama.

Naravno, kao i kod modalnih poziva, vjerovatno imate pitanje. Trebam li ponoviti rješenje aplikacije? I općenito, da li trebam koristiti ove asinkrone metode u svom novom aplikativnom rješenju?

Kada je to potrebno?

Odgovor na ovo pitanje je u suštini isti kao što smo dali ranije. Kada su govorili o napuštanju modaliteta.

Prvo, ne podržava svaka verzija tehnološke platforme način asinhronih 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 aplikativna rješenja nužno koristiti ovaj način rada. Kritične aplikacije su one s kojima će se raditi korištenjem web klijenta u pregledniku Google Chrome. Takve aplikacije, velikim dijelom, su aplikacije koje se pokreću. Ako se vaše aplikativno rješenje definitivno neće koristiti u ovom načinu rada, za sada ne možete napustiti sinhrone metode.

Međutim, uprkos prvoj i drugoj tački, postoje globalni trendovi koji mogu uticati na vaše planove. Mi, kompanija 1C, razvijamo sva standardna rješenja na osnovu č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 režimu bez korištenja sinhronih poziva.

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

Refaktoring

S jedne strane, ako je konfiguracija velika i u njoj ima puno sinkronih poziva, onda "ručno" prepravljanje takve konfiguracije može biti vrlo dugotrajan zadatak.

S druge strane, počevši od verzije 8.3.5.1068, platforma ima karakteristike koje vam omogućavaju da konvertujete sinhrone pozive u njihove asinhrone.

Stoga smo uzeli ove već postojeće alate, proširili ih i preusmjerili ih sa „udaljavanja od modaliteta“ u „prelazak u asinhroniju“. U svojoj srži, prijelaz na asinhrone metode je sličan radnjama koje se izvode prilikom napuštanja modaliteta. Stare, “nemodne”, sinhrone (modalne) pozive treba zamijeniti novim, “modnim”, asinkronim pozivima koristeći ProcessingAlerts.

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

Pošto je "naglasak" ovih alata prebačen na asinhroniju, neke komande smo preimenovali. Umjesto "nemodalnog", sada se koristi izraz "zastarjeli sinhroni":

Osim toga, dodali smo novu karticu u postavke konfiguratora Refaktoring. Po defaultu, obje transformacije su omogućene. Ali, ako vam zatreba, uz njegovu pomoć možete izvršiti samo jednu od vrsta transformacija tokom automatskog refaktoriranja.

05.12.2014

Implementirano u verziji 8.3.5.1383, 8.3.6.1977.

Moderne tendencije

Trendovi razvoja pretraživača dovode do sve većeg procenta "asinhronije" na platformi. Prvi korak je bio napuštanje modaliteta. Sada postoje asinhroni pozivi za rad sa ekstenzijama kriptografije, rad sa datotekama i eksternim komponentama.

Razlog za sljedeći korak ka asinhroniji je to što su programeri Google Chrome pretraživača napustili podršku za prethodnu NPAPI (Netscape Plugin Application Programming Interface) tehnologiju. Ova tehnologija je korištena za povezivanje eksternih modula - ekstenzija - na pretraživač.

1C:Enterprise koristi takve ekstenzije za rad s kriptografijom, rad s datotekama i povezivanje vanjskih komponenti. Ovo je prilično važna funkcionalnost. Kriptografija se koristi u elektronskom upravljanju dokumentima, a zahvaljujući eksternim komponentama, aplikacije mogu raditi sa skenerima bar kodova i drugom maloprodajnom opremom.

I sada, umjesto prethodne sinhrone NPAPI tehnologije, Google Chrome programeri su kreirali novu tehnologiju Native Messaging. Istovremeno, snažno su preporučili da svi programeri ekstenzija 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 u tome što pruža isključivo asinkronu interakciju sa ekstenzijama pretraživača. A to zahtijeva radikalnu promjenu u svim postojećim metodama rada s ekstenzijama i vanjskim komponentama u 1C:Enterprise. Zato što su svi zasnovani na sinhronoj interakciji.

Asinhrone metode

Ovaj problem smo riješili na isti način kao i problem modalnog pozivanja. Za sve sinhrone metode koje koriste NPAPI tehnologiju, kreirali smo njihove asinhrone parnjake. Uglavnom se razlikuju po prisutnosti Start prefiksa i činjenici da je prvi parametar Opis upozorenja, iz kojeg će se izvršavanje programskog koda nastaviti nakon završetka pozvane akcije.

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

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

Umjesto metode GetFiles() - StartGettingFiles():

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

Umjesto InstallExternalComponent() - StartInstallingExternalComponent():

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

U stvari, uglavnom, sve je vrlo slično onome što smo radili prije kada smo se riješili modaliteta. Ali funkcioniranje novih asinkronih metoda ima suštinsku osobinu koju metode koje uzrokuju nemodalne dijaloge nemaju.

Prilikom asinhronog pozivanja dijaloga bez mode, očekujemo samo neku reakciju korisnika i ništa više. U smislu da se ništa neočekivano ne može dogoditi.

A u procesu pozivanja asinhronih metoda rada s ekstenzijama i komponentama mogu se pojaviti izuzetne situacije. Ekstenzija se nije instalirala, komponenta se nije učitala itd.

Obično pružate rukovanje takvim izuzecima u kodu aplikacije. Korišćenje operatora Try... Exception. Ali sada to postaje nemoguće, jer u vrijeme asinhronog poziva, kod aplikacije se ne izvršava. Shodno tome, operator Pokušaj... izuzetka ne radi.

  • ErrorProcedureName;
  • Modul za obradu grešaka.

Ako nešto pođe po zlu tokom asinhronog poziva i dođe do izuzetka, biće izvršena procedura na koju ukazuju ova svojstva. Ima smisla koristiti ova dva svojstva samo u asinkronim metodama rada sa ekstenzijama. Kada pozivate dijaloge bez modela, ova svojstva vam nisu potrebna.

Svojstvo konfiguracije

Kao iu slučaju odbijanja modaliteta, cjelokupno aplikativno rješenje u cjelini mora znati „šta je to“. Ili je modalan ili nemodalan. Ili je sinhrona ili asinhrona.

Prethodno, da bismo riješili problem s modalitetom, dodali smo posebno svojstvo u konfiguraciju: Način korištenja modaliteta. Sada, da bismo riješili problem sa sinhronizacijom, dodali smo svojstvo sličnog po značenju: Mod za korištenje sinhronih poziva ekstenzija i vanjskih komponenti.

Suština njegove upotrebe je sljedeća:

  • Ne koristiti je novi, asinhroni način rada. Za nove konfiguracije ovo je standardni način rada. Korištenje starih, sinhronih metoda je zabranjeno. Ne prolaze sintaksičku kontrolu, nisu u kontekstu. Pokušaj izvršavanja sinhrone metode dovodi do izuzetka.
  • Koristite uz upozorenje - ovaj način je namijenjen programeru. To ne sprječava korištenje starijih, sinhronih metoda. Ali svaki put kada se sinhroni metod pozove na klijentu, on proizvodi poruku upozorenja. Preporučujemo korištenje ovog načina rada u konfiguracijama za „recikliranje“. Pogodan je za vizuelno traženje sinhronih poziva i njihovo praćenje tokom procesa revizije.
  • Upotreba - način rada koji osigurava kompatibilnost nove verzije platforme sa starim konfiguracijama koje koriste sinhrone 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 aplikativnim rješenjima. A BSP programeri će, na primjer, prenijeti podsisteme koji koriste alate za kriptografiju, rad s datotekama i vanjskim komponentama na asinhroni rad.

Naravno, kao i kod modalnih poziva, vjerovatno imate pitanje. Trebam li ponoviti rješenje aplikacije? I općenito, da li trebam koristiti ove asinkrone metode u svom novom aplikativnom rješenju?

Kada je to potrebno?

Odgovor na ovo pitanje je u suštini isti kao što smo dali ranije. Kada su govorili o napuštanju modaliteta.

Prvo, ne podržava svaka verzija tehnološke platforme način asinhronih 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 aplikativna rješenja nužno koristiti ovaj način rada. Kritične aplikacije su one s kojima će se raditi korištenjem web klijenta u pregledniku Google Chrome. Takve aplikacije, velikim dijelom, su aplikacije koje rade u uslužnom modelu. Ako se vaše aplikativno rješenje definitivno neće koristiti u ovom načinu rada, za sada ne možete napustiti sinhrone metode.

Međutim, uprkos prvoj i drugoj tački, postoje globalni trendovi koji mogu uticati na vaše planove. Mi, kompanija 1C, razvijamo sva standardna rješenja na osnovu č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 režimu bez korištenja sinhronih poziva.

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

Refaktoring

S jedne strane, ako je konfiguracija velika i u njoj ima puno sinkronih poziva, onda "ručno" prepravljanje takve konfiguracije može biti vrlo dugotrajan zadatak.

S druge strane, počevši od verzije 8.3.5.1068, platforma ima alate koji vam omogućavaju da konvertujete sinhrone pozive u njihove asinhrone kolege.

Stoga smo uzeli ove već postojeće alate, proširili ih i preusmjerili ih sa „udaljavanja od modaliteta“ u „prelazak u asinhroniju“. U svojoj srži, prijelaz na asinhrone metode je sličan radnjama koje se izvode prilikom napuštanja modaliteta. Stari, “nemodni”, sinhroni (modalni) pozivi moraju biti zamijenjeni novim, “modnim”, asinhronim pozivima koji koriste obradu obavještenja.

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

Pošto je "naglasak" ovih alata prebačen na asinhroniju, neke komande smo preimenovali. Umjesto "nemodalnog", sada se koristi izraz "zastarjeli sinhroni":

Dodatno, dodali smo novu karticu Refactoring u postavke konfiguratora. Po defaultu, obje transformacije su omogućene. Ali, ako vam zatreba, uz njegovu pomoć možete izvršiti samo jednu od vrsta transformacija tokom automatskog refaktoriranja:

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

Primjenjivost

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

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

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

Na primjer, kada se klikne na dugme za popunjavanje tabelarnog odeljka, korisnik treba da bude upitan da li tabelarni deo treba da se obriše kako se prethodno uneti podaci ne bi izgubili.

Ovo ponašanje se može postići, na primjer, sljedećim kodom:

&OnClient
Procedura Popunite Proizvodi(tim)
Odgovor = Pitanje (“Deo tabele će biti obrisan. Nastaviti?”, Dialogue ModeQuestion.DaNe);
Ako je odgovor = Dialogue Return Code. Da Onda
//algoritam popunjavanja
EndIf ;
Kraj procedure

Kao rezultat ovog fragmenta koda, izvršenje programskog koda će biti obustavljeno, pitanje će biti prikazano na ekranu, interfejs aplikacije osim dijaloga sa pitanjem će postati nedostupan, sistem čeka da korisnik napravi odluka, a izvršavanje koda će se nastaviti tek nakon što se odgovori na pitanje.

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

Prilikom rada s konfiguracijom u načinu web klijenta kroz pretraživač, u ovom slučaju će se otvoriti novi prozor - iskačući prozor koji će blokirati ne samo trenutnu karticu, već i cijelo sučelje preglednika, uključujući druge otvorene prozore i kartice.

Iskačući prozori na Internetu se često koriste za zlonamjernu distribuciju neželjenih reklama, zbog čega pretraživači sadrže funkcije blokiranja iskačućih prozora.

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

Problemi se javljaju 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 vizuelno sve izgleda isto: prozor blokira interfejs web klijenta.

Međutim, prozor za blokiranje je „nacrtan“ na vrhu glavnog prozora, a blokira se samo trenutna kartica pretraživača u kojoj je konfiguracija otvorena, što vam omogućava da se prebacite na druge kartice, pošto se modalni prozori pretraživača ne koriste.

Tako se iskačući prozori ne otvaraju u pretraživaču i osigurava se rad preko web klijenta na mobilnim uređajima.

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

Ako je odabrana opcija “Koristi”, tada se mogu otvoriti modalni prozori. Ako je odabrana opcija “Ne koristiti”, modalni prozori nisu dozvoljeni. Kada pokušate pozvati metodu koja otvara modalni prozor, sistem prikazuje poruku o grešci:

Sa ovom vrijednošću svojstva “Modality usage mode”, dozvoljeni su samo prozori za blokiranje.

Ako je odabrana opcija “Koristi s upozorenjima”, onda kada se otvore modalni prozori, u prozoru poruke se prikazuje sljedeći tekst:

Ova radna opcija se može koristiti kao srednja pri preradi konfiguracije kako bi se napustilo korištenje modalnih prozora.

Glavna razlika između blokirajućih prozora i modalnih prozora je u tome što otvaranje blokirajućeg prozora ne pauzira izvršavanje koda.

Stoga će programeri morati ponovo napisati programski kod koji koristi modalne prozore kako bi uzeli u obzir ovu osobinu.

Kod je potrebno podijeliti na dva dijela:

  • otvaranje prozora koji blokira;
  • obrada odabira korisnika.

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

&OnClient
Procedura Popunite Proizvodi(tim)
Upozorenje = Novo DescriptionAlerts(, OvajObjekat );

Dialogue ModeQuestion.DaNe);
Kraj procedure
&OnClient
Postupak (rezultat, Dodatne opcije) Izvoz
Ako je rezultat = Dialogue Return Code. Da Onda
//algoritam popunjavanja
EndIf ;
Kraj procedure

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

Korisnik će moći da napravi izbor tek nakon što se kompletna procedura završi. U ovom slučaju, eksportna procedura FillItemsQuestionComplete() će biti pozvana. Njegovo ime smo prenijeli konstruktoru objekta DescriptionAlerts.

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

U razmatranom primjeru, pozvana procedura se nalazi 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 zastavicu „Klijent (upravljana aplikacija)” za njega i nemojte postavljati zastavicu „Globalno”. Postavimo proceduru Popuni proizvode Dovršenje pitanja () u ovaj modul.

Tada će rukovalac naredbe popunjavanja izgledati ovako:

&OnClient
Procedura Popunite Proizvodi(tim)
Upozorenje = Novo DescriptionAlerts(“Popunite pitanje o proizvodima”,
ProcessingAlerts);
Tekst pitanja = „Tabelarni dio će biti obrisan. Nastaviti?" ;
ShowQuestion (Upozorenje, Tekst pitanja, Dialogue ModeQuestion.DaNe);
Kraj procedure

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

Za prijenos konteksta (pomoćnih podataka, određenih parametara, vrijednosti varijabli) iz procedure koja otvara modalni prozor u proceduru koja se zove kada je zatvorena, obezbjeđen je treći opcioni parametar konstruktora objekta: DescriptionAlerts – Dodatni parametri.

Ovaj objekt (bilo kojeg tipa) će biti 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 na sljedeći način:

&OnClient
Procedura Popunite Proizvodi(tim)
Parametar1 = 0;
Parametar2 = 0;
Lista parametara= Nova struktura (“Parametar1, Parametar2″, Parametar1, Parametar2);
Upozorenje = Novo DescriptionAlerts(“Popunite pitanje o proizvodima”, ThisObject ,
Lista parametara);
ShowQuestion (Upozorenje, "Deo tabele će biti obrisan. Nastaviti?",
Dialogue ModeQuestion.DaNe);
Kraj procedure
&OnClient
Procedura IspuniteProductsQuestionCompletion(Rezultat, Dodatne opcije) Izvoz
Ako je rezultat = Dialogue Return Code. Da Onda
//analiziramo dodatne parametre.Parameter1
//analiziramo dodatne parametre.Parameter2
EndIf ;
Kraj procedure

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

Pogledajmo nekoliko primjera rada sa blokiranjem prozora.

Zadatak 1: Otvorite drugi obrazac

Iz obrasca dokumenta, klikom na dugme „Otvori parametre“ potrebno je da otvorite obrazac na kojem se nalaze dva checkbox-a Parametar1 i Parametar2, koje korisnik mora postaviti. Nakon zatvaranja obrasca, prikažite vrijednosti parametara u liniji poruke.

Kreiramo opšti obrazac “ParametersForm”, na koji postavljamo detalje Parameter1 i Parameter2, kao i naredbu CloseForm:

Rukovalac komandama izgleda ovako:

Rukovalac komandom izgleda ovako: &OnClient
Procedura CloseForm (naredba)
Lista parametara= Nova struktura ( “Parametar1, Parametar2”, Parametar1 , Parametar2 );
Zatvori ( Lista parametara); Kraj procedure

Za obrazac postavite svojstvo WindowOpenMode na “Blokiraj cijeli interfejs”:

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

&OnClient
Procedura OpenOptions(tim)
Upozorenje = Novo DescriptionAlerts(“Otvorite opcije Završetak”, ThisObject );
OpenForm ( “GeneralForm.FormParameters”, , , , , , Obavijest);
Kraj procedure
&OnClient
Procedura OpenOptionsComplete(Rezultat, Dodatne opcije) Izvoz
Ako je TypeValue (Result) = Tip (“Struktura”) Onda
Za svaku vrijednost ključa iz petlje rezultata
Poruka = ​​Novo Poruka korisniku;
Message.Text = “Ključ: “” ” + KeyValue.Key + “””, vrijednost = ”
+ KeyValue.Value;
Message.Report();
EndCycle ;
EndIf ;
Kraj procedure

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

Za uvećanje kliknite na sliku.

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

&OnClient
Procedura OpenOptions(tim)
Upozorenje = Novo DescriptionAlerts(“Otvorite opcije Završetak”, ThisObject );
OpenForm ( “GeneralForm.FormParameters”, , , , , , Alert
FormWindowOpenMode.LockEntireInterface
);
Kraj procedure

Zadatak 2. Pitanje prilikom zatvaranja obrasca

Kada zatvarate prozor za obradu, pitajte korisnika da li zaista želi da zatvori prozor.

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

&OnClient
Perem Potrebno je zatvoriti obrazac;
&OnClient
Procedura prije zatvaranja (Neuspjeh, StandardProcessing)
Ako ne Potrebno je zatvoriti obrazac= Tačno Onda
Odbiti = Tačno;
Upozorenje = Novo DescriptionAlerts(“Prije završetka završetka”, ThisObject );
ShowQuestion (Upozorenje, "Jeste li sigurni da želite zatvoriti prozor?",
Dialogue ModeQuestion.DaNe
);
EndIf ;
Kraj procedure
&OnClient
Procedura Prije završetka završetka(Rezultat, Dodatne opcije) Izvoz
Ako je rezultat = Dialogue Return Code. Da Onda
Potrebno je zatvoriti obrazac= Tačno ;
zatvori();
Inače
Potrebno je zatvoriti obrazac= Nedefinirano ;
EndIf ;
Kraj procedure

U proceduri obrasca Prije zatvaranja, korisniku se postavlja pitanje, zastavica Odbijanje je postavljena na Tačno, a zatvaranje obrasca se poništava.

Nakon potvrdnog odgovora na pitanje, varijabla Need toCloseForm se postavlja na True, a obrazac se ponovo zatvara.

Zadatak 3: Unos numeričke vrijednosti

Kada kliknete na dugme na obrascu za obradu, otvorite standardni dijalog za unos brojeva.

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

&OnClient
Procedura unosa brojeva (komanda)
Upozorenje = Novo DescriptionAlerts(“EnterNumberComplete”, ThisObject );
ShowEnterNumbers(Upozorenje, 0, “Unesite količinu”, 15, 3);
Kraj procedure
&OnClient
Procedura EnteringNumbersCompleting(Rezultat, Dodatne opcije) Izvoz

Poruka = ​​Novo Poruka korisniku;
Message.Text = “Uneli ste količinu” + Rezultat;
Message.Report();
EndIf ;
Kraj procedure

Nakon zatvaranja prozora za unos broja, biće pozvana procedura čiji će prvi parametar biti uneseni broj ili Nedefinirana vrijednost ako korisnik odbije ulazak.

Zadatak 4. Odabir boje

Kada kliknete na dugme na obrascu za obradu, koristeći standardni dijalog za odabir boje, korisnik određuje potrebnu boju. Postavite ovu boju za pozadinu dugmeta koje se pritisne.

Dodajte naredbu SelectColor u obrazac sa sljedećim rukovaocem:

&OnClient
Procedura Odabir boje (naredba)
Dijalog za odabir boje= Novo Dijalog za odabir boje;
Upozorenje = Novo DescriptionAlerts(“Odabir boje je završen”, ThisObject );
Dijalog za odabir boje. Prikaži (Upozorenje);
Kraj procedure
&OnClient
Procedura ChoiceColorsCompletion(Rezultat, Dodatne opcije) Izvoz
Ako NIJE Rezultat = Nedefinirano Onda
Elementi.Odabir boje.Boja pozadine= Rezultat ;
EndIf ;
Kraj procedure

Za objekte dijaloga za izbor boje (kao i dijalog za uređivanje standardnog perioda, konstruktor linije formata, dijalog redovnog rasporeda zadataka, dijalog za izbor fonta), metoda Show() otvara prozor za blokiranje.

Nakon zatvaranja prozora, biće pozvana procedura čiji će prvi parametar biti proslijeđena odabrana vrijednost (boja, font, itd.) ili vrijednost Undefined ako je korisnik odbio izbor.

Treba napomenuti da objekat FileSelectionDialog nema Show() metodu, za razliku od dijaloga za odabir boje ili fonta, budući da se implementacija ovih dijaloga značajno razlikuje.

Da biste koristili dijalog za odabir datoteke na web klijentu, prvo morate omogućiti ekstenziju datoteke.

Dijalozi implementirani preko ekstenzije datoteke ne stvaraju iste operativne probleme kao prozori modalnog pretraživača, tako da otvaranje blokirajućih prozora za FileSelectionDialog objekat nije implementirano.

U zaključku, napominjemo da je počevši od izdanja 8.3.10 podrška za modalne prozore ukinuta u web klijentu. U ovom slučaju, ako je modalna metoda pozvana u konfiguraciji, generira se izuzetak. Takođe, podrška za način rada interfejsa je ukinuta u web klijentu U odvojenim prozorima. Osim toga, iu tankom i web klijentu više nije moguće otvoriti obrazac u posebnom prozoru (kada radite u načinu sučelja Bookmarks). Ovakvi drastični koraci omogućili su da se napusti način rada interfejsa, koji više ne podržavaju svi moderni pretraživači.

Koji se praktični zaključak može izvući iz ovih informacija? A zaključak je prilično 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 grešci. Želio bih upozoriti da ne pokušavate "guglati" neko brzo rješenje za ovaj problem, jer... Većina savjeta se svodi na ovaj recept: u konfiguratoru na razini konfiguracije, postavite svojstvo “Modality use mode” na “Use”. Naravno, u ovom trenutku to neće raditi samo zato što sami moderni pretraživači više ne podržavaju modalne pozive.

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

  1. Ažurirajte platformu na izdanje 8.3.10+ (8.3.11), postavite svojstvo konfiguracije “Compatibility Mode” na “Do not use” i prepišite fragmente koda koji koriste modalne metode na asinhroni model poslovne logike
  2. Preporučite svojim klijentima da koriste starije pretraživače koji još uvijek 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 pretraživači Microsoft Internet Explorer verzije 8 i 9 više nisu podržani.

Bavili smo se web pretraživačima u svjetlu modaliteta, sada je vrijeme da razjasnimo situaciju sa drugim klijentima.

Počevši od verzije 8.3.5, svojstvo "Modality mode" u tankim i debelim klijentima se poštuje samo ako je specificirana opcija komandne linije /EnableCheckModal. Ovaj parametar se automatski ubacuje u komandnu liniju samo kada se aplikacija pokrene iz konfiguratora. Ako ovaj parametar nije naveden, tada se ne generiraju izuzeci i odgovarajuća upozorenja se ne prikazuju. One. u praksi, kada se koristi debeli i tanki klijent, ne primećuje se suštinska promena u radu kada se koristi modalni režim - modalni pozivi će raditi isto kao što su radili i ranije, bez ikakvih upozorenja, kao u web klijentu.

Da bismo stavili tačku na sva "i", napominjemo da se počevši od izdanja 8.3.9, svojstvo konfiguracije "Način korištenja sinhronih poziva proširenja platforme i vanjskih komponenti" zanemaruje u debelom klijentu, dok odgovarajuće sinhrone metode rade bez generiranja izuzeci i prikazivanje upozorenja. Navedeno zanemareno svojstvo dodano je u verziji 8.3.5 kako bi podržalo asinhroni rad s vanjskim komponentama, kriptografijom i ekstenzijama za rad s datotekama u web pretraživaču Google Chrome. Jasno je da to nema nikakve veze sa debelim klijentom, pa je stoga „tiho“ ignorisanje ovog svojstva jednostavno eliminisalo nepotrebne provere za korišćenje sinhronih metoda prilikom korišćenja konfiguracije.

Između ostalog! Zbog činjenice da platforma samouvjereno ide ka webu, sa verzijom 8.3.8 programeri su uveli određena ograničenja na programski kod koji je povezan sa 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 predmetu „Profesionalni razvoj interfejsa i obrazaca u 1C: Enterprise 8.3“ postoji poglavlje posvećeno napuštanju modaliteta, a na ovu temu možete izvući mnogo korisnih i relevantnih informacija.

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

U procesu razmatranja primera koji vam omogućavaju da pređete sa elemenata sinhronog modela na asinhroni, verovatno ste već primetili da u opštem slučaju postoji više programskog koda. Što više koda postoji, to se više povećava složenost njegovog daljeg održavanja i otklanjanja grešaka.

Osim toga, količina koda će se još više povećati ako koristimo više dijaloga tokom procesa razvoja. Stoga, u procesu razvoja aplikativnih rješenja usmjerenih na rad u web klijentu, morate zapamtiti radnu paradigmu koja se trenutno koristi u modernim web aplikacijama. Stoga, ako vaša konfiguracija ima puno interaktivnih dijaloga s korisnikom i upozorenja, onda ima smisla preispitati ovu funkcionalnost u korist nekih drugih pristupa organizaciji interakcije korisnika.

Umjesto zaključka

Naš ciklus „Prvi koraci u razvoju 1C“ je priveden kraju. Ako ga pročitate u cijelosti, onda ste najvjerovatnije već primijetili kako se platforma u posljednje vrijeme razvija naglo. Materijal u ovoj seriji je napisan relativno nedavno, ali smo bili primorani da ga ozbiljno ažuriramo, jer... Čak iu tako kratkom vremenskom periodu pojavilo se puno novih važnih funkcionalnosti i promjena. Takve velike promjene mogu biti donekle zbunjujuće za 1C programera ako svo ovo vrijeme nije rastao i profesionalno se razvijao s platformom.

Na specijalizovanim Internet 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 1C platforme. Mi, tradicionalno, preporučujemo da obratite pažnju na naše kurseve programiranja

Zašto se pojavljuje greška "Upotreba sinhronih metoda na klijentu je zabranjena"?

Ako naiđete na takvu grešku dok završavate lekcije, vrlo je lako to popraviti.

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

U prozoru koji se otvori, kliknite desnim tasterom miša na stavku "Konfiguracija" i izaberite "Svojstva" iz menija koji se otvori:

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

Pomaknite se do samog dna i tamo pronađite stavku "Modality mode":

Postavite njegovu vrijednost na "koristi":

Pažnja! Imajte na umu da ako koristite 1C platformu drugačiju od one koju smo preuzeli u prvoj lekciji (kasnija verzija), tada ćete imati i polje „Način za korištenje sinkronih poziva...“. Također ga treba postaviti na "Koristi".

Na kraju odaberite stavku menija "Konfiguracija" -> "Sačuvaj konfiguraciju":

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

Objašnjenja u nastavku - za one koje zanima šta smo uradili.

Omogućili smo modalitet u našoj konfiguraciji. Podrazumevano, ovaj režim je onemogućen i to nam ne dozvoljava da koristimo komande kao što su EnterNumber, EnterString, EnterDate, OpenValue.

Činjenica je da su ove naredbe modalne. Njihovo pozivanje rezultira pojavljivanjem prozora ispred korisnika (na primjer, za unos informacija), što 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 modalitet je prema zadanim postavkama isključen.