1c ocoli tabelul cu liste dinamice.

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 simplifică foarte mult multe sarcini aplicate. De aceea, dezvoltatorii ar trebui să cunoască și să fie capabili să se ocupe de acest instrument versatil.

Caracteristicile listelor dinamice în 1C

scop de acest tip este de a afișa informații din orice tabel 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 cu siguranță să scrieți o interogare în limbajul 1C, deși această posibilitate există și trebuie să o utilizați. Puteți specifica pur și simplu tabelul, informațiile din care sunteți interesat, iar 1C va genera independent o interogare simplă.

Pentru a vedea cum se formează o listă dinamică și ce date arată, trebuie să deschideți formulare gestionate, unde se află, în configurator: în lista de detalii prin meniul contextual deschideți proprietățile sale și acordați atenție articolului „Cerere arbitrară”. Dacă nu există nicio casetă de selectare, atunci parametrul „Main table” reflectă tabelul bazei de date din care sunt preluate datele. În caz contrar, lista dinamică reflectă datele de interogare personalizate, care pot fi văzute prin deschiderea setării listei.

O schemă de interogare arbitrară este mult mai frecvent utilizată, deoarece oferă o oportunitate excelentă de a combina și afișa o mare varietate de date. Cel mai adesea, acest mecanism este utilizat pentru a reflecta soldurile stocurilor, prețurile articolelor, veniturile, cheltuielile sau achizițiile. Trebuie să îl utilizați cu atenție, deoarece performanța poate scădea în cazul interogărilor complexe.

O altă caracteristică utilă lista dinamica se deschide când faceți clic pe inscripția „Setări listă”. Acest meniu permite, chiar și atunci când se utilizează un set standard de câmpuri, să facă informațiile mai accesibile și mai ușor de înțeles pentru utilizatorii finali. Indiferent dacă este o solicitare arbitrară sau nu, veți vedea o filă „Setări” unde puteți specifica:

  • Selectarea unei liste dinamice;
  • grupari;
  • triere;
  • Decor.

Utilizarea parametrilor face listele dinamice destul de versatile și flexibile. De asemenea, le puteți lega de elemente de recuzită într-un formular gestionat, iar datele se vor schimba în funcție de opțiunile selectate de utilizator. Utilizarea acestor mecanisme poate fi înțeleasă și apreciată analizând exemple de probleme din lumea reală.

Ca exemplu, luați în considerare problema reflectării rămășițelor nomenclaturii pe o formă gestionată. În practica reală, astfel de comenzi sunt destul de comune în diverse configurații, iar lista dinamică este ideală ca instrument. Pentru această sarcină, va trebui să folosim o interogare arbitrară, parametrii listei dinamice și setările acesteia.

Pentru o mai mare claritate, vom crea un separat prelucrare externăși plasați o listă dinamică pe ea. Pentru a ne implementa planurile, vor exista puține tabele cu nomenclatură, așa că trebuie să permitem o solicitare arbitrară. În acesta, vom descrie conexiunea din stânga a cărții de referință cu lista de nomenclatură și registrul reziduurilor și vom stabili cartea de referință ca tabel principal. O astfel de schemă va permite utilizatorilor, în timp ce lucrează cu o listă dinamică, să adauge sau să modifice nomenclatura.



Alegeți o nomenclatură.Denumire.Denumire ca denumire,costuri de mărfuri și vânzări.Sklad ca depozit,costari de mărfuri și vânzări.Social -proiecte ca număr de instalații dintr-un director.Nomenclator ca nomenclator al conexiunii din stânga a registrului. Continuitate. Ieșire (iv auhitsaydata,)

Deoarece parametrul CurrentDate a fost folosit în cererea noastră, trebuie să îi setăm valoarea înainte de a utiliza procesarea. Pentru a face acest lucru, în modulul de formular din procedura „On CreationOnServer” printr-o comandă standard, atribuiți-i funcția „CurrentSessionDate” cu o comandă standard. De asemenea, trebuie să afișăm o listă dinamică pe formularul de control și să schimbăm ordinea câmpurilor pentru claritate. Trageți elementele de recuzită „Nomenclature Remains” în elementele formularului (stânga sus) și utilizați săgețile albastre pentru a schimba ordinea câmpurilor din tabelul din formular.

&La Procedura Server La CreareLa Server(Eșec, Procesare Standard) Nomenclatura rămâne.Parameters.SetParameterValue("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 nomenclatură și grupuri și să căutăm. Adesea, clienții solicită să adauge posibilitatea de a alege data pentru care vor vedea soldul. În cazul unui formular cu o listă dinamică, aceasta este furnizată de câmp suplimentarși setarea parametrilor cu acesta.

Adăugăm atributul „Data rămasă” de tipul „Data” și îl transferăm în elementele formularului. În evenimentele de câmp, creăm un eveniment „OnChange” și scriem codul pentru setarea parametrului „CurrentDate” utilizat în interogarea dinamică. Pentru ca la deschiderea formularului, utilizatorul să înțeleagă imediat la ce dată vede soldurile, vom face mici modificări în procedura OnCreateOnServer.



&OnServerProcedureOnCreateOnServer(Eșec, StandardProcessing)RemainsDate = CurrentSessionDate(); Element Remains.Parameters.SetParameterValue("CurrentDate", RemainsDate); Sfârșitul procedurii &La procedura client RemainsDateOnChange(Element) Item Remains.Parameters.SetParameterValue("CurrentDate",RemainsDate); EndProcedure

Ca rezultat, formularul nostru Dynamic List poate afișa solduri pentru orice dată.

Am acoperit 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 o varietate de sarcini, dar se găsește cel mai adesea în configurații tipice V formulare gestionate:

  1. selecţie;
  2. Liste.

Pentru a obține o listă dinamică și cererea acesteia în forme tipice gestionate, dezvoltatorul trebuie să deschidă formularul necesar în configurator. În secțiunea Atribute, găsiți atributul cu tipul de date „DynamicList” (cel mai adesea este îngroșat). Proprietățile sale conțin textul solicitării, selecții și alte setări.

Platforma 1C:Enterprise 8.2 poate lucra cu mai multe înregistrări dintr-un tabel de bază de date într-un mod dinamic, adică poate citi date în bucăți. Mai devreme în articole, am luat în considerare 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 pentru 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ă lista dinamică nu primește toate înregistrările deodată, ci le primește pe porțiuni. În consecință, nu putem obține imediat totalul pentru toate documentele 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 finale. Pentru a face acest lucru, să adăugăm două atribute șir de formă „Evaluare” și „Sumă”.

Aceste detalii vor conține valorile totale pentru documente.

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

Acum trebuie să decideți despre ce eveniment vor fi actualizate rezultatele în subsolul listei. Pentru comoditatea 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 a totalurilor atunci când scriem un document. Aceasta 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 totalurilor. Să procedăm astfel: vom forma o interogare de bază de date pentru a obține valorile câmpurilor finale în conformitate cu selecția stabilită în lista dinamică. Trebuie avut în vedere că în selecție poate exista o condiție complexă din grupuri.

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

Pașii pentru generarea unei interogări pentru a obține rezultate sunt următorii:

1. Obțineți cererea inițială pentru o listă dinamică.

După cum vedem, cererea selectează toate detaliile documentului. Pentru o mică complicație, am adăugat propriul meu câmp „LevelRating”, format din constructul „CHOICE”.

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 sursă primit al cererii în conformitate cu selecția configurată a listei dinamice.

Procedura, în funcție de tipul elementului de filtru trecut (grup sau element de filtru), generează textul corespunzător al condiției. Toate condițiile din grup sunt încadrate între paranteze, membrii grupului sunt încadrați și prin paranteze. Condițiile dintre expresii depind de grupul părinte (condiția „ȘI” este plasată între elementele de sus din ierarhie).

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

O altă funcție interesantă, după părerea mea, este „GetFieldTextOnView”. Este necesar pentru a substitui câmpuri în condițiile de interogare care sunt formate din expresii ale limbajului de interogare. Mai sus, am adăugat câmpul „LevelRating” la cererea inițială. Dacă utilizatorul îl va folosi în selecție, atunci întreaga expresie trebuie înlocuită în condiția de interogare. Această funcție primește textul câmpului din cerere prin reprezentarea acesteia. Pentru astfel de câmpuri complexe, va returna întregul text al expresiei.

Consultați configurația de testare atașată articolului pentru mai multe detalii despre algoritm. Mai jos este o captură de ecran a setărilor de selecție și a condițiilor de interogare 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 format deja o interogare luând în considerare selecțiile, rămâne să calculăm valorile totale. Acest lucru se face cu următoarea interogare:

După executarea cererii, procesăm rezultatul, îl returnăm clientului și îl scriem în detaliile formularului pe care le-am creat anterior. În cele din urmă, am primit afișarea totalurilor în subsolul listei dinamice (vezi prima captură de ecran pentru articol).

Optimitatea soluției

În general, această abordare poate afecta negativ performanța. De exemplu, dacă programul va calcula totalul fără selecția stabilită în lista dinamică, atunci numărul de înregistrări selectate poate fi mare (de exemplu, timp de câțiva ani). Ca urmare, fiecare actualizare a rezultatelor poate dura zeci (!!!) secunde. Prin urmare, are sens să se calculeze totalurile numai dacă a fost stabilită o selecție. Această condiție pune într-o configurație de test.

În plus, la calculul rezultatelor, putem face o cerere doar pe partea de server. Prin urmare, trebuie să abordați cu seriozitate cererea către server, deoarece procedura de actualizare a totalurilor poate fi efectuată foarte des. Imaginați-vă un registru de cecuri KKM într-o organizație comercială, unde pot fi introduse până la 5 cecuri pe minut și până la 300 de cecuri pe oră. De fiecare dată după scrierea documentului, se va apela actualizarea totalurilor. Prin urmare, ar fi rezonabil să se reducă traficul transmis utilizând proceduri în afara contextului.

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

Primul parametru este selectarea unei liste dinamice, al doilea este structura de tip „FilterFieldNameFilterFieldValueType”. Rețineți că primul parametru din funcție este primit ca valoare independentă. Nu pot spune exact de ce, dar dacă treceți selecția ca link, platforma dă o eroare că selecția nu poate fi modificată. Eroarea nu putea fi ocolită decât în ​​acest fel.->

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

Concluzie

În concluzie, voi spune că o astfel de abordare pentru calcularea totalurilor într-o listă dinamică este incorectă din punctul de vedere al metodologiei de dezvoltare. Ar fi corect să primim un total pe registre. De exemplu, în jurnalul de cecuri, din nou, putem obține suma de bani din casa de marcat curentă fie conform documentelor, fie conform registrului de acumulare corespunzător.

În plus, utilizarea registrelor de acumulare vă va permite să calculați totalurile fără a lua în considerare selecția, deoarece sistemul funcționează optim cu totalurile deja calculate pentru lunile trecute.

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

Descărcări:

Acasă Note din oglindă

21.04.2014 Obținerea datelor din lista dinamică

Implementat în versiunea 8.3.6.1977.

Am implementat capacitatea de a obține ușor și convenabil date afișate folosind o listă dinamică.

Este posibil să aveți nevoie de datele listei dinamice pentru a le imprima într-o formă „specifică” non-standard. Sau pentru a efectua anumite acțiuni cu ei. De exemplu, trimiteți o scrisoare tuturor contrapărților pe care le-ați selectat în listă conform unor criterii.

În plus, există o serie de sarcini în care utilizatorul, pe lângă lista de elemente, dorește să vadă și datele rezumative asociate acestei liste. De exemplu, după ce a selectat mărfurile unui anumit grup de produse și a unui anumit furnizor, dorește imediat să vadă numărul total de astfel de bunuri în baza de date.

Lista dinamică în sine nu vă poate oferi aceste informații. Scopul unei liste dinamice este de a oferi vizualizare rapidă cantitati mari de date. Prin urmare, citește datele în bucăți necesare pentru a fi afișate pe unul sau două ecrane. Și „nu știe nimic”, de exemplu, despre cantitatea totală de date pe care trebuie să o citească.

În general, pentru a obține Informații suplimentare pe care utilizatorul dorește, trebuie să interogați baza de date. Exact la fel ca cel folosit în lista dinamică.

Ai putea să o faci înainte. Dar nu a fost întotdeauna ușor. La urma urmei, pe lângă textul interogării originale, conform căruia funcționează lista dinamică, trebuia să cunoașteți toate selecțiile, sortările și alți parametri pe care utilizatorul i-a stabilit interactiv în tabelul care afișează datele.

Acum această sarcină este ușor de rezolvat. Tabelul cu liste dinamice are două metode noi:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

Astfel, obțineți schema de compoziție a datelor în sine și, cel mai important, toate setările acesteia, datorită cărora utilizatorul vede lista exact așa cum este. Tot ce trebuie să faceți este să aranjați în mod programatic aspectul și să îl trimiteți într-o colecție de valori (pentru procesare software) sau în document foaie de calcul(a afișa):

Ca rezultat, veți obține o structură (sau un raport) care conține coloane și rânduri care sunt afișate într-un tabel de listă dinamic.

Punctul important este că aspectul și setările pe care le obțineți din tabelul cu liste dinamice iau în considerare, printre altele, vizibilitatea coloanelor și căutarea aplicată. Deoarece setările sunt obținute separat, puteți modifica compoziția câmpurilor în scopuri proprii și puteți obține, de exemplu, toate coloanele din listă, și nu doar cele care sunt vizibile pentru utilizator.

Când ieșiți într-un document de foaie de calcul, există un alt moment frumos. În general, aspectul raportului va corespunde aspect tabele cu liste dinamice în momentul în care schema și setările sunt primite. Inclusiv designul condiționat al tabelului. Veți avea nevoie de câteva acțiuni suplimentare doar dacă doriți să transferați și designul condiționat al formularului în raport.

În procesul de finalizare a configurațiilor, fiecare programator 1C întâlnește liste dinamice.
O listă dinamică este un obiect de interfață folosit 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 posibilitățile unei liste dinamice, să creăm o prelucrare externă, să adăugăm formularul principal. Să adăugăm în formular un nou atribut cu tipul „Lista dinamică”. Să mergem la proprietățile sale și să vedem ce este acolo.
Suntem interesați de proprietatea „Cerere personalizată”. Activarea acestuia ne va arăta toate posibilitățile unei liste dinamice. Vom putea scrie o interogare folosind aproape toate caracteristicile 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 un sold total pentru toate depozitele. Pentru a implementa o astfel de listă, adăugați următoarea interogare:


Ca tabel principal, vom selecta "Director. Nomenclatură", acest lucru ne va permite să lucrăm cu lista dinamică, ca și cu lista de nomenclatură - adăugați, modificați, marcați pentru ștergere elemente ale directorului. De asemenea, setarea tabelului principal pune la dispoziție posibilitatea citirii dinamice a datelor - asta înseamnă că selecția se va face pe 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 valoarea parametrului „Perioada”. 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 urmează să fie setată;
. „Valoare” - Tip: Arbitrar. Valoarea de setat.
Poate fi apelat în handlerul „OnCreateOnServer” de forma:

Ai o întrebare, ai nevoie de ajutorul unui consultant?


Să oferim utilizatorului posibilitatea de a schimba perioada de primire a soldurilor. Pentru a face acest lucru, să adăugăm atributul și elementul de formular „Date” asociat cu acesta:


În handlerul „OnChange” al elementului de formular „Date”, apelați metoda „SetParameterValue”, pasând valoarea atributului asociat ca valoare. În mod similar, vom schimba procedura „On CreationAtServer” 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 proiectate. Să luăm în considerare una dintre opțiunile de implementare. Să adăugăm un atribut de formă boolean și un buton radio asociat:


La modificarea valorii comutatorului, vom schimba textul cererii. Pentru a face acest lucru, vom folosi handlerul de evenimente „OnChange” al elementului de formular „DisplayQuantityToReceipt”. Trebuie să schimbăm proprietatea „QueryText” a listei dinamice în funcție de valoarea atributului. Deoarece această proprietate nu este disponibilă pe client, este necesară o procedură de apel la server:


Rezultatul modificărilor efectuate:



În cele din urmă, visul oricărui „șapte jucători” s-a împlinit. Cât de des utilizatorii programului 7.7 au cerut să facă o selecție normală de articole. Astfel încât să puteți vedea soldurile, prețurile și să setați filtre. A trebuit să vin cu diverse trucuri, până la scrierea componentelor 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ă câteva configurație de testare 1C: „Contabilitatea întreprinderii 3.0”. Nu vom face o selecție acum, doar adăugați un alt formular de selecție în cartea de referință „Nomenclatură” și faceți-l temporar principal:

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

Să mergem la proprietățile sale și să vedem ce este acolo.

În primul rând, ne interesează caseta de selectare „Cerere arbitrară”. El este cel care ne va dezvălui toate avantajele unei liste dinamice. Vom avea posibilitatea de a scrie propria noastră interogare, și cu parametri. Bifați caseta și faceți clic pe linkul „Deschidere”:

Se va deschide o fereastră cu un cod gata făcut pentru . Până acum, toate câmpurile directorului „Nomenclatură” sunt pur și simplu enumerate acolo.

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

După cum puteți vedea, există un buton de apel „” și o casetă de selectare care vă permite să schimbați dinamic conținutul 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 interogarea de care avem nevoie cu solduri și prețuri. Ca asta:

fila Setări

Și acum cel mai delicios! 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 la 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:

&OnServerProcedure Lista OnCreateOnServer(Eșec, Procesare standard). Opțiuni. SetParameterValue("Perioada", Parametri. Data) ; Listă. Opțiuni. SetParameterValue("PriceType" , Parameters.PriceType) ; EndProcedure

Se încarcă...
Top