Setări și opțiuni pentru rapoartele privind sistemul de stocare. Setări și opțiuni de raport pentru setările utilizatorului SKD 1S SKD

25.01.2021 Interesant

Atenţie! Aceasta este o versiune introductivă a lecției, ale cărei materiale pot fi incomplete.

Conectați-vă la site ca student

Conectați-vă ca student pentru a accesa materialele școlare

Sistem de compunere a datelor 1C 8.3 pentru începători: conectarea seturi de date

  • Scrieți un raport care să afișeze clienții și produsele lor preferate. Fiecare client are o culoare preferată, iar fiecare produs are propria sa culoare - pe baza acestor culori, trebuie să determinați „favoritul” produsului. De exemplu, dacă culoarea preferată a lui Andrey este roșu, atunci una dintre alimentele sale preferate va fi roșiile (sunt roșii).
  • Aplicați două seturi de date în raport. Primul set este reprezentat de date din tabelul de director „Clienți”. Al doilea sunt datele din tabelul directorului „Food”.
  • Implementează legătura dintre aceste două seturi, astfel incat raportul sa contina doar produsele preferate pentru fiecare client.

Creați un nou raport

Deschideți baza de date „Gastronom” în configurator și creați un nou raport prin meniul principal:

Tip document - „Raport extern”:

Sub forma unui nou raport, indicați numele „Lecția 6” și faceți clic pe butonul „Deschide diagrama compoziției datelor”:

Lăsați numele implicit al schemei:

Adăugarea primului set de date

În diagrama care se deschide, accesați fila „Seturi de date” și selectați „Adăugați un set de date - Interogare” folosind semnul plus verde:

Apelați constructorul cererii:

Indicăm tabelul „Clienți” și câmpurile care trebuie obținute din cerere:

Adăugarea unui al doilea set de date

Adăugați un al doilea set de date:

Selectați-l (DataSet2) și apelați din nou constructorul de interogare:

Indicăm tabelul directorului „Food” și câmpurile care trebuie obținute din cerere:

Textul de solicitare rezultat a fost:

Vă rugăm să rețineți că în prezent avem două seturi de date în raport: Data Set1 și Data Set2. Fiecare are propriul text și date de solicitare.

A face numele mai descriptive

Pentru claritate, să redenumim DataSet1 în Customers și DataSet2 în Food.

Fă-o dublu click pentru fiecare dintre seturi:

Putem folosi datele din fiecare set din raportul nostru. Vom accesa aceste date prin câmpuri.

ÎN acest moment Setul „Clienți” are următoarele câmpuri: „Nume” și „Culoare Favorită”, iar setul „Mâncare” are: „Nume” și „Culoare”.

Vedem că numele se suprapun și ne putem încurca cu ușurință. Deci, să schimbăm numele câmpurilor pentru a fi mai semnificative.

Selectați setul „Clienți” și modificați numele câmpurilor astfel:

Apoi selectați setul „Mâncare” și schimbați numele câmpurilor astfel:

Apelarea constructorului de setări

În cele din urmă, accesați fila „Setări” și faceți clic pe bagheta magică pentru a afișa designerul de setări:

Tipul raportului - „Lista...”:

Selectați câmpurile pentru raport din ambele seturi:

Vezi de ce a fost atât de important să schimbi numele câmpurilor? În stadiul setărilor de compoziție a datelor, nu vedem din ce seturi provin aceste câmpuri. Vedem doar numele lor.

Verificarea raportului

Salvăm raportul și îl generăm în modul utilizator:

Da. Bine, dar nu chiar. A avut loc o așa-numită îmbinare încrucișată a două seturi (ar trebui să fiți foarte familiarizați cu acest lucru de la îmbinările în interogările pe care le-am studiat în modulele anterioare). Fiecare înregistrare din tabelul Clienți are o înregistrare corespunzătoare din tabelul Alimente.

Dar din toate aceste înregistrări trebuie să lăsăm doar pe acelea al căror câmp „Culoarea preferată a clientului” este egal cu câmpul „Color alimentară”:

Conectăm două seturi de date

Pentru a face acest lucru, vom conecta două seturi de date (Clienți și Alimente) folosind câmpurile Customer's FavoriteColor și FoodColor.

Accesați fila „Legături seturi de date” și faceți clic pe butonul plus pentru a adăuga un nou link:

Configuram parametrii ca in figura de mai jos:

O sa fac o explicatie.

Sursa și receptorul comunicării. Ei bine, totul este clar aici. Indicăm primul set (Clienți) și al doilea set (Food) de date. Aș dori să atrag o atenție deosebită asupra faptului că comunicarea se va desfășura conform principiului unire stânga exterioară(am tratat-o ​​la tema cererilor din modulele anterioare). Pe baza acestui lucru, trebuie să alegeți care set va fi sursa și care receptor.

Sursa de expresie. Indicăm aici o expresie sau pur și simplu un câmp din setul de date sursă (am specificat câmpul ClientFavoriteColor din setul Clienți aici).

Expresia receptorului. Indicăm aici o expresie sau pur și simplu un câmp din setul de date receptor (am indicat câmpul ColorFood din setul Food).

Prin urmare această legătură va lăsa din lista anterioară doar acele rânduri pentru care câmpul FavoriteColor al Clientului este egal cu câmpul FoodColor.

Să salvăm raportul și să-l rulăm în modul utilizator:

Grozav!

O sa fac o explicatie despre domeniu" Condiția de comunicare„, despre care programatorii începători își lovesc atât de des sulițele.

Condiția de conectare este un câmp auxiliar. Puteți scrie expresii acolo implicând câmpuri numai din setul de date specificat în sursa linkului.

În acest caz, pentru toate rândurile din sursa linkului, această expresie (condiția linkului) va fi verificată înainte ca linkul să fie făcut. Și dacă această expresie este TRUE, atunci se va încerca să se stabilească legături între acest rând și rândurile de la receptorul de legătură. Dacă expresia este FALSĂ, atunci nu se vor face astfel de încercări.

Cred că nu este nevoie să vă spun ce este un sistem de control al accesului, un compozitor de setări și, în general, întregul set de obiecte concepute pentru a funcționa cu un sistem de control al accesului. Principalele domenii de utilizare, fără a număra acțiunile complicate din cod, sunt listele și rapoartele dinamice, iar în ambele cazuri, funcționalitatea foarte semnificativă rămâne în culise. De multe ori nici nu ne gândim la logica comportamentului și a relațiilor tuturor participanților la proces, deoarece De obicei rezolvăm probleme destul de simple sau ne bazăm pe valorile implicite ale platformei. Dar acolo unde sunt tăceri, există și o logică internă, un fel de „deserviciu” al lui 1C, ale cărui fructe sunt uneori greu și neevidente de depășit pentru a obține efectul dorit și, în același timp, este suficient doar pentru a utiliza instrumentele corect.

Cei interesați pot sări peste părțile 1-4 și să meargă direct la exemple.

Voi încerca să mă opresc puțin mai în detaliu asupra funcționării selecțiilor ACS în cazul utilizării lor în rapoarte. Cred că comportamentul în listele dinamice, cu o serie de avertismente, va fi similar. Deci, selecții în rapoarte, puțină teorie și apoi exemple concrete.

SP 8.3.6 și mai sus, se utilizează secțiuni ale ITS (clauza 10.3.7.5 etc.), cartea „Dezvoltarea profesională în sistemul 1C-Enterprise 8” (Kazan, 2012, al doilea volum). În cartea lui E. Khrustaleva nu era nimic inteligibil pe această temă.

Partea 1

Generatorul de setări, după cum știți, are colecții „Setări”, „Setări fixe” (denumite în continuare „FN”) și „Setări personalizate” (denumite în continuare „CU”). Un raport poate avea mai multe opțiuni, iar conexiunile dintre opțiune, N, PN și FN sunt foarte unice. De asemenea, să nu uităm de sursa setărilor disponibile și de „progenitorul” acestuia, care este de obicei circuitul însuși, care are și propriile setări implicite.

* Setări – setări create în modul Configurator și modificate în modul de editare a versiunii de raport;

* UserSettings – setări pe care utilizatorul le modifică în modul „1C:Enterprise” doar prin interfață;

* FixedSettings – acele setări care sunt setate din limba încorporată, inclusiv. sunt implicit stabilite de sistem. Această proprietate conține valori de selecție care sunt transferate în formular folosind parametrii acestuia (structura „Selectare”).

Setările și FN-urile sunt similare ca design și au o colecție „Selectare” de tip „Selectare compoziție date”, disponibilă pentru modificarea compoziției în orice moment în timpul existenței raportului. În același timp, Setările sunt disponibile pentru modificări de interfață prin editarea unei variante, dar FN-urile nu sunt deloc accesibile. PN, la rândul său, este un „terci”, în care elementele egale pot fi atât „Selectia” în sine, cât și obiectele individuale de tipul „Element de selecție a compoziției datelor” (așa-numitul obiect imbricat). În ciuda disponibilității metodelor adecvate, este imposibil să se schimbe programatic compoziția unei colecții de elemente PN dacă acestea sunt PN-uri ale raportului în sine și nu sunt făcute „de la zero” de către proiectant - 1C va raporta că „Colecția de utilizator setările nu își pot schimba compoziția, deoarece este asociată cu datele setărilor de aspect." ITS spune: „Proprietatea nu poate fi scrisă folosind limbajul încorporat”, dar, așa cum vom vedea mai târziu, este posibil să influențezi PN. „Triciul” de obiecte are conexiuni interne - este verificat pentru consistența condițiilor atunci când se generează un raport și când se modifică compoziția. Pe ITS citim: „Elementele care sunt ele însele marcate ca personalizate nu vor fi adăugate. De exemplu, o selecție personalizată nu va include un element de selecție care este marcat ca personalizat. Elementele care conțin elemente personalizate nu vor fi adăugate. De exemplu, un grup de condiții nu va fi adăugat dacă grupul conține elemente marcate ca personalizate. Pentru elementele imbricate, proprietatea DisplayMode nu este analizată. Sunt adăugate sau nu împreună cu elementele părinte.” Astfel, „vechimea” obiectelor operează în culise. În acest caz, puteți obține un efect atunci când interfața vă permite să specificați selecții contradictorii pentru o variantă și PN-ul acesteia, precum și în cadrul PN-ului.

S-ar părea că „senior” este o opțiune. Dar făcând clic pe „Mai multe” / „Modificare opțiunea” și confirmarea modificărilor în formularul deschis apelează gestionarea evenimentelor formularului , în acest caz, selecția apare în panoul „De bază” pe formularul numit din „Setări...”, și apare pe formularul de raport, dar NU este afișată în fila „Selectare”; Mai mult, fie apare imediat atât pe formularul de raport principal, cât și pe formularul „Setări...” (dacă există un steag „Include în setari personalizate"), sau nici aici, nici acolo. Dar, în orice caz, NU va fi pe fila „Selectare” din formularul „Setări...”. Diferența dintre fila „De bază” din „Setări...” formularul și formularul principal de raport sunt determinate de câmpul „Modul de editare” (normal - numai în „Setări”, rapid - și pe formularul de raport în sine), dar cred că toată lumea știe acest lucru. Apropo, valorile „Selectare” și „Rapid” nu sunt sincronizate în niciun fel și se pot contrazice unul pe altul, iar „Rapid” din formularul de raport și din formularul de setări sunt strict sincrone. Deci, atunci când editați o variantă, ea însăși devine modificată (dar ID-ul și numele acestuia nu se schimbă), dar PN-urile rămân NU modificate (adică chiar dacă vorbim despre ele, adică despre steag pentru includerea unui anumit element în PN).

Făcând clic pe „Selectați opțiunea...” și confirmarea modificărilor în formularul care se deschide, declanșează evenimente în următoarea ordine:

Când încărcați OptionOn Server

Când actualizați compoziția setărilor utilizatorului pe server

În acest caz, nici opțiunea și nici PN-ul nu se modifică în niciun fel. De aici este clar că opțiunea și setările, dacă sunt conectate, nu sunt în niciun caz conectate direct.

Făcând clic pe „Setări...” și confirmarea modificărilor din formularul deschis, declanșează doar un eveniment Când actualizați compoziția setărilor utilizatorului pe server(în acest caz, PN-urile devin modificate, dar vederile și cheia (dacă nu erau acolo) nu sunt primite; dacă „Fast” este activat pentru elementele obiectului „Selectare” al PN-ului, atunci pe lângă „Selectare”, elementele sale reale apar ca câmpuri, adică se comportă în mod similar cu elementele imbricate. Aceste setări sunt salvate la închidere și restabilite data viitoare când introduceți formularul. Nu atinge și nu modifică opțiunea.

Făcând clic pe „Mai multe”/„Setare setări standard” în formularul de setări (precum și elementul „Setări standard” din opțiunea de editare) declanșează doar evenimentul Când actualizați compoziția setărilor utilizatorului pe server. În acest caz, opțiunea devine schimbată, dar PN se schimbă. Dacă opțiunea a fost schimbată înainte, aceasta rămâne modificată (nici steagul modificat nu este resetat, nici setările reale nu sunt resetate).

Făcând clic pe „Proprietăți ale unui element de setări personalizate” în arborele de structură din formularul de editare a variantei, se adaugă un obiect „Selectare” și acesta se dovedește gol și nu este sincronizat în niciun fel cu selecția de variante existentă și cu elementele de selecție imbricate existente. varianta nu se schimba in niciun fel.

De aici recomandarea: dacă trebuie să setați anumite selecții în modul „Configurator”, pentru a nu modifica codul și pentru ca acestea să nu fie în opțiune, ci să fie în interfața de raport, nu trebuie să manipulați selecția elemente ale opțiunii, modificându-și proprietățile, dar selecția în sine, folosind butoanele „Proprietăți element...” și „Setări personalizate”.

Adăugarea a ceva care apare în Setări la PN necesită acțiuni în cod sau interfață, dar ștergerea și ștergerea Setărilor afectează PN imediat și fără actualizări, de exemplu:

Report.SettingsLitter.Settings.Selection.Items.Clear();

Înainte de a închide formularul de raportare, sistemul întreabă doar dacă au existat modificări ale variantei. Dacă au existat modificări la PN, acestea vor fi salvate automat, fără întrebări și, de asemenea, vor încerca automat să fie aplicate în următoarea sesiune de lucru cu raportul.

Note:

În cazul unui număr de erori în aplicarea setărilor, este afișat mai întâi un mesaj despre problemă, iar apoi compoziția are loc în continuare, evenimentul este numit și generarea de rapoarte. În acest caz, FN-urile, chiar dacă au existat, sunt încă ignorate și doar Setările joacă un rol.

La adăugarea unei selecții pe formularul „Modificare opțiune”, se face imediat cu steag „Include în PN” setat, dar, repet, din punctul de vedere al limbajului încorporat, PN rămâne neschimbat.

Setarea variației unei variante și setarea variației PN nu sunt direct legate; acestea sunt două direcții diferite de schimbare.

PN, printre altele, are „Setări suplimentare”. Nu am reușit niciodată să înțeleg ce și în ce moment sunt umplute. Deși raportul conține setări „marcate în designul de selecție și condițional” ca personalizate (în conformitate cu societatea în comun), dar setari aditionaleîn toate cazurile erau goale. Nu există nimic despre asta pe ITS.

În ciuda declarației din joint venture, PN-urile sunt serializate perfect în xml.

Dacă atât elementele de selecție independente, cât și selecția în sine sunt incluse pentru utilizare, atunci raportul este compilat corect, dar atunci când este afișat, acesta duplică informațiile despre selecția stabilită în aspectul final.

Formularul implicit pentru editarea unei versiuni de raport conține multe lucruri interesante, dar nicăieri nu funcționează cu FN și PN și chiar și cu setările de bază funcționează mai mult pentru citire (cu excepția faptului că șterge selecția, ordinea, convențiile).

Partea 2

Lucrul cu Setări și FN prin colecția lor este aproape întotdeauna acceptabil, dar este important să ne amintim că esența „al treilea nivel” se schimbă. Primul nivel conține întotdeauna setările implicite ale sistemului de control acces propriu-zis, ele apar implicit și în sursa setărilor disponibile; la al doilea nivel – setările opțiunii utilizate. Dar aici logica vă permite fie să „suprascrieți” instrucțiunile de bază, fie să le ignorați. Dar lucrul cu PN nu mai permite libertăți, iar manipulările subtile trebuie făcute folosind metode speciale și uneori obiecte intermediare auxiliare temporare, de exemplu:

Comp=NewDataCompositionSettingsComposer; // puteți, de asemenea, să porniți // comp.Initialize(SomeSettingsComposer.GetSourceofAvailableSettings()); comp.LoadSettings(SomeSettingsComposer.Settings); SomeSettingsComposer.LoadCustomSettings(comp.CustomSettings);

Generatorul de setări are o metodă (), care încarcă valorile setărilor utilizatorului transmise ca parametru metodei. Metodă GetSettings() vă permite să obțineți o copie a setărilor curente (ținând cont de setările utilizatorului). Metodă DescărcareSetări() încarcă setările transmise în generatorul de setări (setările utilizatorului sunt de asemenea repopulate pe baza datelor transmise, ținând cont de prezența cheilor, vezi exemplul de mai jos).

Aplicarea setărilor personalizate la setările principale se face în metodă GetSettings() generator de setări. Se efectuează următoarele acțiuni:

* Pentru tipurile DataCompositionSelectionElement, conținutul elementelor este copiat în elementele de setări personalizate corespunzătoare.

* Pentru tipurile de selecție a aspectului datelor, elementele situate în setările principale și marcate ca Inaccesibile rămân neschimbate. Elementele din PN sunt transferate la cele principale. Ele sunt adăugate la sfârșitul colecției pentru selecție.

* Pentru tipurile DataCompositionSelectionElementGroup, proprietatea Utilizare este setată în elementul corespunzător al setărilor principale (pe baza semnului utilizării elementului PN).

Partea 3

La formarea setărilor finale, pentru a cita ITS, diferite setări sunt combinate după cum urmează:

* Dacă orice tip de setări este marcat în întregime ca personalizat, atunci setările rezultate includ PN. În acest caz, dacă elementele de setări sunt marcate ca indisponibile, atunci aceste setări vor fi plasate în setările rezultate din proprietatea Settings Composer.Settings.

* Dacă orice tip de setări este marcat ca personalizat nu în întregime, ci element cu element, atunci elementele marcate ca personalizate vor fi preluate în setările rezultate din proprietatea Settings Composer.CustomSettings, iar elementele marcate ca indisponibile vor fi preluate în setările rezultate din Settings Composer.Settings property .

* Setările fixe sunt adăugate la setările rezultate „ca atare”. În acest caz, situația este inacceptabilă când FN și PN au setări cu același nume, de exemplu, selecție cu aceeași valoare stângă în condiție. Observ că chiar și coincidența completă a tuturor proprietăților acestor condiții este interzisă. Sincer să fiu, este puțin ilogic.

Aș dori să remarc faptul că, dacă orice fragment al setărilor este supus unei opțiuni funcționale și ar trebui limitat, sistemul funcționează „liniștit” - elimină acest fragment de peste tot, nu raportează nimic și în timpul manipulărilor programului cu privire la un astfel de fragment , prelucrează erori „inactiv” nu produce, dar nici codul nu are efect. Cu toate acestea, este posibil ca diferite versiuni să se comporte diferit.

Partea 4.

Extensia formularului de raportare ne pune la dispoziție parametrii „FN” și „PN”, dar nicăieri nu se recomandă completarea lor direct prin trecerea lor în formular. După cum au arătat experimentele, fără dansuri suplimentare cu o tamburină, conținutul acestor parametri este ignorat - este suprascris atunci când linkerul este inițializat în timpul procesului de deschidere și când sunt primite PN-uri salvate anterior. Este recomandat să lucrați cu chei PN, prin care le puteți prelua din magazinul de setări și apoi le puteți deschide și utiliza, iar acest lucru se face automat pe partea laterală a formularului de raportare, și nu pe formularul de apelare.

Parametrul „Sursa setărilor disponibile” este tradus automat în informațiile generatorului atunci când formularul este creat pe server și nu poate fi suprascris. Sau, mai degrabă, se poate, dar acest lucru va avea efect numai după o redefinire completă a întregului lanț de obiecte înrudite. în care GetSourceAvailableSettings() va returna Nedefinit până la sfârșitul tuturor evenimentelor de deschidere a formularului.

Permiteți-mi să remarc că parametrii formularului, care în esență nu sunt parametri cheie, își „întind” efectul pe mai multe evenimente dacă steagul de formare este setat la deschidere. Da, în caz ProcessingCheckFillOnServer, numit în timpul deschiderii și formării, va fi disponibil parametrul „Selectare”, dar odată cu el, dar apelat simplu de utilizator făcând clic pe butonul „Generează”, acesta nu va mai fi disponibil. Acest lucru se datorează faptului că toate aceste evenimente sunt procesate într-o singură „vizită” la server, dacă formarea la deschidere este activată și numai la sfârșitul lor controlul este transferat către client și numit La Deschidere. În acest caz, parametrii care nu sunt cheie se pierd în mod natural.

Ordinea generală de execuție a evenimentelor la deschiderea unui formular cu un steag pentru a genera un raport la deschidere (puțin mai mult decât este descris în „Dezvoltare profesională”):

Când CreatedOnServer

Înainte de a încărca opțiunea pe server

Când încărcați OptionOn Server

Înainte de a încărca setările utilizatorului pe server

Când se încarcă setările utilizatorului pe server

Când actualizați compoziția setărilor utilizatorului pe server

ProcessingCheckFillOnServer

La Deschidere

În acest caz, nici opțiunea, nici PN nu sunt modificate decât dacă s-au făcut eforturi deosebite.

Partea 5.

Acum să ne uităm mai detaliat la sarcina de a deschide un formular de raport cu construcția sa și selecția pre-specificată. Informații succinte despre acest lucru sunt în ITS și în recomandările metodologice, dar numai principiul în sine este acoperit acolo și subtilitățile nu sunt dezvăluite. Deci, pentru a apela contextual un raport, trebuie să treceți parametrul „GenerateOnOpen” în forma acestuia, egal cu True; și parametrul Selection care conține structura. Cheile de structură sunt numele câmpurilor ACS sau ale parametrilor ACS, iar valorile sunt valorile acestora. Citând SP, dacă există un parametru ACS cu un nume corespunzător numelui cheii de structură, atunci valoarea va fi setată la acesta. Dacă nu există niciun parametru, dar există un câmp, atunci o selecție va fi adăugată la acest câmp. În același timp, dacă există un parametru și un câmp cu același nume, atunci sistemul îl va ignora pur și simplu în liniște și nu va instala nimic.

„Dezvoltarea profesională” oferă un exemplu de schimbare (adică interceptarea și reconfigurarea) PN „din mers” într-un eveniment Înainte de a încărca setările utilizatorului pe server, unde argumentul care conține PN curent este trecut. De fapt, acesta nu este întotdeauna cazul - de exemplu, pot exista cazuri în care o eroare la salvarea PN-ului într-o sesiune anterioară sau inconsecvențele între Setări, FN și PN vor duce la golirea argumentului „Setări”. Și cel mai interesant este că nu va fi posibilă reconfigurarea completă în acest eveniment; acest lucru se poate face doar „la sfârșitul” secvenței de evenimente, și anume, în cazul ProcessingCheckFillOnServer.

Să vedem ce avem înainte de a încărca PN-ul pe server.

Pentru un caz simplu, când nimic nu este presetat în ACS și nu sunt incluse elemente în PN, situația este următoarea: Setări – gol; FN – conțin selecția corectă; Mon conține o selecție goală. Modelarea funcționează corect, dar din punctul de vedere al utilizatorului interfața contrazice interiorul și este descurajatoare - selecția funcționează, dar nu este vizibilă. În mod similar, dacă activați Selecția în PN în setările structurii opțiunilor, raportul este, de asemenea, construit ținând cont de selecție, dar nici utilizatorul nu vede nicio selecție.

Să setăm preselecții în setările ACS din Configurator (egal valori goale) și includeți-le în Lun. În teorie, FN-urile ar trebui să completeze Setările, iar acelea ar trebui să completeze PN-ul, dar în realitate avem: în Setări - Selecție cu elementul necesar, dar o valoare de dreapta goală, FN-urile conțin selecția corectă și PN-urile încă nu conțin nimic. În plus, în acest caz raportul nu se va construi, deoarece valoarea de selecție din dreapta este goală, în ciuda valorii transmise în parametrul Select.

Nici o încercare de a lucra cu elemente PN nu dă rezultate. Pentru elementul PN, puteți schimba doar steagul „Utilizați” și participarea la „Rapid”. Valoarea de selecție de pe interfață va fi goală, sistemul nu va genera erori. În mod similar, va funcționa și o încercare de a lucra cu PN Selection; în depanator, valoarea corectă va fi vizibilă ca fiind completată corect, dar nu veți vedea nimic pe interfață. Permiteți-mi să vă reamintesc că este imposibil să schimbați componența PN. Astfel, sunt necesare trucuri suplimentare. De exemplu:

&Pe server Procedura SetPresetSelections(UserSettings) Dacă nu Parameters.Property(„Selection”), apoi returnează EndIf; Dacă Parameters.Selection.Quantity()=0, atunci returnează EndIf; rTypeEO=Type("Element de selecție al compoziției datelor"); Pentru fiecare cheie Din Parameters.Selection Loop pField=NewDataCompositionField(key.Key); // If (ValueType(kiz.Value)=Type("Array") sauValueType(kiz.Value)=Type("ValueList")) și kiz.Value.Quantity()>1 Then pViewComparison=DataCompositionComparisonType.InList; În caz contrar pComparisonType=DataCompositionComparisonType.Equals; endIf; // pNecessarySelection = Nedefinit; // vezi dacă există Selecție în setările utilizatorului pNecessaryEO=Nedefinit; // vezi dacă există un element separat de selecție de compoziție de date în setările utilizatorului Pentru fiecare elnastr Din UserSettings.Elements Cycle If TypeValue(elnastr) = Type("DataComposition Selection") și pNecessarySelection=Undefined Then // poate exista doar o singură pNecessarySelection= elnastr; // acest lucru ar putea fi făcut în afara buclei, dar este necesar să sortați setările utilizatorului de dragul elementelor... În caz contrar, dacă TypeZnch(elnastr) = pTypeEO Atunci // acesta este un element de selecție, pot fi multe dintre ele, dar ne interesează cele care nu sunt inițializate sau cu câmpul obligatoriu If elstr.LeftValue=pField sau elstr.LeftValue=Undefined și rNeedEO=Undefined Then pNeedEO=elstr; endIf; endIf; EndCycle; // Dacă preRequiredSelection<>Nedefinit Apoi // merge ca o prioritate pNecessaryEOFromSelection = Nedefinit; Pentru fiecare elotb Din pNecessarySelection.Elements Cycle If elotb.LeftValue=pField Atunci pNecessaryEOfromSelection=eloteb; Abort EndIf; EndCycle; Dacă pNecessary EO din Selecție = Nedefinit, atunci pNecessary EO din Selecție = pNecessary Selection.Elements.Add(pType of EO); pNeedEOFromSelection.LeftValue=pField; endIf; pNecessaryEOfromSelection.ComparisonType=pComparisonType; pNecessaryEOFromSelection.RightValue=kiz.Value; pNecessaryEOFromSelection.Use=Adevărat; // rNeededEO.Use=False; OtherwiseIf pNecessarySelection=Nedefinit și pNecessaryEO<>Nedefinit Apoi // pune pe elementul pNecessaryEO.LeftValue=pField; pNecessaryEO.ComparisonType=pComparisonType; pNeedEO.RightValue=kiz.Value; pNeedEO.Use=Adevărat; endIf; pNeed=Nedefinit; Pentru fiecare elotb Din Report.ComposerSettings.Settings.Selection.Elements Loop // într-un mod amiabil, ar trebui să existe o căutare recursivă! Dacă TypeValue(elotb)=pTypeEO și elotb.LeftValue=pField, atunci pNeed=elotb; Abort EndIf; EndCycle; Dacă pNeed = Nedefinit, atunci pNeed = Report.Settings Composer.Settings.Selection.Elements.Add(pEOType); pNeed.LeftValue=pMargin; endIf; pNecessary.ComparisonType=pComparisonType; pNeed.RightValue=kiz.Value; pNeed.Use=Adevărat; //EndCycle; Report.Settings Composer.FixedSettings.Selection.Items.Clear(); // în caz contrar se va spune că elementele se intersectează/contrad Sfârșitul procedurii

Cel mai corect mod de a numi acest lucru este:

&Pe server Procedura Procesarea Verificărilor de completare Pe server (Eșec, Detalii verificate) Setați selecții predefinite (Raport. Linker Setări. Setări utilizator); Sfârșitul procedurii

Apoi, un apel de context, de exemplu, dintr-un formular de director, va arăta astfel:

&OnClient Procedura OpenReport(Command) If ValueFilled(Object.Link) Then ot=New Structure("LinkToDirectory",Object.Link); // așa este denumit câmpul în raportul SDS Form Parameters = New Structure ("Selection, GenerateWhen Opening", select, True); OpenForm("Report.Report1.Form.ReportForm",FormParameters,ThisForm); endIf; Sfârșitul procedurii

Partea 6.

Dacă este necesar, modificați setările raportului în timp ce lucrați cu acesta, inclusiv. atât la pornire, cât și după deschidere, cel mai corect mod este schimbarea „de la început”, adică. din setările ACS. Schimbarea schemei ACS se efectuează numai cu obiectul Raport (sau Raport extern), și nu cu datele formularului și în sine nu schimbă nimic - în Setări și în PN rămâne același ca a fost și FN-ul poate rămâne gol. Prin urmare, în funcție de sarcinile noastre:

După execuție

Report.Settings Composer.LoadSettings(SKD.DefaultSettings)

Se schimbă doar opțiunea și nimic mai mult;

După efectuarea tehnicii menționate la paragraful 2 (folosind „intermediarul” și metoda LoadCustomSettings()

funcționează numai dacă resetați PN-ul curent folosind interfața. De la sine, dacă opțiunea este schimbată, ei nu se vor schimba. În acest caz, selecția se modifică, dar un nou element de selecție nu este adăugat.

După execuție

ThisForm.CreateFormElementsUserSettings(,DisplayModeDataCompositionSettings.All)

platforma cade în tăcere. Testat pe mai multe versiuni diferite. Și apelarea modului pentru afișarea setărilor numai pentru cele rapide nu are sens - nu am influențat compoziția lor, așa că oricum nimic nu se va schimba.

Și, deoarece încă trebuie să modificăm complet nu numai selecțiile interne, ci și afișarea în formularul de raport și în formularele aferente, fie trebuie să schimbăm doar selecția, fie să procedăm după cum urmează:

&Pe server Procedura ChangeSKD() pObject = Form AttributesValue("Raport"); selection=pObject.DataCompositionScheme.SettingsOptions.Get(0).Settings.Selection; eo = selection.Elements.Add(Type("DataCompositionSelectionElement")); eo.LeftValue=NewDataCompositionField("LinkToDirectory.Field1"); eo.ComparisonType=DataCompositionComparisonType.Equals; eo.RightValue=Adevărat; eo.Use=True; ValueÂFormAttributes(pObject,"Raport"); Report.SettingsLitter.LoadSettings(pObject.DataCompositionSchema.DefaultSettings); Report.SettingsComposer.Restore(); // de dorit, deși acest lucru încă nu afectează FN-ul. // de fapt, aceasta este exact ceea ce se poate numi o modificare a compoziției PN-ului Pentru fiecare e-mail De la Report.ComponentSettings.Settings.Selection.Elements Cycle email.DisplayMode=ElementDisplayModeDataCompositionSettings.QuickAccess; Dacă EmptyString(el.UserSettingsIdentifier) ​​​​Atunci // puteți utiliza metoda electronicSetIdentifier pentru elementul PN, vedeți ajutorul acestuia în SP, totul este destul de clar acolo e.UserSettingsIdentifier="ID123"; // important - identificatorul poate fi ORICE, nu UUID sau GUID! el.ViewUserSettings="Test"; endIf; EndCycle; comp=NewDataCompositionSettingsComposer; comp.LoadSettings(pObject.DataCompositionScheme.DefaultSettings); Report.SettingsComposer.LoadCustomSettings(comp.CustomSettings); Pentru fiecare e-mail de la Report.Settings Composer.CustomSettings.Elements Cycle email.DisplayMode=ItemDisplayModeDataLayoutSettings.QuickAccess; // trage EndCycle pe formularul de raport; // iar acum aceasta va avea efectul: ThisForm.CreateFormElementsUserSettings(,DisplayModeDataCompositionSettings.QuickAccess); Sfârșitul procedurii

De fapt, poți studia această mecanică mult timp. Această publicație a apărut din studierea modalităților de a rezolva o problemă specifică și, prin urmare, este destul de unilaterală; dar bănuiesc că se poate scrie o carte separată despre logica internă a setărilor, în special a celor de utilizator, nu mai subtilă decât cea a lui Khrstalev. Din păcate, nu am energia sau timpul pentru asta. Cine consideră că anumite dezvoltări sunt utile este deja bun.

Unele lucruri au fost clarificate experimental și, prin urmare, sunt controversate. Cei care știu mai multe sunt invitați să critice și să comenteze.

Am examinat în detaliu setările rapoartelor implementate pe baza sistemului de control acces. Acum să ne uităm la cele mai subtile și setări detaliate opțiuni de raportare. Fereastra pentru setările „avansate” ale opțiunii de raport este apelată de comanda „Mai multe” - „Altele” - „Modificați opțiunea raportului”.

Fereastra pentru modificarea versiunii raportului este împărțită în două părți:

1. Structura raportului.

2. Setări raport.


Secțiunea de structură a opțiunii de raport este similară cu fila „Structură” din setările standard ale raportului. Scopul și configurația grupărilor sunt discutate în detaliu în partea 1 a articolului.

Tabelul structurii variantelor de raport, pe lângă coloana reală cu grupări, conține mai multe coloane suplimentare:

Secțiunea de setări ale variantei de raportare oferă utilizatorului oportunități ample pentru a configura raportul în funcție de nevoile dvs. Aproape complet coincide cu setări standard raport discutat în partea 1. Să ne uităm la toate filele secțiunii și să notăm diferențele.

Secțiunea de setări este formată din următoarele file:

1. Parametri. Conține parametrii ACS disponibili pentru utilizator.

Parametrul SKD este o valoare utilizată pentru a obține date de raport. Aceasta poate fi o valoare de condiție pentru selectarea sau verificarea datelor, precum și o valoare auxiliară.


Tabelul de parametri este prezentat în formatul „Parametru” - „Valoare”. Dacă este necesar, puteți modifica valorile parametrilor. Făcând clic pe butonul „Proprietăți element de setări personalizate” se deschide setările personalizate ale elementului.


În această fereastră, puteți selecta dacă elementul va fi inclus în setările utilizatorului (adică, vizibil pentru utilizator la crearea unui raport), puteți seta prezentarea și modul de editare a elementului ( acces rapidîn antetul raportului, normal în setările raportului și indisponibil).

Proprietățile elementului cu setări personalizate au, de asemenea, câmpuri grupabile, margini, selecții și elemente de aspect condiționat.

2. Câmpuri personalizate. Conține câmpuri care sunt generate de utilizatorul însuși pe baza datelor selectate de raport.


Utilizatorul poate adăuga două tipuri de câmpuri:

  • Câmp nou de selecție...
  • Câmp nou de expresie...

Câmpurile de selecție vă permit să calculați o valoare pe baza unei anumite condiții. Fereastra de editare a câmpului de selecție conține un titlu de câmp și un tabel în care sunt specificate selecția, valoarea și prezentarea câmpului. Selectarea este o condiție, în funcție de care se va înlocui valoarea dorită.


De exemplu, să calculăm o estimare a numărului de vânzări. Vom presupune că dacă se vând mai puțin de 10 unități dintr-un produs, am vândut puțin, iar dacă sunt mai mult de 10 unități, am vândut foarte mult. Pentru a face acest lucru, vom seta 2 valori pentru câmpul calculat: prima va fi cu selecția „Număr de bunuri mai mic sau egal cu „10””, a doua cu selecția „Număr de mărfuri mai mare decât „10”. ””.

Câmpurile de expresie vă permit să calculați o valoare folosind algoritmi arbitrari. Ei pot folosi funcțiile limbajului de interogare și limbajul de programare 1C încorporat. Fereastra de editare a câmpului de expresie conține două câmpuri pentru expresiile înregistrărilor detaliate și rezumate. Înregistrările totale sunt grupări configurate în zona „Structura raportului”; acestea trebuie să utilizeze funcții de agregare („Suma”, „Minim”, „Maximum”, „Cantitate”).

De exemplu, să calculăm procentul mediu de reducere. Procentul mediu de reducere se calculează folosind formula: [Suma vânzărilor fără reducere] - [Suma vânzărilor cu reducere] / [Suma vânzărilor fără reducere]. Este important de reținut că valoarea vânzărilor fără reducere poate fi zero, așa că folosim operatorul SELECT pentru a verifica. Obținem următoarele expresii:

· Pentru intrări detaliate:

Alegere

Când [Suma vânzărilor fără reducere] = 0

Apoi 0

În caz contrar [Suma vânzărilor fără reducere] - [Suma vânzărilor cu reducere] / [Suma vânzărilor fără reducere]

Sfârşit

· Pentru înregistrările rezumative:

Alegere

Când Suma([Suma vânzărilor fără reducere]) = 0

Apoi 0

În caz contrar Sumă([Suma vânzărilor fără reducere]) - Sumă([Suma vânzărilor cu reducere]) / Sumă([Suma vânzărilor fără reducere])

Sfârşit

După cum am menționat mai devreme, în exprimarea înregistrărilor totale folosim funcția de agregare „Suma”.

3. Câmpuri grupabile. Conține câmpuri după care vor fi grupate rezultatele variantei de raport. Câmpurile grupate sunt configurate separat pentru fiecare grupare, dar puteți seta câmpuri grupate generale pentru o opțiune de raport dacă selectați rădăcina „Raport” în arborele de structură. Puteți adăuga un câmp din rezultatul raportului, un câmp personalizat sau puteți selecta un câmp automat, apoi sistemul va selecta câmpurile automat. Această filă vă permite, de asemenea, să schimbați ordinea câmpurilor grupate.


4. Câmpuri. Conține câmpurile care vor fi afișate ca rezultat al variantei de raport. Câmpurile sunt configurate separat pentru fiecare grupare, dar puteți seta câmpuri comune pentru o opțiune de raport dacă selectați rădăcina „Raport” în arborele de structură. Puteți adăuga un câmp din rezultatul raportului, un câmp personalizat sau puteți selecta un câmp automat, apoi sistemul va selecta câmpurile automat. Această filă vă permite, de asemenea, să schimbați ordinea câmpurilor.

Câmpurile pot fi grupate pentru a evidenția în mod logic orice parte a raportului sau pentru a specifica un aranjament special de coloane. Când adăugați un grup, coloana „Locație” devine activă și vă permite să selectați una dintre opțiunile de locație:

  • Auto - sistemul plasează câmpuri automat;
  • Orizontală - câmpurile sunt poziționate orizontal;
  • Vertical - câmpurile sunt dispuse vertical;
  • Într-o coloană separată - câmpurile sunt situate în coloane diferite;
  • Împreună - câmpurile sunt situate într-o singură coloană.


5. Selectie. Conține selecțiile utilizate în varianta de raport. Configurarea selecțiilor a fost discutată în detaliu în partea 1 a acestui articol. Filtrele sunt configurate separat pentru fiecare grupare, dar puteți seta filtre generale pentru o opțiune de raport dacă selectați rădăcina „Raport” în arborele de structură.


6. Sortarea. Conține câmpurile de sortare utilizate în varianta de raport. Configurarea câmpurilor de sortare a fost discutată în detaliu în partea 1 a acestui articol. Sortarea este configurată separat pentru fiecare grupare, dar puteți seta câmpuri generale de sortare pentru o opțiune de raport dacă selectați rădăcina „Raport” în arborele de structură.


7. Înregistrare condiționată. Conține elemente de proiectare condiționate utilizate în varianta de raport. Configurarea aspectului condiționat a fost discutată în detaliu în partea 1 a acestui articol. Aspectul condiționat este configurat separat pentru fiecare grupare, dar puteți seta elemente comune proiectare condiționată pentru o opțiune de raport dacă selectați rădăcina „Raport” în arborele de structură.


8. Setări suplimentare. Conține setări suplimentare de proiectare a rapoartelor. Vă permite să selectați un comun aspect raport, locația câmpurilor, grupări, detalii, resurse, totaluri, setați setările diagramei, controlați afișarea titlului, parametrilor și selecția, determinați poziția resurselor și fixați antetul și coloanele de grupare ale versiunii raportului.


În concluzie, aș dori să notez că setările raportului nu pot fi salvate doar ca opțiune de raport, ci și încărcate într-un fișier (meniul „Mai multe” - „Salvare setări”). Pentru a descărca, trebuie să selectați „Încărcare setări” și să selectați fișierul salvat. Astfel, putem transfera setările variantelor de raport între diferite baze de date care au aceeași configurație.


Pe baza acestui lucru, putem rezuma că utilizatorul nu poate personaliza în mod independent raportul pentru a se potrivi nevoilor sale, dar și poate să-și salveze setările și să le folosească în viitor, dacă este necesar.

Pentru un raport pot fi specificate mai multe opțiuni pentru prezentarea sa vizuală - adică aceeași informație poate fi extinsă, grupată etc. în moduri diferite. Opțiunile predefinite sunt setate în designerul ACS din fila Setări (Fig.); varianta poate fi creată și în modul Enterprise.

Opțiunea care este cea mai înaltă în ordine va fi considerată opțiunea implicită.

Pentru opțiunile predefinite configurațional, puteți specifica ce setări vor fi disponibile utilizatorului. De exemplu, puteți interzice selecția sau gruparea pentru un element. Acest lucru este specificat în Proprietățile elementului de setări utilizator:

Specificați opțiunea de acces a utilizatorului la setări:

Aceasta determină ce va vedea utilizatorul în setările de raport în Enterprise:

Întrebarea 11.32 a examenului 1C: Platform Professional. Ce opțiune de raport din schema de compunere a datelor va fi considerată implicită?
  1. Cel care se află pe primul loc în lista de opțiuni
  2. Cel cu proprietățile opțiunii implicite setate
  3. Cel care a fost determinat mai întâi în procesul de creare a opțiunilor
Răspunsul corect este primul, descrierea din text.
Întrebarea 11.35 a examenului 1C: Platform Professional. Cum se adaugă o setare la lista de setări de utilizator?
  1. în formularul de setări element personalizat puteți specifica o indicație că elementul este personalizat
  2. în formularul de setări ale elementelor personalizate, activați accesul rapid în modul de editare
  3. adăugarea se realizează prin bifarea casetei de selectare din proprietatea „Utilizare”.
Răspunsul corect este primul.
Întrebarea 11.40 a examenului 1C: Platform Professional. În setările sistemului de compoziție a datelor, trebuie specificate următoarele:
  1. Structura setărilor
  2. Opțiuni
  3. Câmpurile selectate
  4. Câmpuri grupabile
  5. Triere
  6. Toate cele de mai sus
Răspunsul corect este primul. Structura este necesară, orice altceva poate fi adăugat automat de sistemul de control al accesului, sau nu este necesar în principiu.
Întrebarea 11.41 a examenului 1C: Platform Professional. Cum va arăta formularul de raport după aplicarea următoarelor setări?
  1. Sub forma unui tabel cu patru coloane: „Produs”, „Depozit”, „Cantitate rămasă”, „Suma rămasă”
  2. Sub forma unui tabel cu trei coloane: „Produs”, „Depozit”, „Cantitate rămasă”
  3. Sub forma unui tabel, al cărui număr de coloane va depinde de numărul de depozite care au solduri diferite de zero
  4. Raportul nu va fi generat
Răspunsul corect este al patrulea - nu există nicio bifă în elementul rădăcină al structurii setărilor, prin urmare, datele pentru ieșire nu sunt definite.
Întrebarea 11.42 a examenului 1C: Platform Professional. Ce se întâmplă la generarea unui raport dacă nu există setări ale sistemului de compoziție a datelor în modul utilizator?
  1. Se vor folosi „Setări implicite” specificate de dezvoltator în schema de compunere a datelor
  2. Din lista de opțiuni de setări, se va folosi opțiunea de lângă cea curentă
  3. Se vor folosi setările personalizate
  4. Raportul nu va fi generat
Al patrulea răspuns corect este că ceea ce a specificat utilizatorul are prioritate. Setările utilizatorului sunt goale, prin urmare raportul nu va fi generat.
Întrebarea 11.43 a examenului 1C: Platform Professional.
  1. La marginea stângă a primei secunde a datei specificate în parametrul „Perioadă”.
  2. Soldurile curente vor fi obținute cu excepția cazului în care este specificată o altă valoare în parametrul sistemului de compunere a datelor creat pe baza numelui parametrului extern specificat în textul de interogare pentru parametrul „Perioadă” al tabelului virtual
Răspunsul corect este al patrulea. Caseta de selectare „Perioadă” nu este bifată, adică selecția utilizatorului nu este specificată. În general, aceasta înseamnă solduri curente, dar este posibil ca parametrul perioadei să fie definit într-o setare ACS diferită.
Întrebarea 11.44 a examenului 1C: Platform Professional. În ce moment pe axa timpului vor fi obținute soldurile la generarea raportului?
  1. La marginea stângă a primei secunde a datei specificate în parametrul „Perioadă”.
  2. La marginea dreaptă a ultimei secunde a datei specificate în parametrul „Perioadă”.
  3. Se vor primi solduri curente
  4. Soldurile curente vor fi obținute cu excepția cazului în care este specificată o altă valoare în parametrul sistemului de compunere a datelor creat pe baza numelui parametrului extern specificat în textul de interogare pentru parametrul „Perioadă” al tabelului virtual
Răspunsul corect este primul - selecția este indicată clar aici.

Întrebarea 11.45 a examenului 1C: Platform Professional. Figura prezintă formularul de raport generat de sistem în mod implicit. Ce tip de element de setări este încadrat?

  1. Setari personalizate
  2. Setări fixe
  3. Opțiuni de setare
  4. Un element poate aparține oricărui tip de setări, în funcție de valoarea proprietății sale „Data Path”.
Răspunsul corect este primul.
Întrebarea 11.46 a examenului 1C: Platform Professional. În raport, selecția prin câmpul „Depozit” este specificată simultan în toate tipurile de setări. Ce se întâmplă când încercați să generați un raport?
  1. Raportul nu va fi generat
  2. Raportul va fi generat utilizând selecția din setările utilizatorului
  3. Raportul va fi generat folosind o selecție din setările fixe
  4. Raportul va fi generat folosind o selecție din opțiunea de setări curente
Nu este clar care sunt „toate tipurile de setări”, dar, conform răspunsurilor, opțiunea corectă este prima.
Întrebarea 11.47 a examenului 1C: Platform Professional. În raport, selecția prin câmpul „Depozit” este specificată atât în ​​setările utilizatorului, cât și în opțiunea setărilor curente. Ce se întâmplă când încercați să generați un raport?
  1. Raportul va fi generat utilizând selecția din setările utilizatorului dacă este selectat indicatorul „Utilizare”. Dacă indicatorul „Utilizare” nu este setat, atunci nu va exista nicio selecție
  2. Raportul va fi generat utilizând selecția din setările utilizatorului dacă este selectat indicatorul „Utilizare”. Dacă indicatorul „Utilizare” nu este setat, atunci setarea de selecție din opțiunea de setări va fi utilizată
  3. Raportul va fi generat utilizând selecția din opțiunea de setări dacă este selectat indicatorul „Utilizare”. Dacă indicatorul „Utilizare” nu este setat, atunci nu va exista nicio selecție
  4. Raportul va fi generat utilizând selecția din opțiunea de setări dacă este selectat indicatorul „Utilizare”. Dacă indicatorul „Utilizare” nu este setat, atunci setarea de selecție din setările utilizatorului va fi utilizată
Prima varianta este corecta.
Întrebarea 11.49 a examenului 1C: Platform Professional. Când lucrează cu setări, utilizatorul poate specifica un câmp de grupare
  1. Într-o fereastră separată „Gruparea”
  2. Într-o fereastră separată „Editarea câmpurilor de grupare”
  3. În fila „Câmpuri grupate”.
  4. Într-o fereastră separată „Grupare” și în fila „Câmpuri grupate”.
  5. Într-o fereastră separată „Grupare”, într-o fereastră separată „Editarea câmpurilor de grupare” și în fila „Câmpuri grupate”
Răspunsul corect este al cincilea. Fereastra de grupare:

Opțiuni Editați câmpurile de grupare și câmpurile care se pot grupa:

Întrebarea 11.50 a examenului 1C: Platform Professional. Utilizatorul a creat o opțiune de setări de la zero. Ce setări a trebuit să editeze? Alegeți răspunsul cel mai complet și corect
  1. Câmpurile de raport selectate, selecția raportului, selecția depozitului, setări suplimentare ale tabelului, sortarea articolelor, parametrii, designul articolului condiționat
  2. Câmpuri de raport selectate, selecție de rapoarte, setări suplimentare pentru tabel, design condiționat de articole, câmpuri de depozit selectate, parametri, sortare rapoarte
  3. Câmpurile de raport selectate, selecția raportului, selecția depozitului, setările suplimentare ale tabelului, designul articolului condiționat, parametrii, structura raportului
  4. Câmpurile de raport selectate, selecția raportului, selecția depozitului, setări suplimentare ale rapoartelor, parametrii, designul articolului condiționat, structura raportului
Răspunsul corect este al treilea, trebuie să te uiți cu atenție la captura de ecran.