Obținerea datelor afișate printr-o listă dinamică

Pe lângă tipurile de date primitive care pot fi găsite în orice limbaj de programare, există tipuri unice în 1C. Fiecare dintre ele are propriile sale proprietăți, metode, funcții, scop și nuanțe de utilizare în sistem. Unul dintre aceste tipuri este o listă dinamică, care facilitează foarte mult multe sarcini aplicate. De aceea, dezvoltatorii trebuie să cunoască și să fie capabili să se ocupe de acest instrument universal.

Caracteristicile listelor dinamice în 1C

Scopul acestui tip este de a afișa informații din orice tabele de bază de date, indiferent de tipul acesteia. Mecanismul a fost creat pe baza SKD și are capacități similare. Dar asta nu înseamnă că va trebui neapărat să scrieți o cerere în limba 1C, deși această oportunitate există și ar trebui folosită. Puteți specifica pur și simplu tabelul ale cărui informații vă interesează și 1C va genera independent o interogare simplă.

Pentru a vedea cum se formează o listă dinamică și ce date arată, trebuie să deschideți formularele gestionate unde se află în configurator: în lista de detalii, utilizați meniul contextual pentru a deschide proprietățile acesteia și să acordați atenție la „Personalizat”. Solicitare” articol. Dacă nu există casetă de selectare, atunci parametrul „Main table” reflectă tabelul bazei de date din care sunt preluate datele. În caz contrar, lista dinamică reflectă datele unei interogări personalizate, care pot fi văzute prin deschiderea setărilor listei.

Schema de interogare personalizată este mult mai frecvent utilizată, deoarece aceasta oferă o oportunitate excelentă de a combina și afișa o mare varietate de date. Cel mai adesea, acest mecanism este folosit pentru a reflecta soldurile depozitului, prețurile articolelor, încasările, cheltuielile sau achizițiile. Trebuie să-l utilizați cu atenție, deoarece performanța poate scădea pentru interogări complexe.

O altă proprietate utilă a unei liste dinamice se deschide când faceți clic pe inscripția „Setări liste”. Acest meniu vă permite să faceți informațiile mai accesibile și mai ușor de înțeles pentru utilizatorii finali, chiar și atunci când utilizați un set standard de câmpuri. Indiferent dacă cererea este arbitrară sau nu, veți vedea fila „Setări”, unde puteți specifica:

  • Selectare dinamică a listei;
  • Grupuri;
  • Triere;
  • Decor.

Utilizarea parametrilor face listele dinamice universale și destul de flexibile. De asemenea, le puteți conecta la detalii dintr-un formular gestionat, iar datele se vor schimba în funcție de parametrii selectați de utilizator. Utilizarea acestor mecanisme poate fi înțeleasă și apreciată luând în considerare exemple de probleme din viața reală.

Ca exemplu, luați în considerare sarcina de a reflecta rămășițele nomenclaturii pe o formă controlată. În practica reală, astfel de comenzi apar destul de des în diverse configurații, iar o listă dinamică este ideală ca instrument. Pentru această sarcină va trebui să folosim o interogare personalizată, parametrii listei dinamice și setările acesteia.

Pentru o mai mare claritate, să creăm o procesare externă separată și să plasăm o listă dinamică pe ea. Pentru a ne implementa planurile, tabelul cu nomenclatura nu va fi suficient, așa că trebuie să permitem o interogare arbitrară. În acesta vom descrie conexiunea din stânga a directorului cu lista de articole și registrul de solduri și vom seta directorul ca tabel principal. Această schemă va permite utilizatorilor, care lucrează cu o listă dinamică, să adauge sau să modifice articole.



SELECT NomenclatureList.Name AS Nume, GoodsInWarehousesRemainings.Warehouse AS Warehouse, GoodsInWarehousesRemainings.QuantityRemaining AS CantitateRemaining FROM Directory.Nomenclature AS NomenclatureList LEFT CONNECTION RegisterAcumulations.GoodsInWarehouses,. tureList.Link = ProductsInWarehousesRemainings.Nomenclature WHERE

Deoarece solicitarea noastră a folosit parametrul „CurrentDate”, trebuie să îi setăm valoarea înainte de a utiliza procesarea. Pentru a face acest lucru, în modulul de formular din procedura „When CreatedOnServer”, folosind o comandă standard, atribuiți-i funcția „CurrentSessionDate”. De asemenea, trebuie să afișăm lista dinamică pe formularul de control și să schimbăm ordinea câmpurilor pentru claritate. Trageți atributul „Nomenclatură rămasă” în elementele formularului (partea din stânga sus) și utilizați săgețile albastre pentru a schimba ordinea câmpurilor din tabelul din formular.

&Pe Procedura Server Când este creată pe server (Eșec, Procesare standard) Nomenclatura rămâne. Parametri. Set ParameterValue("CurrentDate", CurrentSessionDate()) EndProcedure


Deja în această etapă, putem deschide procesarea noastră externă în 1C și să vedem că lista dinamică funcționează. Putem să ne uităm la solduri, să creăm articole și grupuri și să căutăm. Adesea, clienții solicită să adauge posibilitatea de a alege data la care vor vedea soldurile. În cazul unui formular cu o listă dinamică, acest lucru se realizează printr-un câmp suplimentar și setarea parametrilor folosindu-l.

Adăugați atributul „DateRemaining” de tipul „Data” și transferați-l în elementele formularului. În evenimentele de câmp, creăm evenimentul „OnChange” și scriem codul pentru setarea parametrului „CurrentDate” utilizat în cererea dinamică. Pentru ca la deschiderea formularului utilizatorul să înțeleagă imediat la ce dată vede soldurile, vom face mici modificări în procedura „When CreatedOnServer”.



&OnServerProcedureWhenCreatingOnServer(Eşec, StandardProcessing)RemainingDate = CurrentSessionDate(); Item Remains.Parameters.SetParameterValue("CurrentDate", RemainingDate); Sfârșitul procedurii &Pe procedura client Data rămasăWhenChanged(Element)Nomenclatură Remaining.Parameters.SetParameterValue("CurrentDate",RemainingDate); Sfârșitul procedurii

Ca rezultat, formularul nostru de listă dinamică poate reflecta solduri la orice dată.

Am luat în considerare doar o mică parte din capacitățile acestui set de instrumente, dar acest lucru este deja suficient pentru a înțelege comoditatea acestui tip de listă dinamică. Un mecanism similar este utilizat pentru multe sarcini, dar se găsește cel mai adesea în configurații tipice în forme gestionate:

  1. Selecţie;
  2. Liste.

Pentru a primi o listă dinamică și solicitarea acesteia în formulare standard gestionate, dezvoltatorul trebuie să deschidă formularul dorit în configurator. În secțiunea de detalii, găsiți detaliile cu tipul de date „DynamicList” (cel mai adesea este evidențiat cu caractere aldine). Proprietățile sale conțin textul solicitării, selecții și alte setări.

Platforma 1C:Enterprise 8.2 poate lucra cu multe înregistrări dintr-un tabel de bază de date într-un mod dinamic, adică să citească date în porțiuni. Anterior, în articole, am analizat mecanismul listelor dinamice și metodele de optimizare a lucrului cu acestea.

Astăzi vom rezolva o problemă non-standard pentru listele dinamice. Va trebui să calculăm totalul folosind atributul de document „Sumă” și să îl afișăm în subsolul listei. În mod similar, calculați valoarea medie pentru câmpul „Evaluare” și afișați-o și în subsolul listei dinamice. Calculul câmpurilor totale trebuie să țină cont de selecția stabilită de utilizator în setările listei de documente.

Întreaga dificultate constă în faptul că o listă dinamică nu primește toate intrările deodată, ci le primește pe porțiuni. În consecință, nu putem obține imediat un rezumat al tuturor documentelor corespunzătoare selecției curente. Cum se calculează totalul?

Implementarea

Și așa, să trecem la rezolvarea problemei. Să începem cu schimbarea formei, apoi vom descrie algoritmul de obținere a valorilor finale.

Formă și interfață

Mai întâi, să pregătim un formular de document pentru a afișa câmpurile rezultate. Pentru a face acest lucru, vom adăuga două detalii șir de formă „Evaluare” și „Sumă”.

Valorile totale pentru documente vor fi consemnate în aceste detalii.

Pentru a afișa valorile detaliilor în subsolul unei liste dinamice, trebuie să activați opțiunea corespunzătoare pentru elementul asociat din formularul de listă (vezi următoarea captură de ecran).

Acum trebuie să decideți despre ce eveniment vor fi actualizate rezultatele din subsolul listei. Pentru ușurința dezvoltării, să adăugăm comanda „Actualizare” și elementul de formular corespunzător în panoul de comandă. Când această comandă este executată, totalurile vor fi actualizate.

În configurația de testare, pe care o puteți descărca din linkul de la sfârșitul articolului, am adăugat și un eveniment de actualizare rezumat la înregistrarea unui document. În acest caz, se utilizează mecanismul de notificare prin formular. Nu ne vom opri mai detaliat asupra acestui lucru.

Algoritm

Cea mai problematică parte rămâne - trebuie să obțineți valorile totale. Să procedăm astfel: vom forma o cerere către baza de date pentru a obține valorile câmpurilor finale în conformitate cu selecția stabilită în lista dinamică. Merită luat în considerare faptul că selecția poate avea o condiție complexă din grupuri.

Notă: setările pentru listele dinamice (vezi captura de ecran de mai sus) se bazează pe mecanismele sistemului de compoziție a datelor (DCS). În consecință, puteți lucra cu ele într-un mod similar (adăugarea, modificarea, citirea, etc.) în mod programatic.

Etapele formării unei cereri pentru obținerea rezultatelor sunt următoarele:

1. Primim cererea inițială pentru lista dinamică.

După cum putem vedea, cererea selectează toate detaliile documentului. Pentru a adăuga puțin mai multă complexitate, am adăugat propriul meu câmp „Nivel de evaluare”, generat de constructul „SELECT”.

2. Formăm textul condițiilor de solicitare (secțiunea „UNDE”) și îl înlocuim în cererea inițială.

Trebuie să adăugăm condiții la textul de solicitare sursă primit în conformitate cu selecția configurată a listei dinamice.

Procedura, în funcție de tipul elementului de selecție trecut (grup sau element de selecție), generează textul de condiție corespunzător. Toate condițiile dintr-un grup sunt înconjurate de paranteze, iar cele incluse în grup sunt, de asemenea, înconjurate de paranteze. Condițiile dintre expresii depind de grupul părinte (o condiție „ȘI” este plasată între elementele de sus din ierarhie).

Dacă un element are setat un indicator de utilizare (proprietatea „Utilizare”), atunci elementul este procesat. Textul generat depinde și de condiția de comparare (Egal, nu, într-o listă etc.). Dependența textului de condiție generat de tipul de comparație poate fi văzută în următoarea funcție.

O altă funcție interesantă, în opinia mea, este „GetFieldTextByView”. Este necesar pentru a înlocui câmpurile care sunt formate din expresii limbajului de interogare în condițiile de interogare. Mai sus, am adăugat câmpul „Nivel de evaluare” la cererea inițială. Dacă utilizatorul îl folosește în selecție, atunci întreaga expresie trebuie înlocuită în condiția de interogare. Această funcție primește textul câmpului din cerere pe baza reprezentării acesteia. Pentru astfel de câmpuri complexe, va returna întregul text al expresiei.

Pentru mai multe detalii despre algoritm, consultați configurația de testare atașată articolului. Mai jos este o captură de ecran a setărilor de selecție și a condițiilor de solicitare generate pentru acestea.

Textul condiției generat este atașat la cererea originală a listei dinamice. Rezultatul interogării este plasat într-un tabel temporar.

3. Plasăm prima interogare într-un tabel temporar și efectuăm grupări pe câmpuri rezumative cu funcțiile agregate necesare.

Permiteți-mi să vă reamintesc că trebuie să obținem valoarea medie pentru câmpul „Evaluare” și suma totală pentru câmpul „Suma”. Am generat deja o solicitare ținând cont de selecții; tot ce rămâne este să calculăm valorile totale. Aceasta se face cu următoarea solicitare:

După executarea cererii, procesăm rezultatul rezultat, îl returnăm clientului și îl scriem în detaliile formularului pe care le-am creat mai devreme. În cele din urmă, rezultatele sunt afișate în subsolul listei dinamice (vezi prima captură de ecran din articol).

Optimitatea soluției

În general, această abordare poate avea un impact negativ asupra performanței. De exemplu, dacă programul calculează totalul fără o selecție setată într-o listă dinamică, atunci numărul de înregistrări selectate poate fi mare (de exemplu, pe mai mulți ani). Ca urmare, fiecare actualizare a rezultatelor poate dura zeci (!!!) secunde. Prin urmare, are sens să se calculeze rezultatele numai dacă selecția a fost stabilită. Am stabilit aceste condiții într-o configurație de testare.

În plus, putem calcula totalurile și cererea doar pe partea serverului. Prin urmare, trebuie să abordați cu seriozitate serverul, deoarece procedura de actualizare a totalurilor poate fi efectuată foarte des. Imaginați-vă un jurnal de chitanțe de casă de marcat într-o organizație comercială, unde pot fi introduse până la 5 chitanțe pe minut și până la 300 de chitanțe pe oră. De fiecare dată când este scris un document, totalurile vor fi actualizate. Prin urmare, ar fi rezonabil să se reducă traficul transmis utilizând proceduri în afara contextului.

Următoarea captură de ecran arată codul programului pentru apelarea unei funcții de server în afara contextului care returnează totaluri.

Primul parametru trece selecția listei dinamice, al doilea este o structură de tip „SelectionFieldNameSelectionFieldValueType”. Vă rugăm să rețineți că primul parametru din funcție este obținut ca valoare proprie. Nu pot spune exact de ce, dar dacă treceți selecția ca link, platforma dă o eroare care afirmă că selecția nu poate fi modificată. Eroarea a fost ocolită numai în acest fel.->

Notă: utilizarea procedurilor în afara contextului vă permite să reduceți dimensiunea traficului transmis de mai multe ori, deoarece datele din formular nu sunt transmise către server, spre deosebire de procedurile de server sensibile la context (directiva „&OnServer”).

Concluzie

În concluzie, voi spune că această abordare a calculării totalurilor într-o listă dinamică este incorectă din punct de vedere al metodologiei de dezvoltare. Ar fi corect să obținem totalul pe registre. De exemplu, în jurnalul de cecuri, din nou, putem obține suma de bani din casa de marcat curentă fie din documente, fie din registrul de acumulare corespunzător.

În plus, utilizarea registrelor de acumulare vă va permite să calculați totaluri fără a ține cont de selecție, deoarece sistemul funcționează optim cu totaluri deja calculate pentru lunile precedente.

Cu toate acestea, metoda descrisă în articol are loc la rezolvarea problemelor.

Fișiere pentru descărcare:

Imprimare (Ctrl+P)

Lista dinamica

1. Informații generale

O listă dinamică este un tip de date special care vă permite să afișați informații arbitrare din tabelele bazei de date într-un formular. Pentru a face acest lucru, trebuie să specificați tabelul din care doriți să afișați datele sau să descrieți selecția rezultată într-un limbaj de interogare.
Mecanismul se bazează pe un sistem de compunere a datelor și oferă capabilități de sortare, selectare, căutare, grupare și formatare condiționată a datelor primite. În acest caz, sursa de date este o solicitare, care fie este generată de sistem automat (pe baza datelor specificate), fie scrisă manual de către dezvoltator.

Orez. 1. Opțiuni pentru crearea unei liste dinamice

La crearea atributelor de formular de tip DynamicList un dezvoltator poate alege două moduri de a forma o interogare de date:
● Prin specificarea tabelului principal - în acest caz, trebuie doar să specificați tabelul (proprietatea tabelului principal) de la care doriți să primiți date, iar sistemul va genera automat o interogare pentru date (vezi partea dreaptă din Fig. 1).
● Generarea manuală a unei cereri - pentru aceasta trebuie să setați proprietatea Custom request (vezi partea stângă a Fig. 1). După aceasta, va fi disponibilă generarea manuală a unei cereri de obținere a datelor din baza de informații.
O interogare poate prelua date din mai multe tabele, astfel încât să puteți specifica un tabel principal. Aceasta pentru ca lista dinamică să poată determina care date sunt primare și care sunt secundare și să poată selecta și afișa corect informații, precum și să ofere comenzi standard. Cu toate acestea, dacă este imposibil să se determine tabelul principal în interogare, atunci nu poate fi specificat, dar apoi
lista dinamică nu va furniza comenzi legate de tabelul principal. În plus, în acest caz (fără a specifica tabelul principal) eficiența obținerii datelor printr-o listă dinamică va fi semnificativ redusă.
Pentru a îmbunătăți performanța, se recomandă ca orice alăturare utilizată într-o interogare personalizată numai pentru a obține date suplimentare să fie opțională prin utilizarea unei extensii de limbaj de interogare a sistemului de compunere a datelor.
Pentru o listă dinamică, care este principalul atribut al formularului, este posibil să setați valori de selecție folosind un parametru de formular Selecţie. Pentru a face acest lucru, este necesar ca numele proprietății structurii să fie situat în parametru Selecţie,
a coincis cu numele câmpului de selecție a listei dinamice. În acest caz, valoarea proprietății structurii va fi setată ca valoare corectă a elementului de selecție. Dacă o matrice, o matrice fixă ​​sau o listă de valori este transmisă ca valoare a unui element din parametrul Selecție al unui formular de listă dinamică, atunci la selecție se adaugă o condiție cu opțiunea În listă, în valoarea corectă. din care este plasată o listă de valori (în care sunt convertite matricea și matricea fixă).
O interogare arbitrară într-o listă dinamică poate fi o interogare în care un parametru este utilizat pentru a genera valoarea unui câmp, de exemplu:

ALEGE
ALEGERE
CÂND Livrare.Coeficient = 1 ATUNCI &Prezentare
Altfel Livrare. Coeficient
END AS Raport
DIN

În plus, dacă tipul valorii parametrului diferă de tipul atributului obiectului (de exemplu, Recuzită1 are tip Număr, iar valoarea parametrului este tip Linia), apoi pentru a afișa câmpul corect, trebuie să turnați în mod explicit valoarea parametrului la tipul dorit:

ALEGE
ALEGERE
WHEN Delivery.Coeficient = 1 THEN EXPRESS(&Reprezentare AS String(100)) ELSE Livrare. Coeficient
END AS Raport
DIN
Document.Livrarea produselor CUM se livrează

Dacă câmpul prin care este setată selecția este dezactivat folosind opțiuni funcționale, atunci selecția printr-un astfel de câmp nu este instalată, chiar dacă valoarea selecției este transmisă ca parametri de formular sau legături ale parametrilor de selecție.
Folosind proprietatea Citire date dinamice, indicați unei liste dinamice necesitatea citirii datelor în porțiuni mici
(pentru mai multe detalii despre modalitățile de obținere a datelor folosind o listă dinamică și memorarea în cache a datelor, consultați mai jos). Indiferent de acest atribut, se aplică următoarele condiții:

● Dacă modul de vizualizare este setat pe listă ierarhică, vor fi citite numai datele grupului curent și datele tuturor elementelor părinte (fără copii).
● Dacă modul de vizualizare arborescent este setat, vor fi citite numai datele de la nodurile arborescente deschise.
● Încărcarea unică a datelor din lista dinamică nu este acceptată dacă este setată navigarea ierarhică (proprietatea de afișare este setată la Arborele) și afișarea inițială a arborelui este setată la Extindeți toate nivelurile. Pentru a obține date, se vor face atâtea cereri către server câte noduri există în lista afișată.
În cadrul unei singure extrageri de date, o listă dinamică reutiliza tabelele temporare create anterior dacă sunt îndeplinite următoarele condiții:
● Interogarea lotului de listă nu are interogări după interogarea lotului principal.
● Compoziția tabelelor temporare și a câmpurilor din acestea este neschimbată față de execuția anterioară a cererii de lot.

În activitatea sa, lista dinamică utilizează valorile următoarelor proprietăți ale detaliilor obiectului metadatelor:
● format,
● format de editare,
● indiciu,
● semn pentru evidențierea valorilor negative,
● mască,
● semn de mod cu mai multe linii,
● semn de editare avansată,
● modul parolă.
La afișarea și editarea selecției și a parametrilor sistemului de compunere a datelor se folosește formatul de editare al câmpului corespunzător.

2. Limitări și caracteristici

Când setați selecția într-o listă dinamică, rețineți că selecția nu afectează grupurile dacă modul de afișare pentru lista dinamică este Listă ierarhică sau Arboresc. Prin „grupuri” înțelegem un element dintr-un director sau plan de tipuri caracteristice a cărui proprietate ThisGroup este setată la True.
Calificările aplicate automat printr-o listă dinamică detaliilor standard Proprietar, Părinte, Data, Perioada și AcestGrup sunt aplicate
folosind instrumente standard ale sistemului de compunere a datelor. Selecția, aplicată automat printr-o listă dinamică câmpurilor cheie, poate fi aplicată atât prin mijloace standard ale sistemului de compunere a datelor, cât și prin adăugarea directă de condiții la textul de solicitare. ÎN la câmpurile tabelului principal. Ca urmare a aplicării selecțiilor folosind instrumente de layout, acestea pot fi aplicate atât în ​​interogări imbricate, cât și în parametrii tabelelor virtuale.

Când dezvoltați liste dinamice, este recomandat să testați toate listele dinamice cu interogări personalizate. În timpul procesului de verificare, ar trebui să vă asigurați că, dacă o interogare de listă conține interogări imbricate sau tabele virtuale, iar în acestea sunt disponibile câmpuri cu aliasuri care se potrivesc cu aliasurile detaliilor standard Proprietar, Părinte, Data, Perioada, AcestGrup sau câmpurile cheie sunt disponibile pentru selectarea, atunci aceste câmpuri sunt valide corespund detaliilor standard cu care se potrivește porecla lor. Dacă nu este cazul, ar trebui să modificați cererea astfel încât să se potrivească sau
porecla era alta.
Dacă alegeți să generați manual o solicitare, atunci unele restricții sunt impuse cererii:
● Utilizarea instrucțiunii FIRST într-o interogare de listă dinamică nu este acceptată. Dacă trebuie să utilizați o selecție limitată de numărul de înregistrări dintr-o listă dinamică, ar trebui să reluați cererea de generare a unei liste dinamice în așa fel încât conținutul real al cererii să fie plasat într-o subinterogare și să limitați numărul de înregistrări primite în această subinterogare. De asemenea, puteți utiliza un tabel temporar în loc de o subinterogare.
● Selectarea, sortarea și gruparea nu sunt acceptate:

  • Conform detaliilor părților tabulare.
  • Vizualizați câmpuri.
  • Câmpul DataVersion.
  • Câmp PredefinedDataName.
  • Câmp de tip tabel de plan de conturi.
  • Câmp Tip de mișcare a tabelului de registru de acumulare.
  • Tipul câmpului Valori ale tabelului cu plan de tip caracteristic.
  • Câmp de tip Tip;
  • Câmp de tip String (lungime nelimitată).
  • Câmp de tip BinaryData.

● Sortarea și gruparea după câmpurile Subconto nu este acceptată<НомерСубконто>și ViewSubconto<НомерСубконто>Tabelele MișcăriSubconto al registrului contabil.
● Gruparea după câmpuri care sunt expresii limbaj de interogare care conțin funcții agregate nu este acceptată.
● Când este selectat tabelul principal, interogarea listă dinamică are următoarele restricții:

  • Aderările nu sunt acceptate.
  • Secțiunea ORDER BY nu este acceptată. Ar trebui să utilizați o interogare fără un tabel principal sau să setați ordinea necesară prin setările listei dinamice.

● Dacă o listă dinamică este afișată ca listă ierarhică sau arbore, atunci o intrare nu va fi afișată ca listă dinamică decât dacă este afișat cel puțin un părinte al acelei intrări. Cu alte cuvinte, pentru a afișa un element dintr-o listă ierarhică, o listă dinamică trebuie să afișeze și toți părinții acelui element până în partea de sus a listei. În acest caz, prin partea de sus a listei ne referim la oricare
elementul rădăcină al obiectului ierarhic afișat de o listă dinamică sau elementul setat ca proprietatea ParentTopLevel a unei extensii de tabel de formular pentru o listă dinamică.

Utilizarea următoarelor tabele ca tabel principal al unei liste dinamice nu este acceptată:

● Un tabel care nu are o cheie care să identifice în mod unic fiecare înregistrare de tabel (o referință pentru tabelele cu obiecte și o cheie de înregistrare pentru tabelele cu registre). Cu toate acestea, următoarele tabele pot fi setate ca tabel principal al unei liste dinamice (în ciuda faptului că nu au o cheie):

● Tabelul subconto al registrului contabil;
● toate tabelele virtuale ale registrului contabil, cu excepția tabelului MovementsSubconto;
● tabele cu valori constante (inclusiv tabelul Constante);
● tabele de surse de date externe fără câmpuri cheie;
● tabele cuburi ale surselor de date externe;
● tabele de registru de acumulare:

  • masa de revoluție;
  • masa de echilibru;
  • tabelul cifrei de afaceri și soldurilor.

● tabele registrului de calcul:

  • tabelul perioadei de valabilitate efectivă;
  • date de program;
  • date de bază.

● Tabele cu părți tabelare ale obiectelor;
● Tabele de înregistrare a modificărilor (utilizate în mecanismele de schimb de date);
● Tabele de succesiuni;
● Tabele de conversie (utilizate în mecanismele de decontare periodică).
● Un tabel care este utilizat într-o interogare numai într-o îmbinare exterioară.

Cu alte cuvinte, o listă dinamică cu tabelul principal specificat va funcționa corect dacă, ca urmare a executării interogării,
specificat ca sursă de date, numărul de rânduri obținut din tabelul principal nu crește (ținând cont de selecția impusă). Dacă, ca urmare a executării unei interogări, numărul de rânduri obținut de interogarea din tabelul principal crește, aceasta va duce la o încălcare a unicității cheii înregistrărilor tabelului afișat de listă. În acest caz, trebuie să dezactivați utilizarea tabelului principal cu liste dinamice.
Când lucrați cu o listă dinamică, trebuie să luați în considerare drepturile de acces la detaliile afișate de listă:
● Datele din coloanele din listă dinamică care sunt marcate cu proprietatea Always Use, dar pentru care utilizatorul curent nu are dreptul de vizualizare, nu sunt transmise către client. Acces la datele unor astfel de coloane (folosind proprietatea CurrentData și metoda RowData())
nu este posibil din partea clientului.
● Dacă utilizatorul curent nu are dreptul de vizualizare pe un câmp cheie al unei liste dinamice, preluarea datelor din acea listă dinamică duce la o eroare de încălcare a accesului.
Pentru o listă dinamică care afișează o listă de enumerare, nu există nicio opțiune de personalizare interactivă a listei.
Compoziția coloanelor și setările listei dinamice sunt asociate câmpurilor de interogare folosind aliasuri ale câmpurilor de selecție. Dacă un alias nu este specificat în mod explicit într-o interogare pentru un câmp de selecție și câmpul este unul de sistem, atunci numele câmpului pentru versiunea în limba engleză a limbii încorporate este folosit ca alias.
Relația specificată înseamnă că atunci când se schimbă (sau se specifică în mod explicit un alias pentru un câmp pentru care a fost folosit un alias automat)
alias-ul câmpului de interogare care generează datele listei dinamice, setările atributelor listei dinamice se vor pierde, elementele formularului vor „pierde” detaliile afișate, setările listei dinamice vor deveni incorecte etc.
Dacă sursa de date a unei liste dinamice este un tabel (regulat sau virtual), care vă permite să setați o selecție după perioadă, atunci dacă utilizatorul setează perioada de afișare într-o astfel de listă dinamică (comanda Set date interval...),
limitele perioadei specificate vor fi setate ca valori de selecție sau parametri de tabel virtual. Dacă prin intermediul extensiei de limbă
interogări pentru sistemul de compunere a datelor, numele parametrilor tabelului virtual au fost specificate în mod explicit - parametrii cu specificați
nume. Tabele pentru care este posibil să se controleze perioada de afișare sau prelucrare a datelor:
● tabele de înregistrare (principale sau virtuale), pentru care se poate selecta după perioadă (pentru registrul de calcul - după perioadă de înregistrare);
● tabelele principale de documente, procese de afaceri și sarcini;
● tabelele principale ale jurnalelor de documente;
● tabele de secvențe principale, tabele de delimitare a secvenței.
Parametrul de interogare a listei dinamice poate fi o matrice sau o listă de valori. Cu toate acestea, dacă parametrul este o listă de valori, atunci doar prima valoare din listă va fi folosită ca valoare de selecție. Dacă o listă dinamică utilizează o interogare cu parametri, setarea inițială a valorilor parametrilor trebuie efectuată în handlerul OnCreateOnServer.
Când afișați datele din lista dinamică, țineți cont de următoarele puncte:
● Când modificați în mod programatic proprietățile unei liste dinamice, panourile de comandă asociate listei nu sunt repopulate automat.
cu această listă dinamică.
● Dacă mai multe câmpuri sunt grupate într-un grup cu modul de grupare într-o celulă și în câmpurile grupate există un câmp care este afișat ca casetă de selectare, atunci această casetă de selectare va fi întotdeauna afișată prima în celula rezultată (în stânga casetei). text).
Într-o listă dinamică, atunci când se determină tipul de date pentru câmpurile ale căror expresii includ parametri, câmpuri sau literale, tipul rezultat este determinat de tipurile de câmpuri și literale. Dacă tipul valorii parametrului nu este inclus în tipul de date rezultat, valoarea acestuia va fi trunchiată.
De exemplu, în exemplul următor câmpul va fi de tip Număr.

ALEGERE
CÂND ESTE MINCIUNĂ
ATUNCI 5
IN CAZ CONTRAR
&Parametru
Sfârşit

Dacă setați parametrul Parametru la o valoare de alt tip, lista dinamică pentru acel câmp va primi valoarea 0 (valoarea implicită pentru tipul Number).
Dacă într-o astfel de situație trebuie să selectați un parametru de alt tip, este recomandat să utilizați constructul limbajului de interogare EXPRES. De exemplu,
dacă în exemplul de mai sus trebuie să treceți un șir de caractere nu mai mare de 100 de caractere în parametru, atunci ar trebui să înlocuiți indicația simplă a parametrului cu o expresie cu un tip explicit:

ALEGERE
CÂND ESTE MINCIUNĂ
ATUNCI 5
IN CAZ CONTRAR
EXPRESS(&Parametru AS String(100))
Sfârşit

Dacă textul arbitrar al unei cereri de listă dinamică folosește parametri în expresiile câmpurilor de selecție, ar trebui să indicați în mod explicit tipul de parametri folosind constructul EXPRES. De exemplu, în loc de &Nomenclatură AS Nomenclatură utilizare
EXPRESS(&Nomenclatură AS Directory.Nomenclatură) AS Nomenclatură. În caz contrar, căutarea prin bara de căutare poate funcționa
incorecte sau produc erori.

3. Metode de preluare și stocare în cache a datelor cu o listă dinamică

Când obțineți date de afișat, o listă dinamică folosește una dintre cele trei metode:
1. Citirea din baza de date se realizează în bucăți cu un număr de elemente de date puțin mai mare decât numărul de rânduri afișat simultan de listă (dar nu mai puțin de 20). Datele nu sunt stocate în cache pe server.
2. Citirea din baza de date se face în pagini de 1.000 de articole de date. Datele sunt stocate în cache pe server. Datele ierarhice sunt stocate în cache: nu sunt stocate în cache mai mult de 2 pagini de elemente pentru fiecare părinte. Nu mai mult de 20 de pagini de articole sunt stocate în cache per listă dinamică. Memorarea în cache va fi activată de o listă dinamică pentru următoarele tabele:
● Criterii de selecție;
● Toate tabelele din registrul contabil, cu excepția tabelului principal și a tabelului MovementsSubconto;
● Toate tabelele de registru de acumulare, cu excepția tabelului principal;
● Toate tabelele din registrul de informații, cu excepția tabelului principal;
● Toate tabelele din registrul de calcul, cu excepția tabelului principal;
● Tabel virtual de sarcini de executant;
● Tabele surselor externe fără chei;
● Cuburi din surse externe.

3. Citirea din baza de date se realizează în pagini de 1.000 de elemente. Prima porțiune este egală cu 1 pagină. Fiecare porțiune ulterioară crește cu 1 pagină (când se ajunge la sfârșitul eșantionului precedent). Cu cât „punctul de vedere” se deplasează mai aproape de sfârșitul datelor afișate, cu atât eșantionul este mai mare din baza de date, devenind în cele din urmă egal cu toate datele afișate. Datele sunt stocate în cache pe server. Numărul maxim de intrări în memoria cache și în lista dinamică este de 1.000.000.
În funcție de ceea ce este selectat de tabelul principal al listei dinamice și de ce valoare ia proprietatea de citire dinamică, se utilizează una sau alta metodă de citire a datelor:

● Unul dintre următoarele tabele este specificat ca valoare a proprietății Tabel principal: plan de schimb, director, listă de documente, jurnal document, plan de tipuri de caracteristici, plan de conturi, plan de tipuri de calcul, proces de afaceri, sarcină, tabel de puncte de proces de afaceri:



● Unul dintre următoarele tabele este specificat ca valoare a proprietății Main table: tabelul principal al registrului de informații, registrul de acumulare, registrul contabil, registrul de calcul, tabelul virtual al registrului contabil MovementsSubconto:

● Proprietatea de citire dinamică:
● Instalat: se utilizează metoda 1 (descrierea metodelor este dată mai sus).
● Resetare: Se utilizează metoda 2 (descrierea metodelor este dată mai sus).

● Proprietatea tabel principal conține tabelul de criterii de selecție sau tabelul de sarcini după executant (sarcini după executant):
● Cheie de identificare a unui rând de tabel: Link.

● Proprietatea Main table specifică tabelul virtual al registrului de informații SliceFirst sau SliceLast:
● Cheie de identificare a unui rând de tabel: RecordKey.
● Proprietatea de citire dinamică nu este aplicabilă.
● Se utilizează metoda 2 (descrierea metodelor este dată mai sus).

● Proprietatea tabelului principal este setată la unul dintre tabelele de registru virtual, cu excepția celor enumerate mai sus:

● Proprietatea de citire dinamică nu este aplicabilă.

● Proprietatea tabelului principal nu este specificată, este utilizată o interogare arbitrară:
● Cheie de identificare a unui rând de tabel: Număr.
● Proprietatea de citire dinamică nu este aplicabilă.
● Se utilizează metoda 3 (descrierea metodelor este dată mai sus).

Pentru afișare, datele sunt transferate către client în porțiuni, a căror dimensiune este similară cu dimensiunea porțiunii din prima metodă de citire a datelor (descrisă la începutul acestei secțiuni).
Când creați un formular care conține o listă dinamică, 45 de elemente de date pentru fiecare listă dinamică vizibilă sunt inițial transmise clientului (dacă lista are mai mult de 45 de elemente). Dacă lista dinamică afișează mai mult de 45 de rânduri, se va efectua un apel suplimentar de server atunci când formularul este deschis pentru a prelua elementele de date lipsă.

4. Setări dinamice ale listei

Setări Lista proprietăților - făcând clic pe hyperlinkul Deschidere se deschide un formular pentru configurarea afișajului unei liste dinamice. Configurarea unei liste se face în același mod ca și operațiuni similare într-un sistem de compunere a datelor.


Orez. 2. Stilul condiționat al unei liste dinamice

La configurarea unei liste dinamice în configurație, dezvoltatorul aplicației are posibilitatea de a face următoarele:
● setați câmpurile după care doriți să sortați;
● descrieți selecția datelor din listă;
● specificați setări de aspect condiționat;
● setați câmpurile după care doriți să grupați datele.
Este logic să setați sortarea la dezvoltator dacă nu sunteți mulțumit de sortarea implicită setată de sistem.

SFAT. Trebuie amintit că o selecție slabă a câmpurilor de sortare (precum selecția și gruparea datelor) afectează negativ eficiența eșantionării dinamice.
Din punctul de vedere al unui dezvoltator de aplicații, setările listei dinamice constau din mai multe părți care sunt interconectate. Proprietatea principală prin care puteți gestiona setările unei liste dinamice este LinkerSettings. Acest obiect conține trei seturi de setări care, atunci când sistemul rulează, determină setările finale aplicate listei dinamice:
● Setări – setări create în modul Configurator. Proprietatea Ordine a listei dinamice oferă acces rapid la proprietatea Settings.Order a generatorului de setări a listei dinamice, astfel încât următoarele construcții sunt echivalente:
List.Order și List.SettingsLinker.Settings.Order;
● UserSettings – acestea sunt setări care sunt modificate de utilizator în modul 1C:Enterprise;
● Setări fixe – aceste setări sunt setate din limba încorporată. Această proprietate conține și valori de selecție care sunt transferate în formular folosind parametrii acestuia. Proprietățile listei dinamice Selecție, Opțiuni, Aspect condiționat oferă acces rapid la setările fixe ale generatorului de setări dinamice ale listei. Cu alte cuvinte, aceste apeluri sunt echivalente:
Listă.Setări Composer.FixedSettings.Selection și List.Selection.
La crearea setărilor finale pentru o listă dinamică, diferite opțiuni de setări sunt combinate după cum urmează:
● Dacă orice tip de setări este marcat în întregime ca personalizat, atunci setările rezultate includ setările personalizate
(List.ComposerSettings.UserSettings). Mai mult, dacă elementele de setări sunt marcate ca indisponibile, atunci aceste setări vor fi plasate în setările rezultate din proprietatea List.Settings Composer. Setări.
● Dacă orice tip de setări este marcat ca personalizat nu în întregime, ci element cu element, atunci:
● Elementele marcate ca personalizate vor fi incluse în setările rezultate din proprietatea List.SettingsComposer.CustomSettings.
● Elementele marcate ca indisponibile vor fi incluse în setările rezultate din proprietatea List.SettingsComposer.Settings.
● Setările fixe (List.SettingsComposer.FixedSettings) sunt adăugate la setările rezultate „ca atare”. În același timp, este inacceptabil ca setările fixe și ale utilizatorului să conțină setări cu același nume, de exemplu, selecție cu aceeași valoare stângă în condiție.

Dacă setările listei dinamice conțin setări care sunt dezactivate folosind opțiuni funcționale, aceste setări vor fi eliminate din lista setărilor disponibile atunci când datele din lista dinamică sunt preluate.
Controlul care setări vor fi disponibile pentru utilizator și care nu se face în fereastra de setări dinamice a listei.


Orez. 3. Controlați includerea în setările utilizatorului

Caseta de selectare din partea de jos a ferestrei (vezi Fig. 3) este responsabilă pentru plasarea întregului tip de setări în setări (normale sau rapide). Această caracteristică este disponibilă pentru selecție, ordonare, grupare și condiționare. Dacă setările sunt specificate cu modul de editare Selectare rapidă, atunci în proprietatea Grup de setări utilizator a tabelului formularului care afișează lista dinamică, trebuie să specificați un grup gol al formei în care elementele asociate cu setările rapide de utilizator ale va fi localizată lista dinamică. Dacă grupul nu este specificat, setările rapide ale utilizatorului nu vor fi afișate în formular. De asemenea, este posibil să invocați în mod explicit crearea de setări personalizate folosind limbajul încorporat folosind metoda CreateCustomSettingsFormItems() a extensiei de listă dinamică.
De asemenea, este posibil să alegeți dacă să plasați anumite elemente de setări în setările utilizatorului. Această caracteristică este disponibilă pentru selecția și elementele de proiectare condiționate (vezi Figura 3).

Dacă aveți nevoie de setări speciale care să fie încărcate la deschiderea unei liste dinamice, acest lucru se poate face în două moduri:
● Utilizarea parametrului de formular de listă dinamică UserSettings. Datele conținute în acest parametru vor fi plasate în setările listei dinamice ale utilizatorului.
● Utilizarea parametrului de formular de listă dinamicăUserSettingsKey. Dacă specificați acest parametru la deschiderea unui formular, atunci setările utilizatorului situate în depozitul de setări cu cheia specificată vor fi încărcate în lista dinamică, care este atributul principal al formularului.

5. Căutați într-o listă dinamică

O listă dinamică situată pe formular oferă posibilitatea de a căuta în mod interactiv datele afișate. Căutarea poate fi efectuată folosind următoarele instrumente: bara de căutare, dialog de căutare, căutarea valorii curente, folosind istoricul de căutare și setarea perioadei (pentru liste dinamice care afișează documente). Rezultatul căutării este un set limitat de înregistrări
o listă dinamică (dintre cele disponibile unui anumit utilizator) care corespund criteriilor de căutare.
Pentru a controla capabilitățile de căutare ale unei liste dinamice, există trei proprietăți de tabel pe formularul gestionat care afișează lista dinamică:
● Poziția șirului de căutare – determină poziția șirului de căutare. Poate lua următoarele valori: Auto, Bară de comandă, Nici unul, Sus, Jos.


Orez. 4. Căutați șir într-o listă dinamică

Dacă valoarea acestei proprietăți este setată la Panoul de comandă, atunci șirul de căutare va fi afișat în panoul de comandă al formularului (dacă lista dinamică este atributul principal al formularului) sau în panoul de comandă asociat listei dinamice. Bara de căutare plasată în bara de comandă este întotdeauna apăsată la marginea dreaptă a barei de comandă (împreună cu butoanele situate în dreapta barei de căutare).
Dacă proprietatea este setată la Nu, atunci șirul de căutare nu va fi în formular, iar când începeți să tastați șirul de căutare, se va deschide un dialog.
Dacă proprietatea este setată la Top, bara de căutare va fi situată între bara de comandă a listei și tabelul care afișează lista dinamică. Dacă proprietatea este setată la Jos, șirul de căutare va fi plasat imediat după tabelul care afișează lista dinamică.


● Dacă proprietatea Mod de compatibilitate este setată la Nu utilizați sau mai veche decât Versiunea 8.3.4 – valoarea este Panoul de comandă.
Accesați linia de căutare după cum urmează:
● Prin apăsarea combinației de taste Ctrl+F;
● Mouse;
● Când începeți să tastați într-o listă dinamică (ținând cont de valoarea proprietății SearchOnTyping a listei dinamice).
● View State Position – descrie unde va fi afișată starea de vizualizare: ce câmpuri au fost căutate și ce valori
căutat în fiecare domeniu. Poate lua următoarele valori: Auto, None, Top, Bottom


Orez. 5. Starea de căutare în lista dinamică

Dacă proprietatea este setată la Nu, atunci starea de vizualizare nu va fi prezentă în formular. Ca urmare, se va putea stabili dacă căutarea a fost finalizată sau nu numai prin disponibilitatea butonului Anulare căutare.
Dacă proprietatea este setată la Top, starea de vizualizare va fi situată între bara de comandă a listei și tabelul care afișează lista dinamică. Dacă proprietatea este setată la Jos, starea de vizualizare va fi plasată imediat după tabelul care afișează lista dinamică.
Dacă formularul a fost creat în 1C:Enterprise versiunea 8.3.4 și anterioară, proprietatea este setată la Nu. Dacă formularul a fost creat în 1C:Enterprise versiunea 8.3.5 și mai veche, proprietatea este setată la Auto. Valoarea reală a proprietății în acest caz se va determina după cum urmează:
● Dacă proprietatea Mod de compatibilitate este setată la Versiunea 8.3.4 (și mai mică) – valoarea Nu;
● Dacă proprietatea Mod de compatibilitate este setată la Nu utilizați sau mai veche decât Versiunea 8.3.4 – valoare Top;
● Poziție de control de căutare – Stabilește unde va apărea butonul de control de căutare. Butonul deschide un meniu care conține următoarele informații: comenzi Căutare după valoarea curentă, Căutare avansată, Anulare căutare, Setare perioadă (pentru liste de documente și jurnal) și istoric de interogări de căutare (ultimele 5 interogări). Proprietatea poate lua următoarele valori: Auto, None, Command panel.


Orez. 6. Gestionarea căutării într-o listă dinamică

Dacă proprietatea este setată la Nu, atunci butonul de control al căutării nu va fi pe formular (dar comenzile vor fi disponibile folosind meniul Mai multe). Valoarea proprietății Bară de comandă plasează un buton pe bara de comandă asociat cu un tabel care afișează o listă dinamică.
Dacă formularul a fost creat în 1C:Enterprise versiunea 8.3.4 și anterioară, proprietatea este setată la Nu. Dacă formularul a fost creat în 1C:Enterprise versiunea 8.3.5 și mai veche, proprietatea este setată la Auto. Valoarea reală a proprietății în acest caz se va determina după cum urmează:
● Dacă proprietatea Mod de compatibilitate este setată la Versiunea 8.3.4 (și mai mică) – valoarea Nu;
● Dacă proprietatea Mod de compatibilitate este setată la Nu utilizați sau mai veche decât Versiunea 8.3.4 – valoarea este Panoul de comandă;
Dacă există mai multe panouri de comandă într-un formular, sursa comenzilor pentru care este un tabel al formularului gestionat (afișând date dinamice ale listei), atunci linia de căutare și butonul de control al căutării vor fi localizate într-un singur panou de comandă:
● Sau în bara de comandă a listei dinamice în sine (dacă are activată completarea automată)
● Sau în oricare dintre panourile de comandă rămase.

Să ne uităm la caracteristicile utilizării căutării într-o listă dinamică:
● Pentru a face căutarea convenabilă de utilizat (inclusiv în ceea ce privește performanța), trebuie să activați căutarea full-text pentru toate obiectele de configurare care pot fi utilizate ca tabel principal al listei dinamice. De asemenea, căutarea full-text ar trebui să includă toate detaliile obiectelor de configurare care pot fi afișate într-o listă dinamică și pentru care poate fi necesară o căutare.
Dacă un obiect este exclus din căutarea cu text integral, atunci mecanismul de căutare în cauză va funcționa, dar performanța unei astfel de căutări va fi extrem de scăzută. Nu este recomandat să folosiți căutarea pe obiecte care nu sunt indexate prin căutarea full-text.
● Soluția aplicației trebuie să aibă o sarcină de rutină care actualizează în mod regulat indexul de căutare full-text.

● Căutarea nu se efectuează pe toate coloanele din lista dinamică (și obiectul de configurare), ci doar pe acele coloane care sunt afișate în tabel.
● Căutarea într-o listă dinamică după câmpuri de tipuri de referință cu reprezentare arbitrară este efectuată de câmpuri care sunt utilizate pentru
formarea reprezentării (vezi aici). Câmpurile incluse în vizualizare sunt obținute ținând cont de handlerul ViewFieldGettingProcessing() al obiectului corespunzător.
● Pentru listele dinamice cu un tabel principal specificat, căutarea text integral este utilizată pe tabelul principal. Toate linkurile neindexate din tabelul principal vor fi adăugate la rezultatele căutării cu text integral. Rezultatul unei căutări cu text complet pentru tabelul principal este utilizat ca selecție bazată pe câmpurile cheie. O căutare full-text este, de asemenea, efectuată pe câmpurile afișate în listă din alte tabele (dacă câmpul și obiectul de configurare utilizează căutarea full-text). Fără căutarea cu text complet activată, datele pot fi
găsit, dar căutarea în sine va fi foarte lentă.
Dacă apare o eroare în timpul încercării de a efectua o căutare full-text, căutarea va fi efectuată fără aplicarea căutării full-text.
De exemplu, acest lucru se poate întâmpla atunci când căutați o literă și un număr mare de rânduri în baza de informații care încep cu această literă.
● Dacă pentru un câmp din tabelul principal al unei liste dinamice se utilizează o selecție cu tipul de comparație Egal, atunci când se efectuează o căutare full-text, o valoare de selecție va fi adăugată la interogarea de căutare pentru acest tabel.
● Șirul de căutare este împărțit în cuvinte. Această partiție se realizează conform următoarelor reguli:
● Linia este întreruptă folosind spațiu și caractere tabulatoare ca delimitatori.
● Apoi fiecare fragment rezultat este procesat:
● Dacă fragmentul este o reprezentare a datei (cu sau fără oră) bazată pe locația sesiunii curente, atunci cuvântul este fragmentul.
● În caz contrar, fragmentul este împărțit în continuare folosind caracterele „,.-/\” ca delimitatori. În acest caz, fiecare fragment rezultat al șirului este luat ca un cuvânt.

● Pentru fiecare cuvânt se formează propriul set de condiții, care sunt combinate „prin SAU”. Acest set de condiții este generat dacă o căutare full-text pentru un anumit cuvânt din tabelul din care a fost obținut acest câmp a returnat cel puțin un obiect, sau o căutare full-text nu a fost folosită pentru acest câmp. Condițiile se formează după cum urmează:
● Pentru un câmp de tip String, condiția este FieldName LIKE %Word%.
● Pentru un câmp de tip Număr, condiția are forma FieldName=Valoare, unde Valoare este un cuvânt convertit în tipul Number. Dacă distribuția nu poate fi efectuată, căutarea pe teren nu va fi efectuată.
● Cuvântul este căutat ca subșir în reprezentarea booleană implicită definită pentru sesiunea curentă. Dacă cuvântul căutat este găsit într-o vizualizare, atunci caută valoarea corespunzătoare vizualizării în care a fost găsit cuvântul. În acest caz, căutarea nu utilizează vizualizări care sunt specificate folosind proprietatea Format element de formular.
● Pentru un câmp de tipul Data, condiția arată ca FieldName>=StartofDay(Word) ANDFieldName<=КонецДня(Слово). Если Слово подобно дате, в которой год
indicat cu una sau două cifre, anul va fi redus la secolul curent și această valoare va fi adăugată la condiția de căutare.
● Pentru câmpurile de referință, se efectuează o căutare pe câmpurile utilizate pentru a forma vizualizarea de referință. În fiecare dintre aceste câmpuri căutați
efectuate conform regulilor descrise mai sus. Căutarea nu utilizează câmpuri utilizate pentru a forma o reprezentare personalizată a datelor.
Setul de condiții pentru fiecare cuvânt este combinat „ȘI”.
● Pentru valorile cu zerouri inițiale, puteți căuta fie șirul cu zerouri inițiale, fie șirul specificat fără zerouri inițiale.
● Dacă o listă dinamică afișează o listă de documente sau un istoric al documentelor, intervalul de vizualizare a listei pe care îl specificați este afișat și în zona formularului rezervată pentru afișarea stării de vizualizare pentru lista dinamică dorită.
● Comanda de căutare după valoarea curentă nu este disponibilă dacă tabelul principal al listei dinamice este criteriul de selecție.
● Fragmentele de șir găsite sunt evidențiate când sunt afișate în tabel.
● Un singur șir de căutare este acceptat pentru o coloană. Când adăugați o nouă interogare de căutare pentru o coloană care este deja căutată, expresia de căutare va fi înlocuită, în loc să fie adăugate cele două interogări de căutare.
● Dacă formularul nu are o adăugare de element de formular a formularului Afișare șir de căutare asociată cu tabelul (proprietatea sursă adăugare element de formular) care afișează o listă dinamică, atunci apăsând combinația de taste Ctrl+F se deschide dialogul de căutare.


Orez. 7. Dialog de căutare

Dacă formularul conține o adăugare de element de formular a formularului Afișare șir de căutare asociată cu un tabel (proprietatea sursă adăugare element de formular) care afișează o listă dinamică, atunci pentru a deschide dialogul de căutare ar trebui să utilizați comanda Căutare avansată.
● Când utilizați dialogul de căutare, rețineți următoarele puncte:
● Deschiderea dialogului de căutare folosind o comandă rapidă de la tastatură face ca valoarea celulei curente să apară în linia Ce să căutați, iar valoarea comutatorului Cum să căutați este setată la După potrivire exactă.

● Deschiderea casetei de dialog de căutare prin începerea directă a introducerii unui șir de căutare în lista dinamică duce la faptul că valoarea comutatorului Cum se caută este setată la valoarea Prin o parte a șirului, iar textul tastat ajunge în câmpul Ce pentru a căuta câmpul.

6. Obținerea datelor afișate printr-o listă dinamică

Când utilizați liste dinamice, poate fi necesar să efectuați diverse acțiuni asupra datelor afișate în prezent de lista dinamică, ținând cont de selecțiile și căutările aplicate. Astfel de acțiuni includ: procesarea informațiilor afișate, de exemplu, retrimiterea documentelor selectate sau setarea unor detalii pentru obiectele selectate, generarea unei liste de obiecte disponibile (cu design etc.), de exemplu, pentru imprimare sau salvare într-un document de foaie de calcul.
Pentru a obține date care sunt afișate printr-o listă dinamică, ar trebui să utilizați GetExecutableDataCompositionSchema() și
GetExecutableDataCompositionSettings().
Exemplu de primire a datelor:

Schema = Elements.List.GetExecutableDataCompositionSchema();
Setări = Items.List.GetExecutableDataCompositionSettings();
LayoutLinker = newDataCompositionLayoutLinker();
LayoutLayout = LayoutComposer.Execute(Scheme, Settings);
CompositionProcessor = newDataCompositionProcessor;
LayoutProcessor.Initialize(LayoutLayout);
OutputProcessor = Nou OutputProcessorDataCompositionResultInTabularDocument;
ReturnOutputProcessor.Output(CompositionProcessor);

Introducerea datelor într-o colecție de valori (tabel sau listă de valori) se face în același mod.
Obținerea datelor din listă dinamică în acest mod are o serie de caracteristici care trebuie luate în considerare la dezvoltarea soluțiilor de aplicație:
● Următorul design de tabel nu este acceptat:
● Alternarea culorilor liniilor;
● Imagine antet;
● Poza subsolului;
● Culoarea fundalului subsolului;
● Culoarea textului subsolului;
● Font subsol;
● Pozitie orizontala in subsol;
● Modul parolă.
● Aspectul condiționat specificat pentru un formular gestionat nu este acceptat;
● Când ordonați un tabel ierarhic în ordine crescătoare după un câmp de tip Link, înregistrările care conțin o legătură goală sunt întotdeauna plasate pe primul loc.

În procesul de finalizare a configurațiilor, fiecare programator 1C întâlnește liste dinamice.
O listă dinamică este un obiect de interfață utilizat pentru a afișa diverse liste de obiecte de bază de date sau date non-obiect - intrări de înregistrare.
De exemplu, o listă dinamică este utilizată pentru a afișa o listă de articole:

Pentru a demonstra capabilitățile unei liste dinamice, să creăm procesare externă și să adăugăm formularul principal. Să adăugăm un nou atribut la formular cu tipul „Lista dinamică”. Să intrăm în proprietățile sale și să vedem ce este acolo.
Suntem interesați de proprietatea „Cerere personalizată”. Activarea acestuia ne va arăta toate capacitățile unei liste dinamice. Vom putea scrie o solicitare folosind aproape toate capabilitățile limbajului de interogare a sistemului 1C: Enterprise. Bifați caseta și faceți clic pe linkul „Deschidere”:

În mod implicit, lista noastră va afișa o listă de articole cu soldul total pentru toate depozitele. Pentru a implementa o astfel de listă, adăugați următoarea interogare:


Ca tabel principal, vom selecta „Directory.Nomenclature”, acest lucru ne va permite să lucrăm cu o listă dinamică, ca și cu o listă de nomenclatură - adăugați, modificați, marcați elemente de director pentru ștergere. De asemenea, instalarea tabelului principal face posibilă citirea dinamică a datelor - aceasta înseamnă că selecția se va face în porțiuni, după cum este necesar.
În continuare trebuie să creăm elemente de formular pentru lista noastră:

Dacă încercăm să rulăm procesarea în acest formular, vom primi o eroare:


Pentru a o elimina, trebuie să setați o valoare pentru parametrul „Perioadă”. Pentru a face acest lucru, puteți utiliza metoda „SetParameterValue” a colecției „Parameters” a listei dinamice. Metoda ia doi parametri:
. „Parametru” - Tip: șir; DataCompositionParameter. Numele parametrului sau al parametrului de compoziție a datelor a cărui valoare doriți să o setați;
. „Valoare” - Tip: Arbitrar. Valoarea de setat.
Poate fi apelat în handlerul „OnCreateOnServer” de forma:

Ai o întrebare sau ai nevoie de ajutor de la un consultant?


Vom oferi utilizatorului posibilitatea de a modifica perioada de primire a soldurilor. Pentru a face acest lucru, adăugați atributul și elementul de formular „Data” asociat cu acesta:


În handlerul „OnChange” al elementului de formular „Date”, vom apela metoda „SetParameterValue”, trecând valoarea atributului asociat ca valoare. În mod similar, să schimbăm procedura „La crearea pe server” a formularului. Deoarece metoda este disponibilă pe client, nu este nevoie să apelați serverul:


Acum, când data se schimbă, soldurile vor fi actualizate automat:




Să presupunem că utilizatorii doresc să vadă fie soldurile curente, fie încasările planificate. Să luăm în considerare una dintre opțiunile de implementare. Să adăugăm un atribut de formular de tip boolean și un comutator asociat:


La modificarea valorii comutatorului, vom schimba textul cererii. Pentru a face acest lucru, vom folosi handlerul de evenimente „On Change” pentru elementul de formular „Afișare cantitate la chitanță”. Trebuie să schimbăm proprietatea „QueryText” a listei dinamice în funcție de valoarea atributului. Deoarece această proprietate nu este disponibilă pe client, trebuie apelată o procedură de server:


Rezultatul modificărilor efectuate:



În cele din urmă, visul fiecărui copil de șapte ani s-a împlinit. Cât de des au solicitat utilizatorii programului 7.7 o selecție normală de articole? Astfel încât să puteți vedea soldurile, prețurile și să setați filtre. A trebuit să venim cu diverse trucuri, inclusiv să scriem componente externe. În 1C 8.2, au apărut liste dinamice. Propun să luăm în considerare ce este și ce ne pot oferi în 1C 8.3.

Să luăm ca bază o anumită configurație de test a 1C: „Enterprise Accounting 3.0”. Nu vom face o selecție acum, doar vom adăuga un alt formular de selecție în directorul „Nomenclatură” și îl vom face temporar principal:

Când este creat, sistemul va adăuga implicit un câmp de tabel de tip „Lista dinamică” la formular.

Să intrăm în proprietățile sale și să vedem ce este acolo.

În primul rând, ne interesează caseta de selectare „Solicitare personalizată”. Acest lucru ne va dezvălui toate avantajele unei liste dinamice. Vom avea ocazia să scriem propria noastră cerere, cu parametri. Bifați caseta și faceți clic pe linkul „Deschidere”:

Se va deschide o fereastră cu codul terminat în . Pentru moment, toate câmpurile directorului „Nomenclatură” sunt pur și simplu enumerate acolo.

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

După cum puteți vedea, există un buton de apel „ ” și o casetă de selectare care face posibilă modificarea dinamică a conținutului listei. Adică, atunci când un alt utilizator modifică ceva în director, se va schimba și în lista noastră. În plus, există o filă „Setări”, dar o vom atinge mai târziu.

Interogare personalizată în lista dinamică

Mai întâi, să creăm cererea de care avem nevoie cu solduri și prețuri. Ca asta:

fila „Setări”.

Și acum partea cea mai bună! Accesați fila „Setări”. Și vedem imediat că în prima filă putem face orice selecție pentru orice câmp din cerere:

Setarea programatică a parametrilor de interogare într-o listă dinamică 1C 8.3

Nu uitați că avem doi parametri în cerere: „Perioada” și „Tipul prețului”. Trebuie să le transmitem în cerere, altfel va apărea o eroare.

Să scriem acești parametri în parametrii formularului și să adăugăm următoarele linii în modulul formular:

&OnServerProcedureWhenCreatingOnServer (Eșec, Procesare standard) Listă. Opțiuni. SetParameterValue("Perioada" , Parametri. Data) ; Listă. Opțiuni. SetParameterValue("PriceType", Parameters.PriceType) ; Sfârșitul procedurii