1c crearea unui tabel de valori. Ce metode există și cum să căutați mai multe valori simultan

Publicat 21 septembrie 2011

Tabelul valorilor 1C – partea 3. Metadate. Buclă prin coloanele din tabelul de valori

În acest articol vă voi spune cum să lucrați cu un tabel de valori cu o structură „necunoscută”, cum să iterați coloanele unui tabel de valori, cum să extrageți date din coloane și rânduri fără a utiliza numele coloanelor. (Acest articol aparține seriei de articole 1C de la zero; programare 1C de la zero; tabel cu valorile 1C)

Pentru a explica materialul și pentru a putea rula exemplele noastre de cod „în direct”, avem nevoie de câteva tabelul de testare a valorilor 1C. Unele dintre exemplele noastre vor extrage date dintr-un tabel de valori, așa că vom crea un tabel cu trei coloane „Nume”, „Prenume”, „Nume de mijloc” și vom introduce o cantitate mică de date în el - până la 3 rânduri :)

Deci, să creăm un tabel de testare cu valori 1C și să-l completăm:

MyTZ = New ValueTable; // creează un nou tabel de valori stocat în variabila „MyTZ” MyTZ.Columns.Add(„Last Name”); // creăm coloana "Nume" MyTZ.Columns.Add("Nume"); // creează coloana "Nume" MyTZ.Columns.Add("Patronimic"); // creați coloana „Nume mijlociu” // adăugați primul rând la tabelul nostru de valori NewLine = MyTZ.Add(); NewString.LastName = "Chapaev"; NewLine.Name = "Vasily"; NewString.Middle name = "Ivanovich"; // adaugă a doua linie NewLine = MyTZ.Add(); NewString.LastName = "Dzerzhinsky"; NewRow.Name = „Felix”; NewString.Middle name = "Edmundovich"; // adaugă a treia linie NewLine = MyTZ.Add(); NewLine.LastName = "Kotovsky"; NewLine.Name = „Gregory”; NewString.Middle name = "Ivanovich";

Tabelul nostru de testare este format din trei coloane: Prenume, Nume, Patronimic; și are trei rânduri completate cu numele eroilor din Războiul Civil.

Primul eșantion de cod este enumerarea coloanelor unui tabel de valori 1C ca o colecție.

// afișează numele tuturor coloanelor din TK pentru fiecare coloană din MyTZ.Columns Cycle Report("Column name: " + Column.Name); EndCycle;

Ciclul nostru va afișa toate numele coloanelor în fereastra de mesaje 1C:

Nume coloană: Nume Nume coloană: Prenume Nume coloană: Al doilea nume

Vedem că pentru a itera prin coloane se folosește un ciclu special de iterație a colecției, similar cu ciclul de iterare a rândurilor (în articolul anterior). MyTK.Columns- aceasta este o colecție de coloane din tabelul cu valori 1C „MyTZ”. Colecția conține obiecte de acest tip „Coloana tabelului de valori” Fiecare obiect de acest tip este o coloană a tabelului de valori și conține proprietăți și metode. Accesând aceste proprietăți și metode, obținem informațiile necesare despre o coloană sau efectuăm alte acțiuni cu aceasta.

De exemplu, accesarea proprietății "Nume" (Coloana.Nume) obținem numele coloanei curente.

Aș dori să vă atrag atenția asupra titlului serialului: „Pentru toată lumea Coloană Din MyTZ.Column Cycle" Variabilă cu nume "Coloană" inventat de noi. Nu este necesar să folosiți același nume. Puteți numi această variabilă orice doriți, de exemplu „Coloana mea curentă” Atunci exemplul de mai sus ar arăta astfel:

// afișează numele tuturor coloanelor TK pentru fiecare MyCurrentColumn Din MyTK.Columns Cycle Report("Column name: " + MyCurrentColumn.Name); EndCycle;

Când subsistemul de execuție 1C întâlnește un ciclu de acest tip, cu fiecare trecere a ciclului atribuie unei variabile cu numele specificat un element din colecția noastră, în acest caz - un element de colectare coloane din tabelul de valori MyTK.ColumnsȘi apoi accesăm variabila care conține coloana curentă și folosim proprietatea "Nume".

Propun să afișăm lângă numele coloanei numărul fiecărei coloane din colecția de coloane:

// afișează numărul și numele tuturor coloanelor din tabelul de valori pentru fiecare coloană din MyTZ.Columns Cycle ColumnNumber = MyTZ.Columns.Index(Column); // obține numărul coloanei ColumnName = Column.Name; // obține numele coloanei Report("Numărul coloanei:" + Numărul coloanei + " Numele coloanei: " + Numele coloanei); EndCycle;

Următorul text va fi afișat în fereastra de mesaj 1C:

Număr coloană:0 Nume coloană: Nume Număr coloană:1 Nume coloană: Prenume Număr coloană:2 Nume coloană: Al doilea nume

Vă rugăm să rețineți că coloanele din tabelul cu valori 1C sunt numerotate începând de la zero, la fel ca și rândurile din tabelul cu valori.

Numărul de coloane din tabelul cu valori 1C

Pentru a afla numărul de coloane din tabelul de valori, folosim metoda „Count()” pe colecția de coloane.

Număr de coloane = MyTZ.Columns.Quantity(); Raport (Număr de coloane);

Numărul „3” va fi afișat pe ecran. Într-adevăr, tabelul nostru are trei coloane: „Nume”, „Prenumele”, „Patronimic”

Obținerea unui obiect coloană după numărul său (index) și enumerarea coloanelor folosind indexul coloanei

Să facem un ciclu de căutare prin toate coloanele tabelului de valori folosind indici de coloane (numere). Amintiți-vă că numerotarea coloanelor începe de la zero. Prin urmare, trebuie să creștem contorul de cicluri „Sch” de la zero la un număr egal cu numărul de coloane minus unu.

Pentru cont = 0 By MyTZ.Columns.Quantity() - 1 Ciclu CurrentColumn = MyTZ.Columns[Act]; Raport (Coloană curentă.Nume); EndCycle;

Pe ecran vom primi următoarele

Numele complet

Cred că acest exemplu a fost clar. Am apelat la metodă Cantitate() colecții de coloane" MyTZ.Columns.Quantity()", am primit numărul de coloane și a început o buclă cu un contor de la zero inainte de numărul de coloane minus unu. În interiorul buclei, obținem fiecare coloană din colecția de coloane și atribuim obiectul coloană curent unei variabile CurrentColumn Apoi, variabila CurrentColumn accesam proprietatea Numeși afișați valoarea acestei proprietăți pe ecran: Raport (Coloană curentă.Nume);

Este important să nu confundați niciodată proprietatea unui obiect și metoda unui obiect.

O proprietate este o anumită valoare statică și accesul la ea este scris fără paranteze, de exemplu CurrentColumn.Name. O metodă este în esență o procedură sau o funcție a unui obiect, iar apelurile la proceduri și funcții sunt întotdeauna scrise cu paranteze (chiar dacă nu există parametri de intrare). De exemplu: MyTZ.Columns.Quantity()

Dacă accesăm o metodă și uităm să scriem parantezele, interpretul 1C ne va da un mesaj de eroare și nu va rula codul. Întrucât interpretul va considera că nu accesăm o metodă, ci o proprietate - pentru că nu există paranteze. Dar nu va putea găsi proprietăți cu acel nume (pentru că există doar o metodă cu acel nume) - care vor fi menționate în mesajul de eroare.

Acesta este ceea ce interpretul va scrie dacă uit să pun paranteze într-un apel de metodă într-un mod atât de incorect MyTZ.Columns.Quantity(fără paranteze după „Cantitate()”):

Câmpul obiect nu a fost găsit (cantitate)

În acest caz, „câmp” și „proprietate” ar trebui înțelese ca sinonime sau o inexactitate în terminologia dezvoltatorilor 1C. Ei folosesc ambele cuvinte pentru a se referi la același concept. Deși în alte limbaje de programare acești termeni pot însemna lucruri diferite.

Obținerea datelor dintr-un tabel cu valori 1C folosind numerele coloanei

Pentru început, vă ofer un exemplu simplu de obținere a datelor din primul rând al tabelului nostru. Vă rugăm să rețineți că folosim tabelul pre-populat de la începutul articolului. Știm sigur că tabelul are un prim rând și cel puțin o coloană. Dacă aplicăm acest exemplu unui tabel gol, va apărea o eroare. Asa de:

Prima linie = MyTK; // obține primul rând (numerotat de la zero) FirstColumnValue = FirstRow; // obține valoarea primei coloane (numerotarea coloanei este tot de la zero) Raport (Valoarea primei coloane); // afișează valoarea primei coloane din primul rând al tabelului

Ecranul va afișa:

Chapaev

În primul rând, am obținut un obiect rând de tabel de valori accesând tabelul de valori folosind operatorul [...]. (dacă ați uitat cum să faceți acest lucru, puteți să vă uitați la articolele anterioare) Am trecut argumentul „0” în interiorul operatorului. Acesta este indexul primului rând al tabelului de valori. Prima linie = MyTK;

Mai mult, avem și dreptul de a accesa un obiect șir folosind operatorul [...]. În cadrul acestui operator am trecut numărul coloanei din tabelul de valori, în acest caz și „0”. Și astfel, am primit valoarea coloanei numerotate „0” pentru rândul curent al tabelului numerotat „0”. Am afișat această valoare pe ecran și reprezintă șirul „Chapaev”.

Să complicăm puțin exemplul nostru:

Prima linie = MyTK; // obține prima linie (numerotată de la zero) Report(FirstLine); // afișează valoarea primei coloane din primul rând al tabelului Report(FirstRow); // afișează valoarea celei de-a doua coloane din primul rând al tabelului Report(FirstRow); // afișează valoarea celei de-a treia coloane din primul rând al tabelului

Acum am afișat valorile din toate cele trei coloane din primul rând al tabelului nostru de valori:

Chapaev Vasily Ivanovici

Acum voi modifica și acest exemplu, astfel încât să ne putem descurca fără variabilă "Prima linie"

Raport (MyTZ); // afișează valoarea primei coloane din primul rând al tabelului Report(MyTZ); // afișează valoarea celei de-a doua coloane în primul rând al tabelului Report(MyTZ); // afișează valoarea celei de-a treia coloane din primul rând al tabelului

Va fi la fel și pe ecran

Chapaev Vasily Ivanovici

Am văzut în exemplul de mai sus că pentru a accesa o valoare situată într-un anumit rând și o anumită coloană a unui tabel de valori, putem folosi un apel secvenţial a doi operatori [...] sub această formă: Tabel de valori[Rând Index][Column Index]

Deci, suntem gata să creăm o buclă și să obținem datele tuturor rândurilor și tuturor coloanelor folosind indici de rând și coloane:

Pentru RowCounter = 0 By MyTZ.Quantity() - 1 Loop // parcurge rândurile Pentru ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // buclă imbricată prin coloane // obține valoarea celulei (din rândul curent și coloanele curente) CellValue = MyTK[RowCounter][ColumnCounter]; // afișează numărul rândului, numărul coloanei și valoarea celulei Raport ("Row No" + Row Count + "coloana No" + Column Count + " = " + CellValue); EndCycle; EndCycle;

Următoarele vor fi afișate pe ecran:

Linia nr. 0 coloana nr. 0 = Chapaev Linia nr. 0 coloana nr. 1 = Vasily Linia nr. 0 coloana nr. 2 = Ivanovich Linia nr. 1 coloana nr. 0 = Dzerzhinsky Linia nr. 1 coloana nr. 1 = Felix Linia nr. 1 coloana nr. 2 = Edmundovich Linia nr. 2 coloana nr. 0 = Kotovsky Linia nr. 2 coloana nr. 1 = Grigory Linia nr. 2 coloana nr. 2 = Ivanovich

Folosind două cicluri, dintre care unul este imbricat în celălalt, am afișat valorile tuturor coloanelor din toate rândurile din tabelul cu valori 1C. În acest caz, nu am folosit nume de coloane, ci am accesat coloanele și rândurile după indecșii lor. Pentru mai multă înțelegere, acordați atenție comentariilor din interiorul exemplului.

În concluzie, îmi propun să schimbăm puțin exemplul nostru, astfel încât în ​​loc de numerele coloanelor, să afișeze numele acestora pe ecran. Și în plus, voi realiza un design mai prezentabil pentru afișarea conținutului pe ecran.

Pentru LineCounter = 0 By MyTZ.Quantity() - 1 Buclă // Buclă prin rânduri Raport(" ======= Linie Nr. " + LineCounter + " ======="); A raporta(" "); // avans de linie (inserarea unui rând gol) Pentru ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // buclă imbricată prin coloane // obține valoarea celulei (din rândul curent și coloana curentă) CellValue = MyTZ [RowCounter][ColumnCounter]; // obțineți numele coloanei ColumnName = MyTZ.Columns[ColumnCounter].Name; // afișează numele coloanei și valoarea celulei Report(ColumnName + ": " + CellValue); EndCycle; A raporta(" "); // line feed (introducerea unei linii goale) EndCycle;

Acum, pe ecranul nostru informațiile au început să pară mai reprezentative:

Linia nr. 0 ======= Nume: Chapaev Prenume: Vasily Patronimic: Ivanovich ======= Linia nr. 1 ======= Nume: Dzerzhinsky Prenume: Felix Patronimic: Edmundovich ===== == Linia nr. 2 ======= Nume: Kotovsky Prenume: Grigory Patronimic: Ivanovici

Da, aproape am uitat. Când folosim doi operatori [...][...] într-un rând, putem trece numele acestei coloane în locul unui index de coloană: ValueTable[RowIndex][ColumnName]

Pentru LineCounter = 0 By MyTZ.Quantity() - 1 Buclă // Buclă prin rânduri Raport(" ======= Linie Nr. " + LineCounter + " ======="); A raporta(" "); // line feed (inserarea unei linii goale) Pentru ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // buclă imbricată prin coloane ColumnName = MyTZ.Columns[ColumnCounter].Name; // obțineți coloana nameCell Value = MyTZ[RowCounter][ColumnName]; //

Atenție la linia marcată cu o săgeată ". În această linie, în loc de indexul coloanei curente, trecem numele coloanei curente argumentului între paranteze drepte [...] Rezultatul va fi același.

Și acum, ultimul lucru din acest articol.

Obținerea CORECT a tuturor datelor din tabelul de valori 1C folosind bucle printr-o colecție de rânduri și o colecție de coloane

Pentru fiecare linie curentă din bucla MyTZ // parcurge o colecție de șiruri Raport (" ======= Linie nr. " + MyTZ.Index(CurrentLine) + " ======="); A raporta(" "); Pentru fiecare coloană curentă din bucla MyTZ.Columns // buclă imbricată care repetă printr-o colecție de coloane ColumnName = CurrentColumn.Name; // obțineți coloana nameCellValue = CurrentRow[ColumnName]; // obțineți valoarea celulei DUPĂ NUMELE coloanei Raport (ColumnName + ": " + CellValue); // afișează numele coloanei și valoarea celulei End of Cycle; A raporta(" "); EndCycle;

În exemplu, s-au folosit două bucle. O buclă pentru trecerea în buclă printr-o colecție de coloane este imbricată în interiorul unei bucle pentru bucla prin rânduri. Dacă ați lucrat prin exemplele de mai sus și ați citit articolele anterioare, atunci nu veți avea nicio dificultate în a înțelege cum funcționează acest exemplu.

În cele din urmă, voi reduce cât mai mult posibil numărul de linii de cod din ultimul nostru exemplu eliminând utilizarea variabilelor intermediare. Vom obține o mostră de „cod industrial” care este folosit în probleme reale.

Acest lucru ar trebui făcut numai atunci când înțelegeți bine ceea ce faceți. Dacă codul este foarte complex, atunci este acceptabil să lăsați variabile intermediare pentru a facilita înțelegerea propriului cod mai târziu. De asemenea, orice cod trebuie comentat cel puțin minim, pentru ca după ceva timp să fie mai ușor de înțeles textele programului.

Pentru fiecare linie curentă din ciclul MyTZ // repetați peste rânduri Raport (" ======= Nr. linie " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); Pentru fiecare coloană curentă din bucla MyTZ.Columns // repetare peste coloane Report(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); EndCycle; A raporta(" "); EndCycle;

Ieșirea de pe ecran nu s-a schimbat, rămâne aceeași ca în exemplul anterior:

CURS DE 2 SĂPTĂMINI

„PROGRAMARE ÎN 1C PENTRU ÎNCEPĂTORI”

Cursul va fi trimis pe e-mail. Deveniți un programator completând sarcini pas cu pas.

Pentru a participa ai nevoie doar de un computer și de internet

Acces gratuit la curs:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: nu-repeat; fundal-poziție: centru; fundal-dimensiune: automat;) .sp-form input (afișare: inline-block; opacitate: 1; vizibilitate: vizibil;).sp-form .sp-form-fields-wrapper (marja: 0 auto; lățime: 260px;).sp-form .sp -form-control ( fundal: #ffffff; chenar-culoare: #cccccc; chenar-stil: solid; chenar-lățime: 1px; font-size: 15px; padding-left: 8.75px; padding-right: 8.75px; chenar -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; înălțime: 35px; lățime: 100%;).sp-form .sp-field etichetă (culoare: #444444; font- dimensiune: 13px; stil font: normal; greutate font: bold;).sp-form .sp-button ( chenar-rază: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; culoare de fundal: #f4394c; culoare: #ffffff; lățime: 100%; greutate font: 700; stil font: normal; familie de fonturi: Arial, "Helvetica Neue", sans-serif; caseta-umbra: niciuna; -moz-box-shadow: niciuna; -webkit-box-shadow: niciuna; fundal: gradient liniar (în sus, #e30d22 , #f77380);).sp-form .sp-button-container ( text-align: center; lățime: automat;)

(Acest articol aparține seriei de articole 1C de la zero; programare 1C de la zero; tabel cu valorile 1C)

O structură virtuală de stocare a datelor în formă tabelară - asta este

Tabelul de valori nu este un obiect permanent al bazei de date 1C și nu este salvat între sesiunile de lansare.

Tabelul valorilor 1C(TK) este creat „din mers” folosind codul programului, iar apoi lucrul cu acesta se desfășoară în același mod ca și cu orice alt obiect de program al limbajului de programare 1C. Utilizarea apelurilor de metodă și accesarea proprietăților unui obiect-tabel.

Cu alte cuvinte, programatorul creează un tabel în memorie, îl umple cu date, lucrează cu el, sortează, grupează, calculează totaluri și așa mai departe. Primește datele necesare pentru utilizare ulterioară.

Să creăm un tabel de valori și să-l umplem cu ceva. Trebuie amintit că un tabel cu valori 1C poate fi creat nu numai manual, apelând operatorul

NewValueTable;

Un tabel de valori este adesea rezultatul unui apel de metodă pe un alt obiect, de exemplu, rezultatul unei interogări poate fi aruncat într-un tabel de valori și așa mai departe.

Permiteți-mi să vă dau imediat un exemplu simplu.

// MyTZ = New ValueTable; // creează un nou tabel de valori stocat în variabila „MyTZ” MyTK. Coloane. Adaugă(„Nume”); // creăm coloana „Nume” MyTK. Coloane. Adaugă ("Nume"); // creăm coloana „Nume”. Raport (MyTZ); // afișează valoarea variabilei MyTZ //

Am creat un tabel de valori 1C, cu două coloane: „Nume”, „Nume”. Procedură Raport (MyTK) va afișa tipul de variabilă în fereastra de mesaje MyTZ: Tabelul Valorilor

Tabelul nostru de valori este gol pentru moment. Să adăugăm câteva rânduri, cu numele și prenumele.

// completează tabelul de valori // adăugăm primul rând la tabelul nostru de valori NewLine = MyTK. Adăuga() ; Linie nouă. Nume = "Sidorov" ; Linie nouă. Nume = "Vasya"; // adăugăm un al doilea rând la tabelul nostru de valori NewLine = MyTK. Adăuga() ; Linie nouă. Nume = "Ivanov" ; Linie nouă. Nume = „Petru”;

Am primit un tabel ca acesta:

Trebuie să rețineți: Numerele rândurilor din tabelul de valori încep de la zero

De ce avem nevoie chiar de numere de linie? Și astfel încât să putem accesa un rând separat al tabelului de valori, de exemplu, luați și afișați acest rând pe ecran.

// *** afișează valorile liniei zero pe ecran *** (în viața de zi cu zi, de obicei numerotăm lucrurile începând de la unu, dar aici - de la zero) // obțineți rândul zero al tabelului nostru folosind indexul rândului dintre paranteze drepte OurNullString = MyTZ[ 0] ; // acum întregul șir zero este conținut în variabila „OurFirstLine” Raport (OurNullString.LastName) ; // afișează valoarea coloanei „Nume” stocată în rândul zero Raport (OurNullString.Name); // afișează valoarea coloanei „Nume” din aceeași linie

Ca rezultat, ecranul va afișa:

Sidorov Vasia

Acum, pentru cei foarte inteligenți și conciși, voi arăta un exemplu care vă permite să accesați valoarea unei coloane într-un astfel de rând (Valoarea unei coloane într-un astfel de rând este o celulă a tabelului de valori Un termen neoficial, dar unul convenabil). Dar fără a utiliza o variabilă intermediară precum „OurZeroString”.

Pentru a afișa valorile celulelor din al doilea rând (nu uitați că rândul este al doilea, dar indicele acestui rând este unul, astfel încât numerotarea începe de la zero)

În sfârșit, punctul final al acestui articol. V-am arătat un exemplu de accesare a unui singur rând dintr-un tabel de valori prin index (numărul rândului). Forma universală pentru citirea sau atribuirea conținutului unei celule este: „MyValueTable[RowNumber].ColumnName”

Acum vă voi oferi un ciclu de ieșire completă a conținutului tabelului de valori. Fără explicații detaliate, ca să-ți faci și tu creierul :)

// // parcurge și afișează toate rândurile din tabelul nostru de valori// Pentru LineNumber = 0 Conform MyTK. Cantitate() - Raport 1 ciclu (MyTZ[LineNumber] . LastName) ; // afișează valoarea coloanei „Nume”. Raport (MyTK[LineNumber] . Nume) ; // afișează valoarea coloanei „Nume”. EndCycle ;

Ca rezultat al rulării acestei bucle, pe ecran vor fi afișate următoarele:

Sidorov Vasia Ivanov Petya

Aici v-am spus elementele de bază ale lucrului cu tabelul de valori 1C. Aceste informații se aplică pentru 1C 8.0, 8.1, 8.2.Detaliile interesante despre obiectul „Tabelul de valori 1C” nu se termină aici. Acest obiect are capabilități enorme pentru lucrul convenabil cu datele. Voi vorbi despre asta în articolele următoare.

Degtyarev Roman.

Cum să înveți să programezi în 1C de la zero?

Cum să lucrezi ca programator 1C și să câștigi până la 150.000 de ruble pe lună?

INREGISTREAZA-TE GRATUIT

CURS DE 2 SĂPTĂMINI

„PROGRAMARE ÎN 1C PENTRU ÎNCEPĂTORI”

Cursul va fi trimis pe e-mail. Deveniți un programator completând sarcini pas cu pas.

Pentru a participa ai nevoie doar de un computer și de internet

Acces gratuit la curs:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: nu-repeat; fundal-poziție: centru; fundal-dimensiune: automat;) .sp-form input (afișare: inline-block; opacitate: 1; vizibilitate: vizibil;).sp-form .sp-form-fields-wrapper (marja: 0 auto; lățime: 260px;).sp-form .sp -form-control ( fundal: #ffffff; chenar-culoare: #cccccc; chenar-stil: solid; chenar-lățime: 1px; font-size: 15px; padding-left: 8.75px; padding-right: 8.75px; chenar -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; înălțime: 35px; lățime: 100%;).sp-form .sp-field etichetă (culoare: #444444; font- dimensiune: 13px; stil font: normal; greutate font: bold;).sp-form .sp-button ( chenar-rază: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; culoare de fundal: #f4394c; culoare: #ffffff; lățime: 100%; greutate font: 700; stil font: normal; familie de fonturi: Arial, "Helvetica Neue", sans-serif; caseta-umbra: niciuna; -moz-box-shadow: niciuna; -webkit-box-shadow: niciuna; fundal: gradient liniar (în sus, #e30d22 , #f77380);).sp-form .sp-button-container ( text-align: center; lățime: automat;)

Salutări tuturor cititorilor Infostart. Acest articol va fi dedicat problemei creării unui tabel arbitrar de valori sub forma unei aplicații gestionate în mod programatic.

Caracteristicile sarcinii.

Oricine a programat într-o aplicație obișnuită s-a confruntat adesea cu sarcina de a obține un tabel arbitrar de valori pe un formular. Un tabel arbitrar de valori este un tabel al cărui număr și tip de coloane nu sunt cunoscute în prealabil. Adică, ar putea fi 3 coloane, sau poate 6, sau poate 8. Într-o aplicație normală, totul este simplu: puteți plasa elementul „Tabel de valori” pe formularul de procesare, apoi transferați tabelul de valori creat. la acest element în mod programatic. Apoi cu o comandă simplă:

Form Elements.TableField.CreateColumns();

obțineți un tabel de valori gata făcut pe formular. S-ar părea că ar putea fi mai simplu.

Toate acestea erau în aplicația obișnuită. Într-o aplicație gestionată, totul s-a schimbat. Nu este atât de ușor să creezi un tabel arbitrar. Acum trebuie fie să parametrizați rigid tabelul de valori pe formular, fie să îl creați programatic (descrieți, ei bine, aceasta este, de fapt, esența aplicației gestionate în sine). Acesta este ceea ce vom încerca să facem: creați în mod programatic un tabel arbitrar de valori pe o formă controlată.

Rezolvarea problemei.

Primul lucru pe care trebuie să-l facem este să stabilim cum va apărea tabelul pe formular. Principalul lucru este că nu trebuie să creați niciun element de formular în procesare. Îl vom crea programatic, ca întregul tabel. Adică, tabelul va fi descris și creat în momentul deschiderii formularului sau folosind un buton - în funcție de cine are nevoie.

Crearea unui tabel pe formular are loc prin descrierea tabelului de valori ca atribut:
SelectionTypeArray = Matrice nouă; Matrice de SelectionType.Add(Type("Tabel de valori")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Matrice de detalii = Matrice nouă; Array of Attributes.Add(New Form Atributes("Schedule Table", Descrierea SelectionType, "", "TZN")); Acum trebuie să creăm un tabel cu valorile programului care conține datele. Dacă tabelul de valori este obținut dintr-o interogare, atunci totul este mai mult sau mai puțin în ordine. Dacă tabelul este creat manual, atunci semnificația coloanelor care vor conține numere sau date poate fi creată prin „Descrierea tipurilor”. Ideea este că coloanele din tabelul de valori trebuie să aibă un anumit tip. Dacă, de exemplu, este de așteptat ca utilizatorul să completeze datele în aceste coloane în mod interactiv, atunci nu puteți adăuga o coloană a tabelului de valori pur și simplu cu un nume; aceasta trebuie să aibă un tip. Rețineți - acest lucru este foarte important pentru că... Vom transfera aceste tipuri în tabelul din formular.
Creăm un tabel care conține mai multe coloane:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Matrice nouă; ArrayCD.Add(Type("Data")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = New ValueTable;
TK.Columns.Add(„Cu”, DescriptionTypesTime);
TK.Columns.Add(„Înainte”, DescriptionTypesTime);
TK.Columns.Add(„Nume”);
TK.Columns.Add("Notă"); // Nume complet și Notă - rânduri În continuare, vom completa tabelul programului TK cu datele necesare. Primim un tabel TK care conține valorile necesare și este gata pentru a fi transferat la atributul formular creat. Pentru fiecare coloană din TK. Ciclul coloanelor

Array of Attributes.Add(New Form Attributes(Column.Name, Column.ValueType,"ScheduleTable"));
EndCycle;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

Aceasta este o combinație simplă și masa noastră este gata.

Pentru fiecare coloană din TK. Ciclul coloanelor

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "ScheduleTable." + Coloană.Nume;
NewElement.Width = 10;
EndCycle;

Design condiționat, dacă avem nevoie, îl scriem și manual, meniul de comandă - manual. De asemenea, manevrele de masă sunt scrise de mână. De exemplu, pentru a adăuga un handler de evenimente pentru tabelul „Selectare”:

Tabelul SelectionFields.SetAction("Selection","TZNSelection");

Pentru a procesa acest eveniment, este prescrisă o procedură separată sub forma unei proceduri:

&OnClient
Procedura TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//comenzile handlerului EndProcedure

Rețineți că handlerele de tabelă se declanșează pe client și, prin urmare, trebuie să aibă o comandă de indicator al compilatorului

&OnClient

Ei bine, ultimul lucru pe care am vrut să-l adaug este că, după toți acești pași, asigurați-vă că nu uitați să treceți tabelul finit atributului formular:

ValueÂFormAttributes(ToR, "ScheduleTable");

Acesta este ceea ce avem ca rezultat:


Și aici este gestionarea evenimentului „Selectare”:



Postfaţă.

Sper că articolul îi va ajuta pe acei programatori 1C care încep să creeze tabele pe un formular în mod programatic.

Puteți descărca o procesare care creează în mod programatic un tabel de valori și îl afișează într-un formular ușor de gestionat cu comentarii care vă vor ajuta să vă creați propriile tabele.

Pentru a contabiliza bani și bunuri, în afaceri sunt utilizate pe scară largă diverse tabele. Aproape fiecare document este un tabel.

Un tabel listează mărfurile care urmează să fie expediate din depozit. Un alt tabel arată obligațiile de plată pentru aceste bunuri.

Prin urmare, în 1C, lucrul cu tabele ocupă un loc proeminent.

Tabelele din 1C mai sunt numite și „părți tabulare”. Directoarele, documentele și altele le au.

Interogarea, atunci când este executată, returnează un tabel care poate fi accesat în două moduri diferite.

Prima - mai rapidă - selecție, obținerea de rânduri din ea este posibilă numai în ordine. Al doilea este încărcarea rezultatului interogării într-un tabel de valori și apoi accesul aleatoriu la acesta.

//Opțiunea 1 – acces secvenţial la rezultatele interogării

//obține masa
Selectare = Query.Run().Select();
// parcurgem toate liniile rezultatului interogării în ordine
While Select.Next() Loop
Raport (Selectie.Nume);
EndCycle;

//Opțiunea 2 – încărcarea într-un tabel de valori
Solicitare = New Request("SELECT Name FROM Directory.Nomenclature");
//obține masa
Tabel = Query.Run().Unload().
//mai departe putem, de asemenea, itera prin toate liniile
Pentru fiecare rând din ciclul de masă
Raport (String.Nume);
EndCycle;
//sau accesează în mod arbitrar șiruri de caractere
Row = Table.Find("Lopata", "Nume");

O caracteristică importantă este că în tabelul care se obține din rezultatul interogării, toate coloanele vor fi strict tastate. Aceasta înseamnă că prin solicitarea câmpului Nume din directorul Nomenclatură, veți primi o coloană de tip String cu o lungime admisă de cel mult N caractere.

Tabel de pe formular (client gros)

Utilizatorul lucrează cu tabelul atunci când acesta este plasat pe formular.

Am discutat despre principiile de bază ale lucrului cu forme în lecția despre și în lecția despre

Deci, să așezăm tabelul pe formular. Pentru a face acest lucru, puteți trage tabelul din panoul Controale. În mod similar, puteți selecta Form/Insert Control din meniu.

Datele pot fi stocate în configurație - apoi trebuie să selectați partea tabelară existentă (adăugată anterior) a obiectului de configurare a cărui formă o editați.

Faceți clic pe butonul „...” din proprietatea Date. Pentru a vedea lista de părți tabulare, trebuie să extindeți ramura Object.

Când selectați partea tabelară, 1C însuși va adăuga coloane la tabelul din formular. Rândurile introduse de utilizator într-un astfel de tabel vor fi salvate automat împreună cu cartea/documentul de referință.

În aceeași proprietate Data, puteți introduce un nume arbitrar și puteți selecta tipul Value Table.

Aceasta înseamnă că a fost selectat un tabel arbitrar de valori. Nu va adăuga automat coloane și nici nu va fi salvat automat, dar puteți face ce doriți cu el.

Făcând clic dreapta pe tabel, puteți adăuga o coloană. În proprietățile unei coloane, puteți specifica numele acesteia (pentru referință în codul 1C), antetul coloanei de pe formular, conexiunea cu atributul părții tabelare (acesta din urmă - dacă nu este selectat un tabel arbitrar, ci un partea tabulară).

În proprietățile tabelului din formular, puteți specifica dacă utilizatorul poate adăuga/șterge rânduri. Un formular mai avansat este caseta de selectare Numai vizualizare. Aceste proprietăți sunt convenabile de utilizat pentru organizarea tabelelor destinate afișării informațiilor, dar nu pentru editare.

Pentru a gestiona tabelul, trebuie să afișați un panou de comandă în formular. Selectați elementul de meniu Form/Insert Control/Command Bar.

În proprietățile barei de comandă, bifați caseta de selectare Completare automată, astfel încât butoanele de pe panou să apară automat.

Tabel pe formular (client subțire/gestionat)

Într-un formular gestionat, aceste acțiuni arată puțin diferit. Dacă trebuie să plasați o parte tabelară pe formular, extindeți ramura Obiect și trageți una dintre părțile tabulare spre stânga. Asta e tot!

Dacă trebuie să plasați un tabel de valori, adăugați un nou atribut de formular și în proprietățile acestuia specificați tipul – tabel de valori.

Pentru a adăuga coloane, utilizați meniul de clic dreapta pe acest atribut de formular, selectați Adăugare coloană atribut.

Apoi trageți și tabelul spre stânga.

Pentru ca un tabel să aibă o bară de comandă, în proprietățile tabelului, selectați valorile din secțiunea Utilizare – Poziția barei de comandă.

Încărcarea unui tabel în Excel

Orice tabel 1C situat pe formular poate fi tipărit sau încărcat în Excel.

Pentru a face acest lucru, faceți clic dreapta pe un spațiu gol din tabel și selectați Listă.

Într-un client gestionat (subțire), acțiuni similare pot fi efectuate folosind elementul de meniu Toate acțiunile/Afișare listă.

Întrebare Crearea unei coloane de tabel cu valori de diferite tipuri în 1C v8
Răspuns
Când creați o coloană de tabel de valori, puteți trece gamă de tipuri, și poate un anumit tip. O matrice de tipuri este utilizată atunci când trebuie să specificați mai multe tipuri diferite pentru o coloană.

Folosit pentru a indica tipuri „obiect general” - „Descrierea tipurilor”. Prin urmare, mai întâi vom explica ce este „Descrierea tipurilor” („Descrierea tipurilor de valori”).

„Descrierea tipurilor de valori”. Pentru a descrie tipurile acceptabile de valori ale proprietăților diferitelor obiecte din sistem, se folosește un obiect special „Descrierea tipurilor”. Folosind acest obiect, puteți descrie tipurile valide de valori care pot fi atribuite proprietăților. Pentru a limita și mai mult valorile posibile ale tipurilor primitive Număr, șir și dată sunt furnizate calificative. Calificatorii descriu parametri precum lungimea unui șir sau a unui număr, părți valide ale unei date etc.

Sintaxa metodei „Descriere tip”.

Tipuri de descriere noi(<Исходное описание типов>, <Добавляемые типы>, <Вычитаемые типы>, <Квалификаторы числа>, <Квалификаторы строки>, <Квалификаторы даты>)
Opțiuni:
<Исходное описание типов> (optional)
Tip: DescriptionTypes. Descrierea inițială a tipurilor, pe baza căreia se va construi una nouă.
<Добавляемые типы> (optional)
Tip: Array, String. O matrice de valori de tip Un Tip constând din tipurile care vor fi utilizate în obiect sau un șir care conține numele tipurilor separate prin virgule.
<Вычитаемые типы> (optional)
Tip: Array, String. O matrice de valori Type (sau un șir care conține nume de tipuri separate prin virgulă) constând din tipurile care vor fi excluse din declarația inițială specificată în primul parametru.
<Квалификаторы числа> (optional)
Tip: Numere calificative. Calificatori numerici care descriu valori valide de tip numeric.
<Квалификаторы строки> (optional)
Tip: QualifiersStrings. Calificatori de șir care descriu valori valide ale unui tip de șir.
<Квалификаторы даты> (optional)
Tip: Calificari Date. Calificatori de dată care descriu valori valide ale tipului Date.
Descriere:
Creează o descriere de tip pe baza unei alte descrieri de tip, adăugând unele tipuri și excluzând altele. Dacă nu este specificat un nou calificativ, calificatorii declarației de tip inițiale vor fi păstrați.
Un exemplu de utilizare a obiectului „Descriere tip”:

// extinde descrierea Tipurilor valide cu tipuri noi Array = New Array; Matrice. Adăugați(Tip( „Link de referință. Metode”)); Matrice. Adaugă(Tip(„Număr”)); Semn = ValidSign. nenegativ; QuNumbers = New QualifiersNumbers(10, 2, Sign); ValidTypes = NewTypeDescription(ValidTypes, Array, QNumbers);
Acum, de fapt, exemple de creare corectă a valorilor coloanei de diferite tipuri într-un tabel.

În general, este suficient să definiți tipurile de coloane după cum urmează:

TK. Coloane. Adăuga( „Index de sortare”, Tipuri de descriere noi ( „Număr” ) ); TK. Coloane. Adăugare(„SectionName”, New TypeDescription(„String” ) ); TK. Coloane. Add("DataCorr" , New TypeDescription("Data" ) ) ; TK. Coloane. Adăuga( „Ștergere necondiționată”, New TypeDescription(„Boolean”); TK. Coloane. Add("Nomenclatură" , New TypeDescription() ) ; TK. Coloane. Adaugă(„SectionData” , New TypeDescription(„Structură” ) ​​) ; // exemplu de creare a coloanelor „număr” și „șir” cu clarificarea parametrilor: TK. Coloane. Adăuga( „Procent finalizat”, Tipuri de descriere noi ( „Număr” , Numere calificative noi ( 18 , 2 ) ) ); TK. Coloane. Add(„SectionName” , NewTypeDescription(„String” , , NewStringQualifiers(200, AllowedLength. Variable) ) ); TK. Coloane. Adaugă(„Data scoaterii din funcțiune” , NewTypeDescription(„Data” , , , NewDateQualifiers(DateParts.DateTime) ) );

Cu toate acestea, mai general, o matrice este transmisă ca tip de coloană. O matrice este utilizată atunci când mai multe tipuri trebuie să fie atribuite unei singure coloane. Atunci definiția structurii va fi cam așa (se dau exemple pentru diferite tipuri de coloane, când tipul este o matrice, dar pentru simplitate, compoziția matricei este dată de același tip, pentru a nu se confunda )

////// formarea structurii specificațiilor tehnice (crearea coloanelor) //// definesc calificative pentru înlocuire în câmpurile calificative ale specificației tehnice CN = New QualifiersNumbers(18, 9); KS = NewStringQualifiers(200); CD = NewDateQualifiers(DataParts.DateTime) ; //// definiți descrieri de tip pentru viitoarele coloane TK // O matrice este descrierea inițială a tipurilor, pe baza căreia se va construi una nouă // Vă rugăm să rețineți că pentru coloanele TK, descrierea inițială a tipului din acest exemplu este o matrice Array = New Array; Matrice. Adăugați(Tip(„Șir”)); TypeDescriptionString = New TypeDescription(Matrice, , KS) ; Matrice. Clar() ; Matrice. Adaugă(Tip(„Număr”)); TypeDescriptionNumber = New TypeDescription(Matrice, , , CN) ; Matrice. Clar() ; Matrice. Adăugați(Tip(„Data”)); DescriptionTypesDate = New DescriptionTypes(Matrice, , , , CD) ; Matrice. Clar() ; Matrice. Adaugă(Tip( „DirectoryLink.Nomenclatură”) ) ; Type DescriptionNomenclature = New Type Description (Matrice) ; Matrice. Clar() ; Matrice. Adaugă(Tip( „DirectoryLink.SeriesNomenclature”) ) ; TypeDescriptionSeries = New TypeDescription(Matrice) ; Matrice. Clar() ; Matrice. Adaugă(Tip( „DirectoryLink.Quality”) ) ; TypeDescriptionQuality = New TypeDescription(Array) ; Matrice. Clar() ; Matrice. Adăugați(Tip(„Boolean”)); TypeDescriptionBoolean = New TypeDescription(Matrice) ; // adăugând de fapt coloane la TK (creând structura viitorului TK) TK. Coloane. Add("Nomenclatură", DescriptionTypesNomenclature) ; TK. Coloane. Adaugă(„Cod”, TypeDescriptionString) ; TK. Coloane. Adăuga( "Nomenclatură de serie", DescriptionTypesSeries); TK. Coloane. Adăugare(„CodCont” , Tip DescriptionString) ; TK. Coloane. Adaugă(„Data acțiunii” , TipDescriereData) ; TK. Coloane. Adaugă(„Calitate” , TipDescriereCalitate) ; TK. Coloane. Adaugă(„NumărUS”, DescriptionTypesNumber) ; TK. Coloane. Adăugați(„Scrieți” , TypeDescriptionBoolean) ; . . . //////// formarea structurii specificațiilor tehnice (crearea coloanelor) ////////////////////////////////////////////////////////

Pentru a adăuga un rând la un tabel de valori, vezi