https://xn----1-bedvffifm4g.xn--p1ai/news/%D0%BE%D1%82%D0%BA%D0%B0%D0%B7-%D0%BE%D1%82-%D0%BC%D0%BE%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BE%D0%BA%D0%BE%D0%BD-%D0%B2-1%D1%81-8-3/
Primena U članku se razmatra asinhroni model izgradnje poslovne logike, dodan platformi „1C:Preduzeće“ izdanja 8.3. Prikazane informacije su aktuelne za trenutna izdanja platforme. Odustajanje od korišćenja modalnih prozora u platformi 1C:Preduzeće 8.3 Prilikom razvoja konfiguracije na platformi 1C:Preduzeće 8, povremeno nastaje potreba da se zaustavi rad programa do trenutka kada korisnik donese neku odluku ili izvrši određene radnje. Na primer, prilikom klika na dugme za popunjavanje tabelarnog dela, treba pitati korisnika da li treba očistiti tabelarni deo kako bi se sprečilo gubljenje prethodno unetih podataka. Takvo ponašanje može obezbediti sledeći kod: &NaKlijentu Procedura PopuniRobu(Komanda) Odgovor = Pitanje(„Tabelarni deo će biti očišćen. Nastaviti?“, RežimDijalogaPitanja.DaNe); Ako Odgovor = KodPovrataDijaloga.Da Tada //algoritam popunjavanja KonačnoAko; KonačnoProcedura Kao rezultat rada ovog dela koda doći će do zaustavljanja izvršavanja programskog koda, na ekranu se prikazuje pitanje, interfejs aplikacije osim dijalog sa pitanjem postaje nedostupan, sistem očekuje donošenje odluke od strane korisnika, izvršavanje koda će se nastaviti tek nakon odgovora na pitanje. Takođe, do zaustavljanja izvršavanja koda i blokiranja interfeisa dovodi otvaranje modalnih prozora putem poziva metode OtvoriModalno(). Prilikom rada sa konfiguracijom u režimu veb-klijenta kroz pregledač, u ovom slučaju bi se otvorio novi prozor – iskačući prozor, koji bi blokirao ne samo trenutnu karticu, već i ceo interfejs pregledača, uključujući i druge otvorene prozore i kartice. Iskačući prozori na internetu se često koriste za zlonamerno širenje neželjene reklame, stoga pregledači sadrže funkcije blokiranja iskačućih prozora. U tom slučaju, za rad sa konfiguracijama 1C:Preduzeće 8 kroz pregledač potrebno je onemogućiti blokiranje iskačućih prozora. Problemi se javljaju i prilikom rada na mobilnim uređajima. Tako, na primer, modalni prozori nisu podržani na iPad-u. Za rešavanje navedenih problema treba koristiti blokirajuće prozore umesto modalnih. Za korisnika vizuelno sve izgleda isto: prozor blokira interfejs veb-klijenta. Međutim, blokirajući prozor se kao da „crtá“ preko glavnog prozora, i blokira se samo trenutna kartica pregledača u kojoj je otvorena konfiguracija, omogućavajući prebacivanje na druge kartice, jer se modalni prozori pregledača pri tome ne koriste. Na taj način, iskačući prozori u pregledaču se ne otvaraju i obezbeđuje se rad kroz veb-klijent na mobilnim uređajima. Kod korenskog elementa konfiguracije postoji svojstvo „Režim korišćenja modalnosti“, koje određuje da li se u konfiguraciji mogu otvarati modalni prozori. Ako je izabran opcija „Koristi“, onda se modalni prozori mogu otvarati. Ako je izabran opcija „Ne koristi“, onda su modalni prozori nedozvoljeni. Prilikom pokušaja poziva metode koja otvara modalni prozor, sistem prikazuje poruku o grešci: Pri takvoj vrednosti svojstva „Režim korišćenja modalnosti“ dozvoljeni su samo blokirajući prozori. Ako je izabran opcija „Koristi sa upozorenjima“, onda se prilikom otvaranja modalnih prozora u prozor poruka ispisuje tekst: Takav način rada može se koristiti kao prelazni prilikom prepravljanja konfiguracije s ciljem odustajanja od korišćenja modalnih prozora. Glavna razlika između blokirajućih i modalnih prozora je u tome što otvaranje blokirajućeg prozora ne izaziva zaustavljanje izvršavanja koda. Zbog toga će programeri morati da prepišu programski kod koji koristi modalne prozore, uzimajući u obzir ovu osobinu. Kod treba podeliti na dva dela: otvaranje blokirajućeg prozora; obrada izbora korisnika. Deo koda naveden na početku članka treba prepisati na sledeći način: &NaKlijentu Procedura PopuniRobu(Komanda) Obaveštenje = Novi OpisObaveštenja(„PopuniRobuZavrsetakPitanja“, OvajObjekat); TekstPitanja = „Tabelarni deo će biti očišćen. Nastaviti?“; PrikažiPitanje(Obaveštenje, TekstPitanja, RežimDijalogaPitanja.DaNe); KonačnoProcedura &NaKlijentu Procedura PopuniRobuZavrsetakPitanja(Rezultat, DodatniParametri) Izvoz Ako Rezultat = KodPovrataDijaloga.Da Tada //algoritam popunjavanja KonačnoAko; KonačnoProcedura Nakon izvršenja procedure PrikažiPitanje(), sistem se ne zaustavlja čekajući odgovor korisnika, izvršavanje koda se nastavlja. Korisnik će moći da napravi izbor tek nakon završetka rada cele procedure. Pri tome će biti pozvana izvozna procedura PopuniRobuZavrsetakPitanja(). Njeno ime smo prosledili u konstruktor objekta OpisObaveštenja. Procedura koja će biti pozvana nakon izvršenja izbora može se nalaziti u modulu forme, modulu komande, opštem ne-globalnom modulu. U razmatranom primeru pozvana procedura se nalazi u modulu upravljane forme, stoga smo prosledili u parametar OvajObjekat. Razmotrimo poziv procedure koja se nalazi u opštem modulu. Za to ćemo dodati novi opšti modul ObradaObaveštenja, postaviti za njega zastavicu „Klijent (upravljena aplikacija)“, a oznaku „Globalni“ ne postavljamo. U ovom modulu ćemo locirati proceduru PopuniRobuZavrsetakPitanja(). Tada će obrađivač komande popunjavanja izgledati ovako: &NaKlijentu Procedura PopuniRobu(Komanda) Obaveštenje = Novi OpisObaveštenja(„PopuniRobuZavrsetakPitanja“, ObradaObaveštenja); TekstPitanja = „Tabelarni deo će biti očišćen. Nastaviti?“; PrikažiPitanje(Obaveštenje, TekstPitanja, RežimDijalogaPitanja.DaNe); KonačnoProcedura Nakon poziva bilo koje metode koja otvara blokirajući prozor, procedura treba da se završi, a kod koji se izvršava dalje treba locirati u proceduri koja će biti pozvana nakon zatvaranja prozora. Za prenos konteksta (pomoćnih podataka, nekih parametara, vrednosti promenljivih) iz procedure koja otvara modalni prozor u proceduru koja se poziva pri njegovom zatvaranju, predviđen je treći neobavezni parametar konstruktora objekta OpisObaveštenja – DodatniParametri. Ovaj objekat (bilo kog tipa) biće prosleđen u proceduru, opisanu u OpisObaveštenja, kao poslednji parametar. Na primeru razmatranog dela koda gore to se može uraditi ovako: &NaKlijentu Procedura PopuniRobu(Komanda) Parametar1 = 0; Parametar2 = 0; SpisakParametara = Novi Struktura(„Parametar1, Parametar2“, Parametar1, Parametar2); Obaveštenje = Novi OpisObaveštenja(„PopuniRobuZavrsetakPitanja“, OvajObjekat, SpisakParametara); PrikažiPitanje(Obaveštenje, „Tabelarni deo će biti očišćen. Nastaviti?“, RežimDijalogaPitanja.DaNe); KonačnoProcedura &NaKlijentu Procedura PopuniRobuZavrsetakPitanja(Rezultat, DodatniParametri) Izvoz Ako Rezultat = KodPovrataDijaloga.Da Tada //analiziramo DodatniParametri.Parametar1 //analiziramo DodatniParametri.Parametar2 KonačnoAko; KonačnoProcedura Ako treba proslediti samo jednu vrednost, onda se struktura može ne koristiti, već dodeliti tu vrednost parametru DodatniParametri konstruktora objekta OpisObaveštenja. Razmotrimo nekoliko primera rada sa blokirajućim prozorima. Zadatak 1. Otvaranje druge forme Iz forme dokumenta po kliku na dugme „Otvori parametre“ treba otvoriti formu na kojoj se nalaze dva čekboks-a Parametar1 i Parametar2, koje treba da podesi korisnik. Nakon zatvaranja forme ispisati u red poruka vrednosti parametara. Kreiramo opštu formu „FormaParametara“, na kojoj ćemo locirati atribute Parametar1 i Parametar2, kao i komandu ZatvoriFormu: Obrađivač komande izgleda na sledeći način: Obrađivač komande izgleda na sledeći način: &NaKlijentu Procedura ZatvoriFormu(Komanda) SpisakParametara = Novi Struktura(„Parametar1, Parametar2“, Parametar1, Parametar2); Zatvori(SpisakParametara); KonačnoProcedura Za formu svojstvo RežimOtvaranjaProzora postavljamo na „Blokiraj ceo interfejs“: Na formi dokumenta lociramo komandu OtvoriParametre, obrađivač koje opisujemo na sledeći način: &NaKlijentu Procedura OtvoriParametre(Komanda) Obaveštenje = Novi OpisObaveštenja(„OtvoriParametreZavrsetak“, OvajObjekat); OtvoriFormu(„OpstaForma.FormaParametara“, , , , , , Obaveštenje); KonačnoProcedura &NaKlijentu Procedura OtvoriParametreZavrsetak(Rezultat, DodatniParametri) Izvoz Ako TipVred(Rezultat) = Tip(„Struktura“) Tada Za svaki KljučVrednost Iz Rezultat Ciklus Poruka = Novi PorukaKorisniku; Poruka.Tekst = „Ključ: „”“ + KljučVrednost.Ključ + „”“, vrednost = ” + KljučVrednost.Vrednost; Poruka.Poruci(); KonačnoCiklus; KonačnoAko; KonačnoProcedura U korisničkom režimu, pokrećući konfiguraciju pod veb-klijentom, dobijamo sledeće rezultate rada: Za povećanje kliknite na sliku. Režim otvaranja prozora se takođe može navesti u poslednjem parametru procedure OtvoriFormu. &NaKlijentu Procedura OtvoriParametre(Komanda) Obaveštenje = Novi OpisObaveštenja(„OtvoriParametreZavrsetak“, OvajObjekat); OtvoriFormu(„OpstaForma.FormaParametara“, , , , , , Obaveštenje, RežimOtvaranjaProzoraForme.BlokirajCeoInterfejs); KonačnoProcedura Zadatak 2. Pitanje pri zatvaranju forme Pri zatvaranju prozora obrade postaviti korisniku pitanje da li zaista želi da zatvori prozor. Ovaj zadatak se može rešiti pomoću sledećeg koda, lociranog u modulu forme obrade: &NaKlijentu Promenljiva TrebaZatvoritiFormu; &NaKlijentu Procedura PreZatvaranja(Otkaz, StandardnaObrada) Ako NE TrebaZatvoritiFormu = Istina Tada Otkaz = Istina; Obaveštenje = Novi OpisObaveštenja(„PreZatvaranjaZavrsetak“, OvajObjekat); PrikažiPitanje(Obaveštenje, „Da li zaista želite da zatvorite prozor?“, RežimDijalogaPitanja.DaNe); KonačnoAko; KonačnoProcedura &NaKlijentu Procedura PreZatvaranjaZavrsetak(Rezultat, DodatniParametri) Izvoz Ako Rezultat = KodPovrataDijaloga.Da Tada TrebaZatvoritiFormu = Istina; Zatvori(); Inače TrebaZatvoritiFormu = Nedefinisano; KonačnoAko; KonačnoProcedura U proceduri PreZatvaranja forme korisniku se postavlja pitanje, zastavica Otkaz se postavlja na Istina, zatvaranje forme se otkazuje. Nakon potvrdnog odgovora na pitanje promenljiva TrebaZatvoritiFormu se postavlja na Istina, forma se ponovo zatvara. Zadatak 3. Unos numeričke vrednosti Prilikom klika na dugme na formi obrade otvoriti standardni dijalog unosa broja. Za to je potrebno koristiti metodu PrikažiUnosBroja() umesto UnesiBroj(), koja otvara blokirajući prozor umesto modalnog. &NaKlijentu Procedura UnosBroja(Komanda) Obaveštenje = Novi OpisObaveštenja(„UnosBrojaZavrsetak“, OvajObjekat); PrikažiUnosBroja(Obaveštenje, 0, „Unesite količinu“, 15, 3); KonačnoProcedura &NaKlijentu Procedura UnosBrojaZavrsetak(Rezultat, DodatniParametri) Izvoz Ako NE Rezultat = Nedefinisano Tada Poruka = Novi PorukaKorisniku; Poruka.Tekst = „Uneli ste količinu “ + Rezultat; Poruka.Poruci(); KonačnoAko; KonačnoProcedura Nakon zatvaranja prozora unosa broja biće pozvana procedura, u prvi parametar koje će biti prosleđen uneti broj ili vrednost Nedefinisano, ako se korisnik odrekao unosa. Zadatak 4. Izbor boje Prilikom klika na dugme na formi obrade pomoću standardnog dijalog izbora boje korisnik označava potrebnu boju. Tu boju postaviti za pozadinu pritisnutog dugmeta. Dodajmo na formu komandu IzborBoje sa sledećim obrađivačem: &NaKlijentu Procedura IzborBoje(Komanda) DijalogIzborBoje = Novi DijalogIzborBoje; Obaveštenje = Novi OpisObaveštenja(„IzborBojeZavrsetak“, OvajObjekat); DijalogIzborBoje.Prikaži(Obaveštenje); KonačnoProcedura &NaKlijentu Procedura IzborBojeZavrsetak(Rezultat, DodatniParametri) Izvoz Ako NE Rezultat = Nedefinisano Tada Elementi.IzborBoje.BojaPozadine = Rezultat; KonačnoAko; KonačnoProcedura Za objekte DijalogIzborBoje (kao i DijalogUređivanjaStandardnogPerioda, KonstruktorFormatnogNiza, DijalogRasporedaRežimskogZadatka, DijalogIzborFonta) metoda Prikaži() otvara blokirajući prozor. Nakon zatvaranja prozora biće pozvana procedura, u prvi parametar koje će biti prosleđena izabrana vrednost (boja, font itd.) ili vrednost Nedefinisano, ako se korisnik odrekao izbora. Treba obratiti pažnju da objekat DijalogIzborFajla nema metodu Prikaži() za razliku od dijaloga izbora boje ili fonta, jer je implementacija ovih dijaloga značajno različita. Za korišćenje dijaloga izbora fajla na veb-klijentu potrebno je prethodno povezati proširenje za rad sa fajlovima. Dijalozi, realizovani kroz proširenje za rad sa fajlovima, ne stvaraju takve probleme u radu kao modalni prozori pregledača, stoga nije realizovano otvaranje blokirajućih prozora za objekat DijalogIzborFajla. Na kraju ćemo napomenuti da počevši od izdanja 8.3.10 u veb-klijentu je prekinuta podrška modalnih prozora. U ovom slučaju, ako se u konfiguraciji vrši poziv modalne metode, dolazi do generisanja izuzetka. Takođe, u veb-klijentu je prekinuta podrška režima interfeisa „U odvojenim prozorima“. Osim toga, i u tankom i u veb-klijentu sada se ne može otvoriti forma u odvojenom prozoru (prilikom rada u režimu interfeisa „U karticama“). Takvi radikalni koraci omogućili su odustajanje od režima interfeisa koji više nije podržan od strane svih modernih pregledača. Koju praktičnu zaključak možemo izvući iz ove informacije? Zaključak je prilično jednostavan – ako iz nekog razloga u vašoj konfiguraciji i dalje postoje modalni pozivi, onda će se na tim mestima u veb-klijentu prikazivati prozor sa porukom o grešci. Želimo da upozorimo na pokušaje „pretraživanja“ nekog brzog rešenja ovog problema, jer se većina saveta svodi na ovaj recept: u konfiguratoru na nivou konfiguracije u svojstvu „Režim korišćenja modalnosti“ postaviti vrednost „Koristi“. Naravno, u ovom trenutku to neće raditi samo zbog toga što sami moderni pregledači više ne podržavaju modalne pozive. I vi imate samo dva puta kako da rešite gore opisani problem: Ažurirati platformu na izdanje 8.3.10+ (8.3.11), postaviti svojstvo konfiguracije „Režim kompatibilnosti“ na „Ne koristi“ i prepisati delove koda koji koriste modalne metode na asinhroni model izgradnje poslovne logike Preporučiti vašim klijentima da koriste zastarele pregledače, gde su modalni pozivi još uvek bili podržani (Mozilla Firefox verzije 37 i niže, Chrome ispod verzije 37 itd.). Usput, počevši od izdanja 8.3.11, više se ne podržavaju veb-pregledači Microsoft Internet Explorer verzija 8 i 9. Sa veb-pregledačima u svetlu modalnosti smo se pozabavili, sada je došlo vreme da razjasnimo situaciju i sa ostalim klijentima. Počevši od verzije 8.3.5 svojstvo „Režim korišćenja modalnosti“ u tankom i debelom klijentu se uzima u obzir, samo ako je naveden parametar komandne linije /EnableCheckModal. Ovaj parametar se automatski ubacuje u komandnu liniju samo prilikom pokretanja aplikacije iz konfiguratora. Ako ovaj parametar nije naveden, onda se generisanje izuzetaka ne dešava i odgovarajuća upozorenja se ne prikazuju. To jest, na praksi u slučaju korišćenja debelog i tankog klijenta nema nikakve radikalne promene u radu pri korišćenju režima modalnosti – modalni pozivi će raditi isto kao i ranije, pri tome ne dajući nikakva upozorenja, kao u veb-klijentu. Da bismo stavili tačku na „i“, napomenimo da počevši od izdanja 8.3.9 u debelom klijentu se ignoriše svojstvo konfiguracije „Režim korišćenja sinhronih poziva ekstenzija platforme i spoljnih komponenti“, pri čemu odgovarajuće sinhroni metode rade bez generisanja izuzetaka i ispisivanja upozorenja. Navedeno ignorisano svojstvo je dodato u izdanju 8.3.5 s ciljem podrške asinhronog rada sa spoljnim komponentama, kriptografijom i ekstenzijama za rad sa fajlovima u veb-pregledaču Google Chrome. Jasno je da to nema nikakve veze sa debelim klijentom, i stoga „tiho“ ignorisanje ovog svojstva jednostavno je isključilo višak provera korišćenja sinhronih metoda pri korišćenju konfiguracije. Usput! Zbog toga što platforma sigurno ide ka webu, sa verzije 8.3.8 programeri su uveli određena ograničenja na programski kod, koji je povezan sa logikom zatvaranja forme ili aplikacije, izvršavan u debelom i tankom klijentu. Obavezno pročitajte naš članak, koji detaljno osvetljava ovaj nijansu. Osim toga, u kursu „Profesionalna razvoj interfejsa i formi u 1C:Preduzeće 8.3“, postoji poglavlje posvećeno odustajanju od modalnosti, i možete saznati mnogo korisnih i aktuelnih informacija po ovoj temi. Kolege, postoje dve stvari koje se mogu čitati beskonačno: feed u VKontakte-u i spisak promena u sledećem izdanju platforme, stoga, hajde da izvučemo konačne zaključke ;) U procesu razmatranja primera koji omogućavaju prelazak sa elemenata sinhronog modela na asinhroni, verovatno ste već primetili da je u opštem slučaju programskog koda postalo više. Što je više koda, to se više povećava složenost njegovog budućeg održavanja i otklanjanja grešaka. Osim toga, količina koda će se još više povećati, ako ćemo u procesu razvoja koristiti veći broj dijaloga. Stoga, u procesu razvoja aplikativnih rešenja, orijentisanih na rad u veb-klijentu, treba imati na umu paradigmu rada koja se koristi u današnje vreme u modernim veb-aplikacijama. Stoga, ako u vašoj konfiguraciji ima mnogo interaktivnih dijaloga sa korisnikom, ispisivanja upozorenja, ima smisla preispitati tu funkcionalnost u korist nekih drugih pristupa u organizaciji interakcije sa korisnikom.
