Eroare: utilizarea ferestrelor modale în acest mod este interzisă. De ce apare eroarea „Utilizarea ferestrelor modale în acest mod este interzisă”? Soluția corectă a problemei

Implementat în versiunea 8.3.3.641.

1C:Enterprise folosește ferestre modale în situațiile în care utilizatorului i se cere să introducă informații, fără de care execuția ulterioară a algoritmului este imposibilă. În acest caz, întregul rest al interfeței programului este complet blocat, iar execuția codului programului se oprește până când utilizatorul închide fereastra modală.

Odată cu apariția clientului web și tranziția 1C:Enterprise la platformele mobile, ferestrele modale s-au dovedit a fi o sursă a unui număr mare de inconveniente și probleme, adesea insolubile.

De regulă, browserele „desktop”, mai bine sau mai rău, acceptă ferestre modale și le deschid într-o nouă fereastră de browser ca „fereastra pop-up”:

Dar datorită faptului că tehnologia ferestrelor pop-up este utilizată masiv pe Internet pentru publicitate, aproape toate browserele au ferestre pop-up dezactivate în mod implicit. În marea majoritate a cazurilor, fără modificarea acestei setări de browser, clientul web nu va funcționa.

O altă problemă este că browserele mobile nu acceptă deloc ferestrele modale. Și pentru ca 1C:Enterprise să poată funcționa în ele, a fost implementat un mecanism special în clientul web. Acesta este un mecanism destul de complex și, din păcate, nu acoperă toate situațiile necesare. Ca urmare, configurațiile pe iPad-uri, de exemplu, sunt greu de întreținut.

Într-o astfel de situație, opțiunea de a opera interfața 1C:Enterprise fără a utiliza ferestre modale elimină toate problemele enumerate mai sus.

În același timp, nu se renunță la funcționalitatea oferită anterior de ferestrele modale. Dar această funcționalitate este implementată de alte tehnologii care nu interferează cu funcționarea 1C:Enterprise în browsere.

În noul mod de operare al interfeței, fereastra, care anterior ar fi fost modală, este desenată în fereastra părinte și, în același mod, blochează restul interfeței client web:

Ca urmare:

  • nu sunt deschise ferestre noi de browser, ceea ce îmbunătățește performanța și stabilitatea clientului web;
  • în multe cazuri, setările suplimentare ale browserului devin inutile, deoarece 1C:Enterprise nu mai folosește ferestre pop-up;
  • orice configurație care utilizează clientul web poate funcționa pe iPad și alte dispozitive mobile.

Desigur, miracolele nu se întâmplă și un nou mod de operare nu poate fi activat „cu un val de baghetă magică”. Este necesară o schimbare a logicii de lucru cu ferestre noi, blocante. Dar vestea bună este că aceste modificări nu sunt dificile și este posibil să monitorizați toate locurile „suspecte” din program. Platforma implementează un mecanism special care vă permite să verificați în stadiul de dezvoltare că întreaga configurație utilizează mecanisme noi și va funcționa fără ferestre modale.

Necesitatea de a schimba logica de lucru cu astfel de ferestre se datorează faptului că noul mod de funcționare al interfeței oferă modalitate doar pentru utilizator. Cu toate acestea, pentru dezvoltator, execuția codului programului nu se oprește atunci când este afișată fereastra de blocare.

Aceasta înseamnă că algoritmul, care anterior era un întreg, va trebui acum împărțit în două părți. Unul, care se încheie cu deschiderea unei ferestre de blocare, iar al doilea, care va fi executat atunci când utilizatorul închide această fereastră. Pentru ca sistemul să știe unde să continue executarea codului programului, fereastra de blocare primește numele procedurii care ar trebui să fie executată atunci când utilizatorul închide această fereastră.

Esența acestor schimbări este cel mai ușor de văzut cu un exemplu. O procedură veche care deschidea o fereastră modală și procesa datele primite ar putea arăta astfel:

Într-o nouă versiune pentru formular FormTextInput (care se va deschide într-o fereastră de blocare) trebuie să setați proprietatea Modul de deschidere a ferestrei în sens BlockAllInterface . Aceasta va oferi utilizatorului o modalitate:

Și codul programului, în loc de o singură procedură, ca înainte, va conține două proceduri:

În prima procedură, deschideți formularul. În acest caz, în ultimul parametru îi trecem locația celei de-a doua proceduri, care va fi executată după ce utilizatorul închide fereastra. În acest caz, această procedură se află în același modul, dar în general poate fi localizată în altul.

Când utilizatorul introduce date și închide formularul, acesta va fi procesat în a doua procedură pe care am specificat-o, în care pur și simplu am transferat codul „vechi” care prelucrează datele primite.

Pe lângă formularele pe care dezvoltatorul le poate deschide în modul modal (la dorință), există metode de limbaj încorporate care întotdeauna, indiferent de dorința dezvoltatorului, deschid formulare modale pentru introducerea sau selectarea datelor. De exemplu, metoda EnterValue() .

Folosirea unor astfel de metode în modul fără model este și mai ușoară. Pentru toate astfel de metode, platforma are metode duplicate, la apelarea acestora trebuie să indicați și locația procedurii care va fi executată după ce utilizatorul închide fereastra.

De exemplu, mai jos este afișat folosind metoda veche EnterValue() și noua sa metodă de rezervă ShowInputValue() :

Trebuie spus că, pe lângă cazurile enumerate, unele mecanisme de platformă folosesc și ferestre modale pentru a interacționa cu utilizatorul. Și acest lucru nu mai depinde de acțiunile dezvoltatorului.

Prin urmare, toate astfel de dialoguri de sistem ale platformei au fost, de asemenea, transferate într-un mod de operare fără model.

Este planificată eliminarea treptată a utilizării ferestrelor modale în soluțiile de aplicație. Prin urmare, pentru compatibilitatea cu soluțiile de aplicație scrise mai devreme, platforma își păstrează capacitatea de a funcționa în versiunea veche a interfeței, folosind ferestre modale.

Dacă întâmpinați o astfel de eroare în timp ce finalizați lecțiile, este foarte ușor să o remediați.

Reveniți la configurator și selectați elementul de meniu „Configurare” -> „Deschideți configurația”:

În fereastra care se deschide, faceți clic dreapta pe elementul „Configurare” și selectați „Proprietăți” din meniul care se deschide:

Se va deschide o fereastră cu proprietăți de configurare (dreapta):

Derulați până în partea de jos și găsiți elementul „Modalitate” acolo:

Setează-i valoarea la "Utilizare":

Atenţie! Vă rugăm să rețineți că, dacă utilizați o platformă 1C diferită de cea pe care am descărcat-o în prima lecție (versiunea ulterioară), atunci veți avea și câmpul „Mod pentru utilizarea apelurilor sincrone...”. De asemenea, trebuie setat la „Utilizare”.

În cele din urmă, selectați elementul de meniu „Configurare” -> „Salvare configurație”:

Gata! Acum eroarea nu va mai apărea.

Explicații mai jos - pentru cei care sunt interesați de ceea ce am făcut.

Am activat modul modalitate în configurația noastră. În mod implicit, acest mod este dezactivat și acest lucru nu ne permite să folosim comenzi precum EnterNumber, EnterString, EnterDate, OpenValue.

Cert este că aceste comenzi sunt modale. Apelarea acestora duce la apariția unei ferestre în fața utilizatorului (de exemplu, pentru introducerea de informații), care blochează capacitatea de a lucra cu programul până când fereastra este închisă.

Și, deoarece prezența unor astfel de ferestre este extrem de nedorită atunci când lucrați cu 1C printr-un browser web, atunci când dezvoltați noi configurații, modul modality este dezactivat implicit.

Îl putem include în siguranță, deoarece scriem exemple educaționale care nu sunt concepute pentru a lucra pe Internet.

În versiunea 8.3 a platformei 1C, a apărut un nou mod de funcționare a programului - fără utilizarea modalității. Mai exact, au aparut 2 moduri noi: fara folosirea modalitatii si folosirea modalitatii, dar cu avertisment. Și vechiul mod de funcționare este indicat ca folosind modalitatea.

Ce înseamnă toate acestea?În versiunile timpurii ale platformei, am folosit diverse ferestre modale și nu ne-am gândit prea mult la asta. De exemplu, trebuie să afișați un avertisment pentru utilizator sau trebuie să puneți o întrebare sau să introduceți o valoare sau să selectați un fișier. Toate acestea sunt ferestre modale.

Ce înseamnă modal? Aceasta înseamnă că atunci când această fereastră este apelată, se suprapune pe toate celelalte ferestre, adică este afișată în partea de sus și blochează lucrul cu alte ferestre până la finalizarea lucrării cu această fereastră. Pe lângă blocarea ferestrelor, execuția codului se oprește exact în punctul în care această fereastră este apelată și execuția codului continuă numai după ce o astfel de fereastră este închisă. Din punctul în care s-a oprit execuția. Voi ilustra apelul la fereastra modală folosind exemplul de apelare a formularului de selecție a perioadei:

&OnClient

StandardProcessing = Fals;




Dacă Dialog.Edit() Atunci //Apelați forma modală. Executarea codului va continua numai după ce formularul este închis.
Elements.Services.CurrentData.StartDate = Dialog.Period.StartDate;
Elements.Services.CurrentData.EndDate = Dialogue.Period.EndDate;
endIf;

Sfârșitul procedurii


După cum putem vedea, o singură procedură este suficientă pentru a procesa apelul către fereastra modală de selecție a perioadei.

De ce sunt proaste ferestrele modale? Acum să ne dăm seama de ce 1C a decis să renunțe la utilizarea ferestrelor modale. Ei bine, în primul rând, aceasta este o consecință a faptului că platforma 1C poate fi folosită nu numai în forma sa obișnuită - ca aplicație desktop, ci poate fi lansată și într-un browser și poate fi lansată ca aplicație mobilă.

Problema cu browserele este următoarea. Modalitatea ferestrei din acestea este implementată folosind ferestre pop-up separate ale browserului. Sunt acceptate de aproape toate browserele, dar din cauza utilizării frecvente a unor astfel de ferestre pentru publicitate, aproape toți dezvoltatorii de browsere se luptă cu ele și dezactivează implicit utilizarea unor astfel de ferestre. Drept urmare, pentru a ne asigura că utilizatorul 1C poate lucra în browser, este necesar să-l forțezi să permită aceste ferestre, să-l dedice tuturor complexităților muncii 1C și browserelor și, în general, să-l supraîncărcăm cu elemente inutile. informație.

O nuanță separată cu browsere pentru tablete și browsere pentru telefoane. În cele mai multe cazuri, aceste browsere nu acceptă ferestre pop-up. Interfețele (monitoarele și dispozitivele de intrare) ale unor astfel de dispozitive cu ferestre pop-up nu sunt compatibile.

Și, în sfârșit, aplicația mobilă 1C nu este în totalitate prietenoasă cu ferestrele modale.

De aici concluzia: Nu utilizați ferestre modale. Ce ar trebui să folosesc în schimb? În schimb, trebuie să utilizați aceleași ferestre, dar fără modul modality. În noua platformă 1C, am dezvoltat și un astfel de mod pentru fiecare fereastră. Este implementat ca o metodă separată pentru fiecare dialog. Acest mod vă permite să deschideți o fereastră, dar nu să opriți execuția codului programului. Din punct de vedere tehnic, browserele implementează acest lucru ca o pseudo fereastră care apare în interiorul ferestrei părinte, dar se suprapune. Faptul că codul continuă să se execute după ce fereastra este deschisă înseamnă că nu veți putea primi imediat valorile selectate în el după codul pentru apelarea ferestrei. Încă nu au fost aleși. Prin urmare, obținerea și procesarea acestor valori se realizează într-o procedură separată, care este apelată la închiderea unei astfel de ferestre, iar această procedură este specificată la apelarea metodei de deschidere a ferestrei. Să ne uităm la aceeași fereastră de selecție a perioadei ca exemplu.

&OnClient
Service ProcedureStartDateStartSelection(Element, SelectionData, StandardProcessing)

StandardProcessing = Fals;

Dialog = NewEditingDialogStandardPeriod();
StandardPeriod = New StandardPeriod();

StartDate = Items.Services.CurrentData.StartDate;
EndDate = Items.Services.CurrentData.EndDate;

StandardPeriod.StartDate = StartDate;
StandardPeriod.EndDate = EndDate;
Dialog.Period = StandardPeriod;

Descriere alertă = Descriere nouă alertă(„Procesarea selecției perioadei”, ThisForm);

Dialog.Show(DescriptionAlerts)

Sfârșitul procedurii

&OnClient
ProcedurePeriodSelection Procesare(Perioada,Parametri) Export

Dacă Perioada<>Nedefinit Atunci

Elements.Services.CurrentData.StartDate = Period.StartDate;
Elements.Services.CurrentData.EndDate = Period.EndDate;

endIf;

Sfârșitul procedurii


După cum putem vedea, în loc de Edit(), este apelat Show(). Iar procesarea evenimentului de selecție este deja într-o altă procedură.

Deci, ne-am dat seama cum să ne descurcăm fără modalitate. Acum să ne dăm seama de ce avem nevoie de modul de utilizare a unei modalități cu avertisment. În esență, acesta este un regim de tranziție. Când nu ați reușit încă să vă convertiți întreaga configurație într-un mod fără a utiliza o modalitate, dar vă străduiți deja pentru aceasta. Și de fiecare dată când apelați o fereastră modală, programul vă va avertiza că nu este indicat să apelați ferestrele modale în acest mod.

Ei bine, să renunțăm la modalitatea și să stăpânim noile tehnologii pentru lucrul 1C în browsere și computere mobile.

În proprietățile de configurare de pe platforma 1C:Enterprise 8.3 există un Mod de utilizare a modalității. Dacă valoarea acestui câmp este „Nu utilizați”, atunci când încercați să deschideți o fereastră modală, platforma va afișa mesajul „Utilizarea ferestrelor modale în acest mod este interzisă”. În acest caz, execuția codului programului se oprește.

Acest articol arată mecanismul de modificare a codului programului, folosind exemplul unei întrebări adresate utilizatorului atunci când modul modal este dezactivat.

Din când în când, la dezvoltarea unui produs software, este nevoie să întrebați utilizatorul despre acțiunile efectuate. De exemplu, la completarea automată a părților tabelare. Când, înainte de a reumple PM, este necesar să întrebați utilizatorul despre necesitatea de a face acest lucru. Și în funcție de răspunsul lui, PM va fi șters și reumplut, sau nu.

Partea de întrebare a codului ar putea arăta cam așa:

Dacă PM. Cantitate()< >0 Apoi Răspuns = Întrebare(" // Această linie va afișa o fereastră modală cu o întrebare și execuția codului se va opri până când utilizatorul răspunde Dacă Răspuns = DialogReturnCode. Nu, apoi întoarce-te; EndIf ; // Utilizatorul este de acord să continue P.M. Clar() ; EndIf ; // Efectuați acțiuni suplimentare // Programul va merge aici dacă PM era gol sau utilizatorul a răspuns pozitiv la întrebarea despre reumplere Efectuați acțiuni suplimentare () ;

Când modul modal este dezactivat, va apărea o eroare în linia de întrebări a acestui cod și execuția ulterioară va fi întreruptă. Acest lucru se va întâmpla deoarece funcția Întrebare folosește o fereastră modală.

În această situație, trebuie să utilizați procedura ShowQuestion. Această procedură nu așteaptă finalizarea răspunsului utilizatorului. Dar primul parametru al acestei proceduri este descrierea alertei, care este folosită pentru a urmări răspunsul utilizatorului.

Cum se va schimba codul scris anterior:

// Este necesar să se completeze datele PM // Verificarea PM pentru plinătate Dacă PM. Cantitate()< >0 Atunci // PM nu este gol, trebuie să întrebați utilizatorul despre reumplere Afișați întrebarea(Descriere nouăAlerte(" Reîncărcați TCCompletion" , ThisObject, AdditionalParameters) , " PM va fi reumplut. Continua ?", Modul de dialog Întrebare. DaNu) ; // Această linie va afișa o fereastră de întrebare, dar executarea codului nu se va opri In caz contrar // Programul va merge aici dacă PM-ul era gol Efectuați acțiuni suplimentare() ; EndIf ; // Programul va ajunge aici în orice caz, indiferent dacă PM era gol sau nu // (cu excepția cazului în care, desigur, a existat o eroare în codul anterior) . . . // Procedura de export în același modul // Apelat după ce utilizatorul răspunde la întrebare& Pe Procedura Client Reîncărcarea TCCompletion (Rezultatul răspunsului, parametri suplimentari) Export dacă rezultatul răspunsului = Codul de returnare a dialogului. Nu atunci // Utilizatorul a refuzat să continueÎntoarcere ; EndIf ; // Efectuați acțiuni suplimentare // Programul va merge aici dacă PM nu era gol și utilizatorul a răspuns pozitiv la întrebarea despre reumplere P.M. Clar() ; Efectuați acțiuni suplimentare() ; Sfârșitul procedurii

Astfel, deoarece programul nu se va opri atunci când se execută procedura ShowQuestion, este necesar să se gestioneze cu atenție toate evenimentele
La rezolvarea acestei probleme, pot apărea acțiuni suplimentare atunci când au loc două evenimente:
1. Dacă PM era gol
2. Dacă PM nu era gol și utilizatorul a răspuns pozitiv la întrebare, completați din nou

Și, în consecință, deoarece programul nu încetează să aștepte răspunsul utilizatorului, apelarea acestor evenimente trebuie să fie distribuită în diferite părți ale codului.
Prin urmare, de regulă, toate metodele executabile care trebuie efectuate după verificarea completității PM sunt plasate într-o procedură separată.

Un mecanism similar este utilizat pentru funcții similare de interacțiune cu utilizatorul (SelectValue, SelectFromList etc.)

„Utilizarea ferestrelor modale în acest mod este interzisă” - această eroare începe acum să deranjeze utilizatorii și programatorii 1C odată cu apariția noii interfețe a platformei 1C 8.3 - „ „.

Dezvoltatorii platformei tehnologice 1C țin pasul cu vremurile, standardizându-și soluția la standardele internaționale de dezvoltare software. Toate standardele într-un fel sau altul se rezumă la o singură interfață, aproape de paginile web.

Ferestrele modale și pop-up sunt considerate în formă proastă și au încetat de mult să fie normale în dezvoltarea de software. Utilizatorii sunt obișnuiți să lucreze „într-o singură fereastră”.

În special, vedem adesea o eroare de modalitate în următoarele metode 1C:

  • Întrebare;
  • Avertizare;
  • OpenValue.

Odată cu lansarea noii interfețe „taxi”, dezvoltatorii platformei 1C 8 au luat decizia corectă - să încerce să recalifice dezvoltatorii de soluții de aplicații într-un mod nou. Au inclus o caracteristică în noua platformă - „modalitatea”.

Soluție rapidă

Dacă nu aveți timp să vă dați seama și trebuie să rezolvați rapid problema, vă oferim o soluție simplă, dar nu complet corectă. Pentru a remedia rapid eroarea, trebuie doar să schimbați modul de modalitate din proprietățile de configurare.

Pentru a face acest lucru, conectați-vă la sistem în modul, deschideți configurația:

Într-o configurație deschisă, apelați meniul contextual făcând clic dreapta pe rădăcina de configurare și selectând „Proprietăți”:

Obțineți 267 de lecții video pe 1C gratuit:

Se vor deschide proprietățile de configurare, unde în subsol se află proprietatea care ne interesează - „Modality use mode”, selectați modul „Use”:

După aceea, salvați și aplicați modificările apăsând tasta „F7”.

Soluția corectă a problemei

Modul corect de a rezolva această problemă este modificarea configurației sau procesării externe pentru a îndeplini noile cerințe.

Avertismentul, întrebarea, casetele de dialog și alte modalități trebuie să fie rescrise într-un mod nou.

Operatorii încorporați care au numit ferestre modale trebuie înlocuiți cu funcții duplicate.

De exemplu:

  • Avertisment - ShowWarning;
  • Întrebare - ShowQuestion (detalii - );
  • — ShowInputNumbers.

Totodată, a apărut un obiect specializat - Notification Description.

Exemplu de înlocuire:

String = "" ; EnterString(Șir, „Introduceți o valoare șir”) Notify("Ați introdus " + String) ;

Trebuie inlocuit cu:

String = "" ; DescriptionAlerts = DescriptionAlerts noi( „TestLineInput”, Acest formular) ; ShowLineInput(DescriptionAlerts, String, „Introduceți o valoare șir”) ;

În același timp, adăugați o procedură similară pe client care va funcționa atunci când valoarea este introdusă de utilizator:

&Pe Procedura Client TestInputString(ReceivedValue, PassedParameters) Export Notify("Ați introdus " + String) ; Sfârșitul procedurii

Formularele care sunt dezvoltate în cadrul configurației sunt deschise în același mod. Este suficient să înlocuiți metoda „OpenFormModal” cu „OpenForm”, specificând o descriere a alertei și noua procedură necesară pentru aceasta.

Pentru a bloca accesul la formularul apelat prin deschiderea unui formular, trebuie doar să specificați valoarea „Blocați fereastra proprietarului” în proprietatea „Mod de deschidere a ferestrei” a formularului: