1s 8.3 raportează starea mesajului. Mesaje către utilizator în formulare gestionate (din nou). Mesaj asociat cu un atribut de obiect

11.05.2020 Siguranță

Bună ziua.

Astăzi vom vorbi despre un lucru atât de simplu ca mesajele către utilizator.

ÎN 1C Metoda 8 a migrat de la 7.7 - " A raporta(...)". Această metodă este foarte simplă, deschide o fereastră de mesaj dacă nu este deschisă și adaugă acolo textul mesajului. Ca și în 1C 7.7, are un al doilea parametru care definește pictograma vizavi de mesaj. Această pictogramă determină importanța mesajului.

Pe măsură ce timpul a trecut, am primit forme controlabile în mâinile noastre. ÎN forme controlate nu există o singură fereastră de mesaj. Cu toate acestea, metoda este încă acceptată. În noua interfață, mesajele se lipesc de fereastra activă. Când trec la altă fereastră, mesajele dispar din vedere, dar când revin, apar din nou. În unele cazuri, acest lucru nu este convenabil, dar nu puteți face nimic în acest sens; un formular gestionat implică absența unei ferestre principale la care ar putea fi atașate mesajele.

Cu toate acestea, deoarece mesajul este asociat cu un formular specific, acest lucru permite autorilor platformei să extindă funcționalitatea unui mesaj simplu. Este posibil să fi văzut deja în configurațiile standard că mesajele sunt acum integrative, făcând clic pe un mesaj ne poziționează pe un anumit câmp, dublu clic poate deschide un alt element al bazei de date.

Faptul este că acum se obișnuiește să se folosească nu metoda contextului global „Report(...)”, ci obiectul „ Mesaj pentru utilizator". Acest obiect este disponibil peste tot, atât pe client, cât și pe server. Are mai multe proprietăți și câteva metode.

În general, dacă trebuie să oferi utilizatorului doar un mesaj, fără nicio interacțiune, atunci scrieți:



Message.Message();

Aceste trei linii sunt absolut identice cu metoda pe care o cunoaștem deja și, prin urmare, utilizarea acestui obiect pentru un astfel de mesaj este inutilă.

Principalele câmpuri care extind capacitățile mesajului sunt:

  • DataKey
  • Camp

Cheie de date- referinta la obiect baza de informatii, la care se referă acest mesaj sau tasta de intrare. Asa scrie in certificat. Dacă inserăm aici un link către un document sau o carte de referință, atunci făcând dublu clic se va deschide acest obiect, indiferent de forma în care a fost afișat mesajul. În consecință, dacă mesajul a ieșit sub forma unui document, iar cheia de date conține un link către acesta, atunci formă nouă nu se va deschide.

Prostii se pot întâmpla dacă emitem un mesaj sub forma unui obiect care nu a fost încă notat. În acest caz avem un link gol. Dar platforma nu este pierdută și pur și simplu nu deschide nimic, adică. Rămâni în forma în care ai fost.

Camp- aceasta este o linie cu numele câmpului care trebuie activat. Și nu contează dacă forma altui obiect se deschide sau dacă rămânem în forma curentă.

Iată un exemplu despre cum funcționează:

Să presupunem că, înainte de a scrie un element de director în modulul formular, verificăm unicitatea atributului „Id” și, dacă există deja, afișăm mesajul:


Dacă selectează.Next() Atunci
Refuza = Adevărat;
Mesaj = New MessageToUser;
Message.DataKey = Select.Link;
Message.Field = "id";
Message.Text = „O secțiune cu acest ID există deja”;
Message.Message();
endIf;

ÎN în acest exemplu De dublu click se va deschide un element de director cu același Id, iar câmpul Id va fi activ și va fi un indiciu în el:

Pare convenabil, atât putem schimba ID-ul noului element, cât și pe cel vechi, este ușor să intri în el făcând clic pe mesaj. Dar nu este activat câmpul din elementul curent, ceea ce, cu un număr mare de câmpuri, poate fi mai util decât deschiderea formei unui alt obiect. La urma urmei, un alt obiect a fost deja înregistrat și este utilizat, iar probabilitatea ca să existe o eroare în el este mică. Cel mai probabil trebuie să edităm elementul curent.

Pentru a face acest lucru, schimbați codul după cum urmează:

//dacă există duplicate, eșantionul va conține date
Dacă selectează.Next() Atunci
Refuza = Adevărat;
Mesaj = New MessageToUser;
Message.DataKey = Object.Link;
Message.Field = "id";
Message.Text = „O secțiune cu acest ID există deja”;
Message.Message();
endIf;

Singura diferență este că în DataKey trecem un link către elementul pe care îl avem deschis. Din păcate, acest cod nu funcționează: (Dublu clic se va deschide o fereastră modală.

Pentru ca acest lucru să funcționeze, există o nuanță pe care trebuie să completați „ PathToData". Nu pot explica exact de ce, trebuie doar să-mi amintesc asta. Deschide un alt obiect - calea datelor nu este nevoie, ne poziționăm în interiorul celui actual - avem nevoie de el. Concluzie - este mai bine să îl completați întotdeauna, nu puteți greși. Adăugați linia la cod:

Message.DataPath = „obiect”;

Și totul este frumos:

Mai este o nuanță despre care vreau să vorbesc. Dacă „câmpul” este lăsat gol, atunci poziționarea pe elementul de control nu va avea loc și nu va apărea un sfat cu instrumente în dreptul acestuia. Dacă „câmpul” este completat incorect, atunci poziționarea va avea loc pe formular în ansamblu și va apărea un tooltip, dar la sfârșitul formularului, fără referire la câmpul de intrare real.

Următoarea nuanță este că mesajul are o metodă - " SetData„. Pe baza obiectului, completează câmpurile DataKeyȘi PathToData. Este mult mai convenabil să faci totul într-o singură linie. De obicei, sub forma unui element/document, avem un obiect. Singurul lucru care trebuie scris pe server este următorul:

Message.SetData(FormAttributesValue(„Obiect”));

Dar în procedura predefinită a formei Înainte de a înregistra pe server de fapt există deja un parametru CurrentObject. Dar pe client nu vom primi deloc obiectul. Chiar și în modulul obiect (nu în formă) trebuie să scrieți acest lucru:

Message.SetData(ThisObject);

În concluzie, vreau să spun câteva lucruri urâte despre formularele gestionate. Acest lucru se aplică atât TAXI-urilor, cât și UV-urilor obișnuite. Faptul este că listele de interfețe sunt transferate foarte slab la UV. Un tabel care conține 1000 de rânduri este desenat foarte lent, iar într-un browser web poate dura câteva minute pentru a se deschide. Acest lucru este valabil și pentru lista de mesaje. Pentru un experiment, afișați 1000 de mesaje și încercați să comutați între ferestre. Sistemul va muri imediat. Mai mult decât atât, este clar vizibil modul în care sistemul se gândește la ieșirea mesajelor. Accesul la o fereastră cu o grămadă de mesaje arată astfel:

Conținutul ferestrei este afișat
-care pâlpâie puternic și apare bara de mesaje
-totul se blochează și vezi cum scroll-ul din fereastra de mesaj se strecoară în jos

Acestea. Ca și înainte, este imposibil să afișați un jurnal de procesare pe termen lung în panoul de mesaje, care conține câteva mii de înregistrări. Aș recomanda să vă limitați la 10 mesaje. Jurnalele trebuie să fie scoase pe o linie cu mai multe linii; aceasta este afișată aproape instantaneu, indiferent de numărul de linii. Desigur, dacă verificați caracterul complet al detaliilor părții tabelare, există 1000 de rânduri în ea și există o eroare în fiecare, atunci da, va trebui să așteptați :) Deși în acest caz vă puteți gândi la dvs. propriul mod de afișare a mesajelor, de exemplu într-un câmp de document HTML.

1C Mesaj pentru utilizator afișează un mesaj utilizatorului (după finalizarea procesării) sau îl salvează într-o coadă dacă mesajul nu poate fi afișat „în acest moment”, de exemplu:
Mesaj = New MessageToUser();
Message.Text = „Bună, lume!”;
Message.Message();

În multe cazuri, mesajele sunt generate în vrac în timpul anumitor procesări. De exemplu, atunci când verificați un tabel mare, multe mesaje de eroare pot apărea în diferite rânduri ale tabelului. Sau la procesarea unei tranzacții. În acest caz, procesarea poate fi efectuată pe server sau în sarcina de reglementareși este dificil să afișați aceste mesaje.

1C Mesaj pentru utilizator scrie mesaje în coada „unei” și, după finalizarea procesării, le afișează utilizatorului, dacă este posibil. În caz contrar, întreaga listă de mesaje poate fi obținută folosind metoda GetMessagesToUser().

Pentru a afișa un mesaj utilizatorului folosind 1C Message to User într-o formă specifică, deja deschisă, mai trebuie să setați identificatorul formularului:
Message.DestinationIdentifier = Form.UniqueIdentifier;

Pentru ca mesajul 1C Mesaj către utilizator să fie afișat într-o fereastră pop-up lângă un câmp specific al formularului în care este executat codul în modul, trebuie să specificați „calea” către acesta:
Message.Field = „Nume”; //unde Nume este un atribut al formularului
Message.Field = "Object.Name"; //unde Nume este atributul obiectului (adică directorul a cărui formă este editată)
Message.Field = „Produse.Preț”; //unde Produse este partea tabelară a formularului, Prețul este coloana acestei părți tabelare

Pentru a face același lucru, dar într-un modul al altui obiect (modul general), trebuie să specificați suplimentar obiectul (DirectoryObject, DocumentObject etc.):
Message.Field = „Nume”; //unde Nume este atributul DirectoryObject
Message.SetData(DirectoryObject);
//Când dați dublu clic pe un mesaj, formularul obiect se va deschide cu un mesaj pop-up pentru câmpul necesar

O altă modalitate de a asocia un mesaj 1C unui mesaj utilizator cu datele obiectului:
//pentru o carte de referință, document..
Message.DataKey = DirectoryLink;
Message.DataPath = „Obiect”;

//pentru înregistrări
Message.DataKey = RegisterRecordManager.InitialRecordKey; //de obicei, principalul atribut al formei asociat registrului
Message.DataPath = „Înregistrare”;

În configurațiile tipice ale formularelor gestionate pentru un client subțire, de exemplu, „Trade Management, Edition 11” și „Accounting, Edition 3”, modulul General PurposeClientServer conține funcția NotifyUser(), care „universalizează” lucrul cu acest obiect . Sintaxa funcțiilor în diferite configurații este diferită.

Deoarece 1C Message to User generează o listă de mesaje, pentru a o reseta (de exemplu, înainte de a efectua o procesare complexă), puteți apela funcția:
GetMessagesUser(True);

Articolul continuă seria articolelor „Primii pași în dezvoltare pe 1C”.

În acesta vom analiza metodele de informare a utilizatorului care sunt prezente în platforma 1C:Enterprise 8 și, de asemenea, vă vom concentra atenția asupra unor caracteristici ale funcționării acestor mecanisme; aceste caracteristici sunt legate de modul de utilizare a modalității. .

Aplicabilitate

Articolul discută funcționalitatea:

  • Interfață în versiunea „Versiunea 8.2” pentru configurația dezvoltată pe platforma 1C:Enterprise 8.2.19.130
  • Interfață taxi pentru configurație dezvoltată pe platforma 1C:Enterprise 8.3.4.496 până la 8.3.9+
  • Interfață taxi pentru o configurație dezvoltată pe platforma 1C:Enterprise 8.3.10-8.3.11

Cum să afișați un mesaj utilizatorului în 1C

Afișarea mesajelor în modul utilizator rezolvă o serie de probleme:

  • reflectarea progresului procesului curent (afișarea stadiului de execuție a procesului; afișarea valorilor calculate obținute în timpul funcționării algoritmului);
  • afișarea erorilor către utilizator pentru o eventuală corectare;
  • emiterea de recomandări;

Tipuri de mesaje:

  • Terminatori, care opresc execuția programului și nu îi permit să continue până când utilizatorul citește acest mesaj și efectuează anumite acțiuni. De exemplu, utilizatorului i se va prezenta o întrebare pe ecran la care va trebui să se răspundă Da sau Nu. Până când utilizatorul răspunde, programul nu se execută actiunile urmatoare;
  • mesaje introductive care sunt pur și simplu afișate utilizatorului și permit lucrări ulterioare (adică, utilizate în modul de alertă).

Mesajele de terminare ar trebui să fie mesaje de eroare și mesaje introductive: recomandări, mesaje despre stadiul curent al procesului și afișarea valorilor calculate (printare de depanare).

Mesajele introductive au scopul de a oferi utilizatorului anumite informații.

Este necesar ca utilizatorul să se familiarizeze cu acesta și, eventual, să întreprindă unele acțiuni care sunt descrise în acest mesaj.

Este foarte important ca utilizatorul să citească efectiv aceste mesaje, așa că acestea ar trebui să conțină doar informații importante.

Mesajele de testare și depanare nu ar trebui să fie emise utilizatorului, deoarece mai devreme sau mai târziu va începe să ignore absolut toate mesajele.

În conceptul de interfață gestionată, abordarea emiterii unui mesaj s-a schimbat oarecum. Acum este legat de forma în care a apărut. Nu mai poate fi închis, astfel încât textul să fie complet invizibil.

Nu puteți anula fixarea unei casete de mesaj dintr-un formular.

Sintaxa funcției:

A raporta (<Текст сообщения>, <Статус>)

Acestea. primul parametru este textul în sine.

Al doilea parametru (starea mesajului) este opțional. Puteți specifica valori pentru starea: Normal, Important, Foarte important etc.

Din valoare dată depinde de ce pictogramă va fi amplasată lângă mesaj. Cu toate acestea, acest lucru funcționează numai în interfața normală.

În conceptul de interfață gestionată, pictograma este întotdeauna un semn de exclamare și nu poate fi suprascrisă.

Faptul este că dacă un mesaj este generat în momentul scrierii unui element de director, poate apărea următoarea situație.

Utilizatorul face clic pe un buton Salveaza si inchide, in acest caz mesajul este afisat in fereastra corespunzatoare (in dreapta formularului).

Dar formularul se închide instantaneu, iar utilizatorul nu va vedea că a fost afișată nicio informație pentru el.

Prin urmare, în conceptul de aplicație gestionată, se recomandă afișarea mesajelor introductive folosind așa-numitele alerte. Un exemplu de utilizare incorectă a unei funcții A raporta prezentate în figură.

Cu toate acestea, funcția A raporta poate fi folosit pentru a afișa informații despre anumite erori, de exemplu, la momentul postării documentului.

În acest caz, sistemul poate fi informat că formularul nu trebuie să fie închis și să arate utilizatorului ce erori apar la postarea documentului.

Funcţie A raporta pe deplin suportat în Platforma 8.3. Poate fi folosit și va funcționa (atât în ​​versiunea de fișier, cât și în versiunea client-server).

Dar trebuie remarcat și faptul că funcția A raporta Există o dezvoltare ulterioară - aceasta este o clasă de mesaje pentru utilizator, care permite, pe lângă afișarea unui mesaj, să-l lege contextual la orice elemente de formular.

De exemplu, un mesaj de eroare poate fi legat de un element de formular, ceea ce este foarte clar pentru utilizator. Vom reveni să luăm în considerare această problemă puțin mai târziu. Funcţie A raporta există o caracteristică interesantă.

Astfel, codul programului din Platforma 8.3 poate fi executat atât pe partea Client, cât și pe partea Server.

În acest caz, codul programului client este responsabil pentru interacțiunea cu utilizatorul, adică. Pe partea clientului, se deschid formulare și sunt afișate rapoarte.

Diverse documente de dialog sunt, de asemenea, afișate numai pe client. Ele nu pot fi executate pe server deoarece serverul nu are capacitatea de a interacționa cu utilizatorii.

Dar funcția A raporta poate fi executat atât pe partea Client cât și pe partea Server. În acest caz, utilizarea metodei A raporta pe Server nu înseamnă deloc că mesajul va fi afișat pe Server, pur și simplu nu există unde să le afișeze.

Aceasta înseamnă că dacă afișăm un mesaj în procedura serverului folosind această metodă, ele se vor acumula într-un buffer și vor fi afișate pe ecran doar când procedura serverului se încheie și revine la Client.

În acest moment, sistemul va solicita date din buffer și le va afișa pe ecran.

Aceeași caracteristică se aplică clasei Mesaj pentru utilizator. Figura prezintă un exemplu de utilizare a metodei A raporta pe partea Server.

Ca urmare a utilizării metodei A raporta pe partea Server, mesajele au fost afișate pe ecran pe partea Client.

Este necesar un mecanism de alertă pentru a informa utilizatorul că „ceva” s-a întâmplat în sistem și că „ceva” necesită atenția utilizatorului. Alertele sunt generate de două scenarii:

  1. Prin platforma în sine atunci când înregistrați sau schimbați interactiv un obiect
  2. De către dezvoltator atunci când apelează o metodă din cod .

Notificarea în sine este o fereastră mică care apare, de regulă, în colțul din dreapta jos și informează despre acțiunea finalizată. În câteva secunde, se estompează treptat și dispare. În același timp, dacă treci cu cursorul mouse-ului peste notificare, aceasta nu dispare și o poți citi cu atenție.

În plus, alertele pot fi accesate în zona corespunzătoare a panoului de informații (butonul „Istoric” din partea stângă jos a formularului de cerere în opțiunea de interfață „Versiunea 8.2”).

Pentru a vă crea propriile alerte, trebuie să utilizați metoda contextului global ShowUserAlert(). Sintaxa sa înainte de versiunea 8.3.10 este prezentată mai jos:

Afișați alertă utilizator (<Текст>, <НавигационнаяССылка>, <Пояснение>, <Картинка>)

Primul parametru conține textul care va fi afișat în notificare.

Apoi, ca al doilea parametru, puteți trece un anumit link de navigare către orice element al bazei de informații (elementul care corespunde textului mesajului nostru). Când un utilizator face clic pe o alertă, linkul va fi urmat.

Folosind al treilea parametru, puteți transmite o explicație pentru mesaj, de exemplu. o descriere extinsă.

De asemenea, puteți aloca o imagine care afișează starea notificării.

Trebuie remarcat faptul că toți acești parametri sunt opționali. Mai jos este un exemplu de utilizare aceasta metoda(în configurator și în modul utilizator în opțiunea de interfață „Versiunea 8.2”).

În versiunea platformei 8.3.10.216 pentru interfața „Taxi”, mecanismul de notificare a fost îmbunătățit semnificativ pentru a îmbunătăți gradul de utilizare atât a clientului subțire, cât și a clientului web. Din acest motiv, s-au modificat și parametrii trecuți metodei ShowUserAlert(). Acum sintaxa arată astfel:

ShowUserAlert(<Текст>, <ДействиеПриНажатии>, <Пояснение>, <Картинка>, <СтатусОповещенияПользователя>, <КлючУникальности>)

Se poate observa că al doilea parametru, numit anterior Legătură de navigație, a primit un nume nou ActionWhenClicked. Acest lucru se datorează faptului că acum este posibil să trimiteți nu numai un șir cu un link de navigare, ci și o descriere a alertei. Acest lucru este ilustrat în captura de ecran de mai jos:

După cum se poate vedea din exemplu, acum avem capacitatea de a procesa programatic un clic pe o fereastră de notificare, conform logicii necesare.

Următorul parametru Stare alertă utilizator a aparut pentru prima data. Indică starea alertei (Informații sau Important).

În cazul opțiunii Important, dacă utilizatorul nu a răspuns la mesaj, atunci după ce acesta este ascuns de pe ecran, acesta poate fi citit prin Centrul de notificare (mai multe despre el mai jos). În cazul opțiunii Informații, notificarea este ștearsă fără a fi stocată în acest centru. Să rescriem codul din exemplul nostru, după cum urmează:

După executarea comenzii, obținem aproximativ această vedere a ferestrei aplicației:

Un buton cu o pictogramă clopoțel a apărut în bara de instrumente, care apelează Centrul de notificare menționat mai sus. Acumulează noi alerte importante la care utilizatorul nu a răspuns încă.

Dacă există alerte în Centru, lângă el apare un mic punct portocaliu pentru a atrage atenția utilizatorului. Utilizatorul poate deschide Centrul de notificare, poate citi textul și, dacă este necesar, poate întreprinde unele acțiuni.

Din Centru, alerta este ștearsă făcând clic pe butonul de ștergere, dar dacă există o acțiune asociată cu alerta, atunci de îndată ce utilizatorul face clic pe textul mesajului, acesta va dispărea și el.

Și, în sfârșit, ultimul parametru adăugat a fost Cheia unicității. Îl puteți folosi pentru a găsi alerta afișată pe ecran și pentru a o modifica. Dacă nu există nicio alertă cu acest parametru, va fi afișată o nouă alertă.

După cum puteți vedea, posibilitățile oferite de metoda corespunzătoare au devenit și mai mari! Dar acestea nu sunt toate modificările în mecanismul de notificare.

După cum probabil ați observat deja, lor aspect. Alertele arată acum mai moderne și mai ergonomice, dar nu pot fi mutate pe ecran sau redimensionate. Vă rugăm să rețineți că, în exemplul nostru, textul de notificare pur și simplu nu s-a încadrat în întregime în fereastra în sine, iar utilizatorul îl va putea citi în întregime doar prin deschiderea Centrului de notificări. Prin urmare, nu ar trebui să scrieți o cantitate mare de text în textul de notificare.

Noile funcții includ și afișarea simultană a până la trei alerte pe ecran.

Aceasta încheie cunoștințele noastre cu generarea software-ului de alerte. Totuși, rețineți că alertele sunt generate nu numai de dezvoltator în mod programatic, ci și de platforma însăși în momentul înregistrării interactive sau al schimbării unui obiect. Și adesea acest fapt provoacă neînțelegeri în primul rând în rândul utilizatorilor începători: de ce sunt necesare aceste alerte de serviciu, care, apropo, nu pot fi dezactivate?

Să ne imaginăm asta situatie simpla: Utilizatorul a setat un filtru într-o listă pentru comoditate. Să presupunem că a făcut asta sub forma unei liste în directorul Nomenclatură. Apoi, după ceva timp, am decis să vă prezint element nou cu numele „Scaun”, care nu se potrivește cu filtrul instalat anterior. Intră în el, îl notează și...? Și nu o vede pe listă. Ce va face utilizatorul mediu? Desigur, va intra în el a doua oară, dar nu o va mai vedea. Aceasta poate fi urmată de a treia, a patra, a cincea oară. Când se sătura să intre în același lucru iar și iar, te va întreba în sfârșit: unde se duce totul?

Tocmai de aceea platforma afișează aceste alerte de service, informând utilizatorul că acțiunea sa a fost finalizată. În exemplul nostru, în momentul înregistrării interactive, utilizatorul va vedea următoarea notificare:

Mesaje de terminare

Mesajele de terminare sunt acele mesaje care nu vor permite lucrul până când utilizatorul efectuează anumite acțiuni, de ex. până când procesează mesajul.

Despre posibilitatea utilizării mesajelor de terminare în Platforma 8.3 vom vorbi puțin mai târziu (în ultimul timp au încercat să nu le folosească, așa că exemplul luat în considerare este mai relevant pentru Platforma 8.2).

Există două metode de emitere a mesajelor de terminare AvertizareȘi Întrebare. Avertizare difera de Întrebare deoarece are un singur buton Bine.

O întrebare poate specifica seturi diferite de opțiuni de răspuns ( Nu chiar, DaNuAnulează, Bine, OKAnulează, RepetAnulare, AbortRepeatSkip), care sunt specificate cu ajutorul parametrului.

Să afișăm niște avertismente folosind linia (de exemplu, într-un modul de aplicație gestionată):

Avertisment(„Baza va fi acum deschisă”);

Pentru a deschide un modul de aplicație gestionat, selectați obiectul din arborele de configurare Configurare, apel meniul contextualși selectați elementul Deschideți un modul de aplicație gestionat.

În acest caz, la lansarea aplicației, va fi afișată o fereastră care este modală. O fereastră modală se suprapune pe toate ferestrele care există în aplicație. Până când procesăm această fereastră, nu sunt posibile alte acțiuni.

Funcția funcționează într-un mod similar Întrebare.

Sintaxă:
Întrebare(<ТекстВопроса>,<Кнопки>,<Таймаут>,<КнопкаПоУмолчанию>,<Заголовок>,
<КнопкаТаймаута>);

Sunt necesari doar primii doi parametri. Pentru al doilea parametru, tipul de date este compus ( Modul de dialog Întrebare sau ListValues). Al treilea parametru ( <Таймаут> ) caracterizează intervalul de timp în secunde în care sistemul va aștepta răspunsul utilizatorului.

Când intervalul expiră, fereastra de întrebări va fi închisă. Parametru similar( <Таймаут> ) este disponibil și pentru această funcție Avertizare.

Ca exemplu de utilizare a funcției Întrebare Puteți utiliza următorul cod, scris într-un modul de aplicație gestionat:

Vă rugăm să rețineți că aceste metode ( AvertizareȘi Întrebare) nu sunt disponibile pe server. Și acest lucru este logic, deoarece metodele de interfață nu pot fi executate pe un Server unde nu există utilizator.

Caracteristici de utilizare ferestre modaleîn Platforma 8.3

În platforma 8.3, există moduri de operare cu și fără modalitate. Setarea implicită este Nu utilizați modul modality.

În acest caz, utilizarea mesajelor de reziliere este imposibilă. Dacă este necesar să folosiți mesaje de terminare (funcții AvertizareȘi Întrebare) ar trebui să modificați valoarea proprietății de configurare pe Utilizare.

Fereastra modală este afișată în partea de sus și blocurile funcționează cu alte ferestre până când acțiunile cu fereastra modală sunt finalizate. În plus, execuția codului programului se oprește în punctul în care este apelată această fereastră. Execuția codului va continua numai după ce fereastra modală este închisă.

În primul rând, apar probleme cu utilizarea ferestrelor modale pentru aplicatie de mobil. În al doilea rând, în browser, modalitatea ferestrelor este implementată folosind ferestre pop-up separate.

Ferestrele pop-up sunt adesea dezactivate prin setările implicite ale browserului. Utilizatorul trebuie să fie forțat să seteze permisiunea pentru aceste ferestre.

Browsere pentru tablete iar pentru telefoane în majoritatea cazurilor nu acceptă deloc ferestre pop-up.

Pentru a înlocui funcțiile ÎntrebareȘi Avertizare au fost dezvoltate noi metode: Afișează întrebarea, ShowWarning.

Aceste metode vă permit să apelați o fereastră, dar nu opresc execuția codului programului. Din punct de vedere tehnic, acest lucru se realizează prin formarea unei pseudo-fereastră în interiorul ferestrei părinte. Pseudo-fereastra nu se suprapune cu fereastra părinte. După deschiderea unei astfel de ferestre, codul continuă să se execute.

Primirea și procesarea valorilor introduse de utilizator se efectuează într-o procedură separată, care este numită atunci când caseta de dialog este închisă.

Sintaxa funcției ShowWarning:

Afișează avertisment(<ОписаниеОповещенияОЗавершении>, <ТекстПредупреждения>, <Таймаут>, <Заголовок>)

Parametru <ОписаниеОповещенияОЗавершении> (optional)

Tip de date: DescriereAlerte.

Conține o descriere a procedurii care va fi apelată după închiderea ferestrei de avertizare.

Sintaxa funcției Afișează întrebarea:

Afișează întrebarea(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)

Primii trei parametri sunt necesari.

Mai jos este un exemplu de utilizare a funcției.

Clasa MessageToUser

Comoditatea de bază a clasei de mesaje Mesaj pentru utilizator este că acesta este un mesaj contextual (spre deosebire de metode AvertizareȘi Întrebare).

Mesajele pot fi legate de un anumit element de ecran. Acest obiect este disponibil și pe Server.

Vă rugăm să rețineți că, în primul rând, acest obiect trebuie creat. De exemplu: Mesaj = New MessageToUser;

Astfel creăm o instanță a acestui obiect.

În al doilea rând, trebuie să specificați textul mesajului într-o proprietate separată.

În al treilea rând, în proprietate Camp Puteți specifica la ce element de formular trebuie atașat acest mesaj.

Atenţie! Pentru a vă lega la câmpul de formular dorit, acordați atenție inițializării proprietăților PathToDataȘi DataKey. Pentru un document, atunci când plasați cod într-un modul obiect, puteți scrie:

Message.DataPath = „Obiect”;
Message.DataKey = ThisObject.Link;

Pentru a deschide modulul document, în fereastra de editare a obiectului (documentului), accesați fila Alte apasa butonul Modul obiect.

Pentru experiment, vom plasa codul în modulul obiect al unui document.

Mai jos este rezultatul obținut în modul utilizator pentru Platforma 8.3.

Trebuie remarcat faptul că mesajele ies folosind noul obiect de sistem Mesaj pentru utilizatorîn cazul general nu încetează. Acestea. sistemul va permite utilizatorului să continue alte acțiuni fără a răspunde la mesajele afișate.

Dar, în primul rând, aceste mesaje sunt destul de vizibile. În al doilea rând, mesajele sunt de obicei afișate utilizatorului în momentul înregistrării elementelor directoarelor sau al procesării documentelor, adică atunci când se efectuează unele verificări. Și dacă au fost detectate erori, utilizatorul va vedea aceleași mesaje.

În consecință, atunci când sunt detectate erori, tranzacția este anulată, adică. scrierea unui element de director este interzisă sau postarea unui document este interzisă.

Astfel, apare un fel de emulare a mesajului de terminare. Deoarece acțiunea este anulată până când utilizatorul reacționează la mesajul introdus, va fi imposibil să finalizați acțiunea, de exemplu, postarea unui document.

Dar, pe de altă parte, este posibil să închideți documentul fără a-l conduce, fără a reacționa în vreun fel la mesaj. Prin urmare, aceste mesaje către utilizator nu se încheie.

Notificarea de stare proces

Există o funcție specială cu care puteți afișa progresul aproximativ al unui proces.

Sintaxă: Stat(<ТекстСообщения>, <Прогресс>, <Пояснение>, <Картинка>)
Opțiuni:<ТекстСообщения>Și<Пояснение>– optional, tip – Linia.
Textul este afișat pe o bară de stare specială.
<Прогресс>Parametrul este și el opțional, dar vizual.
Tip: Număr. Valoarea indicatorului de progres (de la 1 la 100).
<Картинка>de asemenea, un parametru opțional.
La procesarea oricărui eveniment, apelurile periodice ale unei funcții precum:

În acest caz, etichetele se pot schimba, iar valorile parametrului Progress se pot modifica.

O funcție poate fi apelată dintr-o procedură (funcție) sau din mai multe. În acest fel, puteți urmări starea de execuție a procesului.

Dacă doriți să aruncați o privire mai atentă asupra mecanismului de notificare, opriți-vă chiar acum și citiți noul nostru articol, Afișarea progresului operațiunilor de lungă durată în 8.3.10. Nu mai explică la nivel de începător toate subtilitățile și roci subacvatice funcționarea acestui mecanism.

Terminăm introducerea noastră cu privire la modalitățile de informare a utilizatorului. Sperăm că ați înțeles în ce situații ar trebui folosită una sau alta metodă.

Aș dori să vă atrag încă o dată atenția asupra faptului că, dacă configurația dvs. (versiunea 8.3.3+) implică lucrul cu un client web, atunci:

  • la nivelul de configurare, setarea modului modalității trebuie să fie setată la „Nu utilizați”
  • Codul trebuie să utilizeze metode ale modelului de interacțiune cu utilizatorul asincron. Astfel de metode încep cu cuvintele Spectacol sau ÎNCEPE.

Puteți citi mai multe despre refuzul de a utiliza ferestrele modale în platforma 1C:Enterprise 8.3 în articolul final al seriei. Și trecem mai departe și, în sfârșit, începem să studiem mult așteptata interfață Taxi, care a fost deja menționată de mai multe ori în materialele noastre.

În timpul lecției: am creat o bază, am creat procesare, am creat un formular.

Acum vă vom spune 5 metode de mesaje de la 1C „Bună, lume!”

Nu toată lumea știe despre cel puțin două metode :)

Cum și unde să scrieți textul programului?

Treceți la fila ferestrei cu formularul „Modul”. Vă veți asigura că aveți deja un text acolo ("Procedură...").

Dacă nu există text, atunci:

  • În clientul gros ați adăugat formularul la procesare incorect, repetați de la început
  • ÎN client slab Ați uitat să adăugați un buton, încercați din nou de la început.

În interiorul textului există o linie:

// Introduceți conținutul handler-ului

Sarcina ta este să ștergi această linie și să introduci textul programului în locul său. După aceea, salvați procesarea și deschideți-o în modul întreprindere.

Când faceți clic pe Execute, acțiunile pe care le-ați introdus vor fi acum efectuate.

Acum să trecem la metodele în sine!

Mesaj în 1C, metoda 1 - cea mai ușoară

Deci, în loc de textul „// Inserați conținutul handlerului”. scrie textul programului.

Raport ("Bună lume!");

De fapt asta e tot :)

Mesajul în modul Enterprise în clientul gros va fi în partea de jos a ferestrei 1C, în clientul subțire - în partea dreaptă în fereastra de procesare.

Aceasta este cea mai simplă metodă, foarte folosită de programatori.

Mesaj în 1C, metoda 2 - de asemenea simplu

Alerta ("Bună lume!");

De fapt asta e tot :)

Mesajul în modul Enterprise în ambele opțiuni de client va fi într-o fereastră pop-up.

Mesaj în 1C, metoda 3 - a apărut doar în 1C versiunea 8.2

ShowUserAlert("Bună, lume!","Bună ziua într-adevăr!");

Această metodă a apărut doar în versiunea 1C 8.2. Aceasta este o fereastră pop-up în colțul din dreapta jos al ecranului, care dispare în timp.

Mesaj în 1C, metoda 4 - programator

Throw Exception „Bună, lume!”;

Poate apărea o eroare la executarea oricărui program. Uneori, această eroare poate fi calculată în avans (de exemplu, trebuie să calculați a = b/c și în momentul execuției programului se știe că c este egal cu 0).

În acest caz, există o modalitate de a raporta eroarea folosind această metodă.

Mesaj în 1C, metoda 5 - avansat tehnologic, doar pentru configurație standard

Scop general.ReportError("Bună ziua, lume!");

Un programator 1C trebuie să cunoască nu numai metodele de programare care sunt disponibile în platforma 1C, ci și cele care sunt disponibile în configurații standard.

Începătorii, când încearcă să adauge orice configurație standard, încep să reinventeze roata.

Iată un exemplu perfect. Această caracteristică este prezentă în multe configurații standard (doar pentru client gros!). S-ar părea că rezultatul este egal cu acțiunea metodei 1.
Cu toate acestea, nu - în unele configurații (de exemplu soft starter), mesajele de eroare sunt duplicate în jurnal. De asemenea, când setari aditionale mesajul arată complet diferit.

Deci, acum te poți simți ca un adevărat programator!

Exact asta este programarea 1C. Desigur, programarea reală este mult mai complexă și necesită multe cunoștințe, dar ideea generala Acum ai primit.

Noroc!

P.S. Versiunea pdf a lecției conține capturi de ecran pentru a face mai ușor să vă faceți propria experiență.

P.P.S. Lecția include 5 videoclipuri cu exemple de creare a unei baze pentru programare, creare de procesare, programare într-un client gros și subțire.

Dar unele aspecte ale lucrului cu obiectul „Mesaj către utilizator” nu au rămas acoperite în acesta. De exemplu, ce să scrieți în câmpul „Câmp” dacă numele

props diferă de numele câmpului din formular. Ce să scrieți în câmpul „Cale către date”. Și, în sfârșit, cel mai delicios lucru este cum să lucrezi cu partea tabelară.

Toate cercetările sunt colectate într-o bază de date de testare. Conține câteva cărți de referință și un document. Formularul de document are mai multe butoane, la apăsare, sunt afișate diverse tipuri de mesaje. Ei bine, acum despre fiecare moment în ordine, să mergem!!!

Tot ce scriu mai jos a fost testat pe 1C:Enterprise 8.3 (8.3.7.1860). Nu este ultimul de până acum, dar îl scriu așa cum este.

1. Doar un mesaj.

Să începem cu ceva simplu: doar afișați un mesaj în formular, fără referire la câmpuri, date etc.

Am vorbit despre asta mai devreme, dar pentru integritatea articolului îl voi scrie din nou. Mai ales cu unele completări.

Message1 = mesaj nou pentru utilizator;
Message1.Text = „1. doar un mesaj fără nicio legătură”;
Mesaj1.Mesaj();

Acest cod poate fi executat atât pe client, cât și pe server. Acesta este aproape un analog complet al liniei:

Raport ("1. doar un mesaj fără nicio legătură");

De ce este mai corect să comunici nu cu o procedură, ci cu un obiect. Faptul este că mesajele emise într-o sarcină de fundal (de exemplu, atunci când se execută o procedură de rutină conform unui program) nu sunt afișate nicăieri. Dar ceea ce este comunicat de obiect poate fi

primiți pe server într-o sesiune client folosind metoda „GetMessagesToUser(...)” în timp ce jobul de fundal este activ.

Aici te-am mințit puțin, nu am verificat niciodată asta. Este foarte posibil ca mesajele emise prin procedura „Raport(...)” să poată fi obținute și dintr-un job de fundal, dar poate nu. Documentația nu spune despre asta, ceea ce înseamnă că noi

nu o vom face.

Deci, concluzie: acum fă mereu mesajele un obiect, este un fel de formă bună noua platformași uitați de procedură. Dacă nu vă place să scrieți un mesaj în trei rânduri, atunci scrieți procedura într-un modul general și fiți fericit. O să fie chiar

ton foarte bun, pentru că Vei primi întreaga linie pro:

1. Funcționalitate extinsă a noului obiect (mai multe detalii mai jos)

2. Capacitatea de a afișa mesaje în felul tău. De exemplu, într-un câmp text sau într-un fișier, și nu într-o casetă de mesaj.

3. Posibilitate de logare. De exemplu, puteți salva toate mesajele din baza de date sau într-un fișier sau le puteți duplica în jurnal, pentru a face acest lucru, trebuie doar să modificați procedura obișnuită a modulului. Și apoi dezbaterea este că programul nu este nimic pentru utilizator

nu a informat se va opri pentru totdeauna.

2. Un mesaj asociat cu un atribut de obiect.

După cum am scris în articolul anterior, pentru a lega trebuie să completați câmpurile „Field” și „PathKData”. Dar nu am tratat subiectul în detaliu în articol.

Deci, exemplul 2 în document există un atribut de antet „Client”, trebuie să vă poziționați pe el și să raportați ceva în procedura clientului. Iată codul care face asta:

Message2 = mesaj nou pentru utilizator;
Message2.Text = "2. Mesaj asociat cu atributul antet Client";
Message2.Field = "Client";
Message2.DataPath = "obiect";
Mesaj2.Mesaj();

Și iată nuanțele:

1. Un câmp nu este un câmp, pentru că în exemplul meu, controlul se numește „FieldClient” și obiectul prop este „Client”. Linia Message2.Field = "FieldClient" nu funcționează.

2. Calea către date nu este „Obiect.Client”, ci pur și simplu „Obiect”, deoarece Trebuie să arătăm mesajul nu sub forma contrapărții, ci sub forma documentului curent. „Obiect.Client” - nu funcționează.

3. Acesta este un exemplu de lucru pe un client. În procedurile de server, este puțin diferit. Acest lucru este IMPORTANT, nu confundați legarea mesajelor pe server și pe client.

Voi mai da un exemplu, astfel încât să puteți simți diferența dintre un client și un server. Cert este că avem la dispoziție metoda obiect „SetData(...)”. Asistentul de sintaxă spune „Obiectul cu care ar trebui să existe

mesajul este asociat." Acest lucru este important. De exemplu, să scriem următorul cod:

Message3 = mesaj nou pentru utilizator;
Message3.SetData(Obiect);
Message3.Text = "3. Mesaj legat de atributul antet Număr, dar nu va fi legat deoarece Obiectul nu este un obiect";
Message3.Field = „Număr”;
Mesaj3.Mesaj();

Acest cod nu va funcționa pentru că... pe client, atributul de formă „Obiect” nu este deloc un obiect, ci un fel de lucru urât, asta ne spune depanatorul despre variabila obiect:

Mai precis, utilizatorul va vedea desigur mesajul, dar atingerea lui de două ori nu va duce la nimic.

Acum să încercăm același lucru, dar pe server. Să creăm o procedură de server „Report4OnServer()” și să o apelăm de la client

&Pe server
Procedură Report4OnServer()
Message4 = nou MessageToUser;
Message4.SetData(FormAttributesValue(„Obiect”));
Message4.Text = „4. Mesaj asociat cu atributul antet Organizație”;
Message4.Field = „Organizație”;
Mesaj4.Mesaj();
Sfârșitul procedurii

Totul va fi bine aici, singura remarcă asupra codului este că variabila „obiect” trebuie convertită din „FormDataStructure” într-un obiect real apelând procedura „FormAttributesValue(...)”.

Concluzie: metoda „SetData(...)” poate fi folosită doar pe server, deoarece Numai pe server este posibil să primiți un obiect.

3. Mesaje legate de atributul părții tabelare a obiectului

Am omis acest subiect în articolul precedent. Cunoscând nuanțele descrise mai sus, nu ar trebui să existe probleme aici. Iată codul client de lucru:

Message5 = nou MessageToUser;
Message5.Text = "5. Cantitatea câmpului liniei 1";
Message5.Field = "Produse.Cantitate";
Message5.DataPath = "obiect";
Mesaj5.Mesaj();

Deși nuanțele sunt aproape aceleași, repetarea este o lecție mamă:

1. Câmpul nu este numele controlului, controlul meu se numește „ProductsQuantity”, nu doar „Quantity”. „Produse” este numele părții tabelare, nu elementul de control asociat cu partea tabelară.

2. Calea către date este un obiect, doar un obiect.

3. Numărul liniei în paranteza patrata- numerotarea de la zero si acesta este numarul liniei, nu identificatorul liniei din formularul de colectare a datelor. Când liniile sunt mutate sau șterse, identificatorul atribuit la deschiderea formularului este salvat, iar numerele liniilor sunt recalculate.

Asta e pentru data asta. Voi aminti imediat subiecte nedezvăluite despre care voi scrie mai târziu:

1. Cum să legați mesajele nu la obiectul curent, ci la orice obiect, astfel încât la dublu clic să se deschidă un alt formular

2. Cum să legați mesajele la un formular în care nu există obiecte

3. Cum să primiți mesaje despre starea de execuție a unui job cu fundal lung

4. Ce este o „Cheie de date” și când ar trebui să o utilizați?

Mai jos este o bază de date cu un exemplu, în ea accesați documentul și apăsați pe rând trei butoane. Cod în modulul formular document.