Internet Windows Android

Ai o întrebare și ai nevoie de ajutor de la un consultant.

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 RegisterAccumulations.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 Server Procedura Când este creată pe server (Eșec, Procesare standard) Nomenclatura rămâne Set ParameterValue("CurrentDate", CurrentSessionDate()).


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.

Î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 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:



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 cerere ținând cont de selecții, nu rămâne decât 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 uriaș (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:

Acasă Note de la Through the Looking Glass

21.04.2014 Primirea 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 date dinamice ale listei 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 contractanților pe care i-ați selectat în listă pe baza anumitor 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 produse dintr-un anumit grup de produse și un anumit furnizor, el dorește imediat să vadă numărul total de astfel de produse în baza de date.

O listă dinamică în sine nu vă poate oferi aceste informații. Scopul unei liste dinamice este de a oferi vizualizarea rapidă a unor cantități 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ă le numere.

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

Obișnuiai să faci asta. Dar nu a fost întotdeauna ușor. La urma urmei, pe lângă textul cererii inițiale pe care funcționează lista dinamică, trebuia să cunoașteți toate selecțiile, sortările și alți parametri pe care utilizatorul îi setează interactiv în tabelul care afișează datele.

Acum această problemă poate fi rezolvată simplu. Tabelul cu liste dinamice are acum două metode noi:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

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

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

Punctul important este că aspectul și setările pe care le primiți din tabelul cu liste dinamice țin cont, printre altele, de vizibilitatea coloanelor și de 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.

La ieșirea într-un document de foaie de calcul, există încă un moment plăcut. În general, aspectul raportului va corespunde aspectului tabelului cu liste dinamice în momentul primirii schemei și setărilor. Inclusiv designul condiționat al tabelului. Veți avea nevoie de câteva acțiuni suplimentare numai dacă doriți să transferați designul condiționat al formularului în raport.