Contacte

Completați tabelul de valori din formularul 1c 8.2. Ce metode există și cum să căutați mai multe valori simultan

Un tabel de valori este un obiect universal specific conceput pentru a stoca date într-o reprezentare tabelară. Diferența cheie dintre un tabel și obiectele aplicației este lipsa legării la tabelele fizice ale bazei de date. Tabelul de valori există doar în RAM, care, pe de o parte, oferă oportunități unice, iar pe de altă parte, impune anumite restricții. Cu toate acestea, posibilitățile de interacțiune cu tabelul sunt comparabile cu interacțiunea cu obiectele care există efectiv în baza de date.

Din punct de vedere istoric, tabelul de valori din 1C are un dublu scop, fiind un analog virtual al tabelelor existente, dar în același timp este și un element de control. Odată cu trecerea la o aplicație gestionată, o mare parte din această funcționalitate a fost depreciată, dar acum poate fi și un element de interfață cu utilizatorul, dar cu unele limitări semnificative.

Structura unui tabel de valori ca obiect

Proprietățile unui tabel de valori sunt determinate de combinații a două colecții predefinite: coloanele și rândurile sale.

Tabelul de valori Coloane

O coloană a unui tabel de valori este proprietatea sa definitorie. Este setul de coloane din tabel care determină structura acestuia. Coloanele corespund câmpurilor tabelelor fizice sau coloanelor familiare din interfața de utilizator a unei secțiuni tabelare sau a unui jurnal de documente. O coloană poate avea un nume intern, un tip de valoare și un titlu care este afișat atunci când lucrează interactiv cu tabelul.

Deoarece coloanele sunt o colecție de obiecte, puteți adăuga, șterge și edita coloane.

Rând tabel de valori

Din perspectiva interfeței software, șirurile sunt o colecție separată încorporată într-un tabel de valori. Ele sunt analoge cu înregistrările din tabelele fizice, adică rândurile familiare utilizatorului într-o secțiune tabelară sau jurnal de documente. Fiecare rând individual este un obiect cu un set de proprietăți denumite, ale căror nume corespund cu numele coloanelor din tabel.

Astfel, interacțiunea cu un șir este foarte asemănătoare cu interacțiunea cu alte obiecte. Puteți citi și scrie proprietățile acestuia, inclusiv folosind funcția predefinită „FillPropertyValues()”. Deoarece rândurile sunt colecția principală a tabelului de valori, metoda „Clear()” este folosită pentru a șterge toate rândurile din tabel.

Creați un tabel de valori

Există multe modalități de a obține un tabel de valori gata de utilizare. Să ne uităm la unele dintre ele. Fiecare exemplu va fi furnizat ca liste de coduri cu comentarii.

Crearea unui tabel folosind constructorul

Metoda principală care vă permite să creați exact tabelul de care are nevoie dezvoltatorul este, din păcate, cea mai laborioasă, deoarece necesită specificarea manuală a tuturor proprietăților necesare tabelului.

DemoTable = New ValueTable; // În primul rând, inițializam TK-ul // În continuare, determinăm parametrii necesari pentru coloanele noi și îi adăugăm în colecție // Crearea coloanei „Nomenclatură” Nume = „Nomenclatură”; ValueType = New TypeDescription("DirectoryLink.Nomenclature"); Titlu = „Nomenclatură (produs)”; DemoTable.Columns.Add(Nume, ValueType, Header); // Crearea coloanei „Cantitate” Nume = „Cantitate”; ValueType = New TypeDescription(„Număr”); DemoTable.Columns.Add(Nume, ValueType); // Ca rezultat al acestor manipulări, am creat un tabel gol cu ​​coloane tastate // Dacă trebuie să utilizați o tastare mai precisă a tipurilor primitive, atunci ar trebui să utilizați sintaxa extinsă a constructorului „Descrierea tipurilor”

Crearea unui tabel prin copiere

Dacă aveți o referință cu o structură și/sau o compoziție adecvată la îndemână, puteți copia sau descărca tabelul de referință cu valori. Dacă tabelul de referință este un alt tabel, atunci trebuie să utilizați metoda „Copiați tabelele de referință”. Dacă aveți de-a face cu o parte tabelară sau un set de înregistrări de registru, trebuie să utilizați metoda „Descărcați tabelul de valori”. Dacă aveți nevoie doar de structură, puteți utiliza metoda „Copy Columns”.

// Opțiune cu copierea tuturor rândurilor din standardul de specificații tehnice, dar păstrând doar cele două coloane specificate din Standard = "Nomenclatură, Cantitate"; DemoTable = TableEtalon.Copy(, ColumnsEtalon); // Opțiune cu copierea rândurilor preselectate din standardul de specificații tehnice, păstrând în același timp cele două coloane specificate ale standardului = SelectIntoArrayThe Rows We Need From the Table of the Standard(); ColumnsStandard = "Nomenclatură, Cantitate"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); // Opțiunea de copiere a rândurilor din standardul de specificații tehnice folosind filtrul specificat, păstrând o coloană „Nomenclatură” // Vor fi selectate toate rândurile în care valoarea din coloana Cantitate este 0, doar coloana Nomenclatură Row Selection = New Structure(" Cantitatea" va apărea în tabelul rezultat , 0); ColumnsStandard = "Nomenclatură"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); // Opțiune cu o copie completă a tabelului și ștergerea ulterioară a unui rând cu valoarea câmpului de cantitate egală cu zero și ștergerea întregii coloane „Cantitate” Row Selection = New Structure("Cantitate", 0); ColumnsStandard = "Nomenclatură"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon); TableRow = DemoTable.Find(0, "Cantitate"); DemoTable.Delete(TableRow); DemoTable.Columns.Delete("Cantitate"); // Opțiuni similare și modificările acestora pot fi aplicate părților tabelare și seturilor de înregistrări de registru

Crearea unui tabel cu o interogare

Dacă un șablon al tabelului de care aveți nevoie există în baza de date, atunci puteți utiliza o interogare pentru a crea rapid un tabel cu structura dorită.

// Un exemplu de creare a unui tabel gol pe baza structurii registrului de acumulare // Este ușor de ghicit că în acest fel puteți obține și un tabel umplut Query = New Query("SELECT FIRST 0 * From Accumulation Register. Produse in depozit"); RequestResult = Request.Execute(); DemoTable = Query Result.Unload(); // Un exemplu de creare a unui tabel gol folosind tipuri și nume de câmp specificate explicit Interogare = Interogare nouă; Query.Text = "SELECT TOP 0 | Value(Directory.Nomenclature.EmptyLink) AS Nomenclature, | EXPRESS(0 AS NUMBER(15, 3)) AS Cantitate"; RequestResult = Request.Execute(); DemoTable = Query Result.Unload(); // IMPORTANT! Nu uitați că tipurile de valori ale coloanei obținute dintr-o solicitare conțin întotdeauna tipul Null // Astfel, TK-ul creat de cerere are întotdeauna tipuri de coloane compuse

Concluzie

În acest scurt articol, am analizat proprietățile de bază și tehnicile practice pentru crearea unui tabel de valori, suficient pentru înțelegere și începerea utilizării. Obiectul tabel de valori în sine este atât de multifațetat încât o descriere detaliată a capacităților sale necesită scrierea unui articol separat despre tehnici și metode de lucru.

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 = Solicitare nouă ("SELECT Name FROM Directory.Nomenclature");
//obține masa
Tabel = Query.Run().Unload().
//mai departe putem itera și prin toate liniile
Pentru fiecare rând din ciclul de masă
Raport (String.Nume);
EndCycle;
//sau accesează în mod arbitrar șiruri de caractere
Rând = 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ă cu formularul 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 Comenzi. În mod similar, puteți selecta Form/Insert Control din meniu.

Datele pot fi stocate în configurație - atunci 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ă.

Căutați în tabelul cu valorile 1C

Ce metode există și cum să căutați mai multe valori simultan.

Există două metode speciale pentru căutarea unui tabel de valori:

1. Găsiți

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//Putem specifica, de asemenea, în ce coloane să căutăm pentru a accelera căutarea
FoundString = TZNomenclature.Find(TVHorizon, „Nomenclatură”);

Această metodă returnează primul rând găsit cu valoarea dorită sau Nedefinit dacă nu îl găsește. Prin urmare, este convenabil să-l folosiți pentru a căuta valori unice, deoarece în caz contrar, atunci când o valoare este găsită, va trebui să o eliminați din tabel pentru a găsi următoarea.

Pentru a evita această problemă, există următoarea metodă care vă permite să găsiți o serie de șiruri de caractere potrivite:

2. FindStrings


Selection Structure.Insert("Nomenclatura", TVHorizon); // indică mai întâi coloana unde să cauți, apoi ce să cauți.

Această metodă returnează întotdeauna o matrice, dar poate fi goală dacă nu se găsește nimic. Și această metodă, ca și cea anterioară, returnează rândurile tabelului de valori înseși, și nu valorile înseși într-o matrice separată. Prin urmare, prin modificarea valorilor din șirul matricei sau, ca și în metoda anterioară, pentru șirul găsit, veți modifica valoarea din tabelul de valori procesat.

Un alt lucru bun despre această metodă este că poate căuta simultan prin mai multe coloane ale tabelului de valori:


SelectionStructure = Structură nouă;
Selection Structure.Insert("Nomenclatura", TVHorizon);
Selection Structure.Insert("Cantitate", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Singurul negativ, după cum puteți vedea, este că nu puteți utiliza alte tipuri de comparații, altele decât „egal”

Iată un mic fapt pentru început - exemple simple de lucru cu un tabel de valori:

1. Creați un tabel de valori

ValueTable = Nou ValueTable;


2. Creați coloane pentru tabelul de valori:

ValueTable.Columns.Add(„Nume”);
Value Table.Columns.Add("Nume");


3. Adăugați noi rânduri folosind numele coloanelor:


NewLine.Name = "Vasily";
NewLine.LastName = „Cătecel”;


4. Cum să căutați o valoare în tabelul de valori:
Este necesar să găsiți un rând de tabel care să conțină valoarea dorită.

FoundRow = ValueTable.Find(SearchValue);


5. Găsiți prima apariție în anumite coloane ale tabelului de valori

FoundRow = ValueTable.Find(SearchValue, „Furnizor, Cumpărător”);


6. Dacă trebuie să găsiți toate aparițiile în tabelul de valori:
Folosim structura de căutare.

SearchStructure = Structure ("Angajat", SearchValue);
Array of FoundRows = ValueTable.FindRows(SearchStructure);


Să creăm o structură de căutare, fiecare element al căruia va conține numele coloanei ca cheie și valoarea dorită în această coloană ca valoare. Trecem Structura de căutare ca parametru la metoda FindLines(). Ca rezultat, obținem rânduri de tabel.
Dacă adăugați o căutare pentru valoarea dorită în structura de căutare, de exemplu, tot în coloana Responsabil, atunci ca urmare a aplicării metodei FindLines() vom obține toate rândurile în care atât Angajat, cât și Responsabil sunt egale cu valoarea căutată.

7. Cum să iterați printr-un tabel de valori în ordine aleatorie

Pentru fiecare rând curent din bucla tabelului de valori
Raport (CurrentRow.Name);
EndCycle;

Același lucru folosind indecși:

SeniorIndex = ValueTable.Quantity() - 1;
Pentru cont = 0 la SeniorIndex Cycle
Raport(ValoriTabel[Cont].Nume);
EndCycle;


8. Ștergerea unui rând de tabel de valori existent

ValueTable.Delete(Rândul de șters);

prin index

ValueTable.Delete(0);


9. Ștergerea unei coloane existente a tabelului de valori

ValueTable.Columns.Delete(ColumnToDelete);


prin index

ValueTable.Columns.Delete(0);

Este necesar să se țină cont de faptul că ștergerea unui rând (sau a unei coloane) „din mijlocul” tabelului de valori va duce la o scădere cu unu a indicilor rândurilor situate „după” șterse.

10. Cum se completează un tabel de valori dacă numele coloanelor sunt conținute în variabile?

NewRow = ValueTable.Add();
NewRow[ColumnName] = Valoare;


11. Cum să umpleți întreaga coloană a tabelului de valori cu valoarea dorită?
Coloana Flag Contabilitate fiscală din tabelul de valori Tabelul de valori trebuie completată cu valoarea Fals

Tabelul de valori Completați valori (False, „Stavilul de contabilitate fiscală”);


Folosim metoda FillValues() pentru tabelul de valori. Primul parametru este valoarea care trebuie completată. Al doilea parametru este numele coloanei care trebuie completată.

12. Cum pot completa tabelul de valori „Tabel receptor” cu date din tabelul de valori „Tabel sursă”?

Dacă Tabelul Destinatari nu există încă în momentul operațiunii sau nu trebuie să fie salvate coloanele sale anterioare, îl puteți crea ca o copie completă a originalului

Recipient table = Source table.Copy();


Opțiunea a doua: tabelul ReceiverTable există și ar fi păcat să-și piardă coloanele și restricțiile privind tipurile de date coloane. Dar trebuie să completați datele pentru coloanele ale căror nume se potrivesc cu numele tabelului sursă.

Transfer parțial de date pentru coloanele cu nume care se potrivesc:

Pentru fiecare rând al SourceTable din ciclul SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Sfârșitul ciclului


Pentru fiecare rând al tabelului sursă, se adaugă un nou rând la tabelul de primire, iar valorile sunt completate în acele coloane din noul tabel ale căror nume se potrivesc cu numele coloanelor din tabelul sursă.

Dacă tabelele nu au coloane cu aceleași nume, tabelul de destinație va ajunge să conțină atâtea rânduri cu valori nule câte rânduri au existat în tabelul sursă.
Dacă pentru unele coloane cu același nume tipul de valoare a datelor din tabelul sursă nu se încadrează în matricea de tipuri de coloane permise din tabelul de destinație, vom obține valori goale în astfel de câmpuri.
Să luăm în considerare al treilea caz. În cazul coloanelor cu același nume, coloana tabelului de destinație trebuie adusă în deplină conformitate cu coloana tabelului sursă.

Copiere completă a datelor pentru coloanele cu nume care se potrivesc

Aceleași coloane = New Array();

Pentru fiecare coloană din SourceTable.Columns Cycle
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Dacă se potrivește coloană<>Nedefinit Atunci

// Obține proprietățile coloanei.
Nume = Coloană.Nume;
ValueType = Column.ValueType;
Antet = Column.Header;
Latime = Column.Width;

// Înlocuiește coloanele din tabelul de destinație.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert(Index, Name, ValueType, Header, Width);

// Adăugați următorul nume al coloanelor care se potrivesc în matrice.
Aceleași coloane.Add(Column.Name);

endIf;

EndCycle;

// Parcurgeți rândurile tabelului sursă.
Pentru fiecare rând al SourceTable din ciclul SourceTable

// Adăugați un nou rând la tabelul de destinație.
NewRow = TableReceiver.Add();

// Completați valorile în celulele potrivite.
Pentru fiecare Nume Coloane Din Coloane cu același nume Ciclu
NewRow[ColumnName] = SourceTableRow[ColumnName];

EndCycle;

EndCycle;


Va trebui să înlocuim coloana din tabelul de destinație cu una nouă, ale cărei proprietăți se vor potrivi pe deplin cu coloana tabelului sursă.
Prin urmare, dacă o coloană cu același nume este găsită în tabelul destinatar, colectăm toate proprietățile pentru noua coloană în variabile. Apoi, ștergeți-l pe cel vechi și creați o coloană nouă. Apoi parcurgem rândurile tabelului sursă.
În buclă, adăugăm un nou rând la tabelul de primire și deschidem o buclă peste numele coloanelor din matricea de coloane care se potrivesc.
În interiorul acestei bucle imbricate, umplem celulele tabelului de destinație cu datele celulei tabelului sursă.

13. Cum să adăugați coloane la tabelul de valori „ValueTable” cu restricții de tip?

Când adăugați o coloană, puteți să specificați pur și simplu numele acesteia și să lăsați neatins al doilea parametru al metodei Add(). În acest caz, tipul de date al coloanei este arbitrar.

Adăugarea unei coloane fără a specifica un tip de date

// Adăugați o coloană fără restricții de tip.
ValueTable.Columns.Add(„Obiect”);


Puteți completa valoarea celui de-al doilea parametru. Acolo trebuie să treceți o descriere a tipului permis pentru coloană. Descrierea în sine poate fi obținută folosind constructorul, trecându-i ca parametru numele șirului tipului (dacă sunt multe tipuri, separate prin virgule) sau un tablou de tipuri valide.

Adăugarea unei coloane care indică tipul de date

// Restricții privind tipurile de date coloane:
// Numai elemente din directorul „Contrapărți”.
Tabel de valori.Columns.Add("Cont", Descriere nouă a tipurilor ("DirectoryLink.Accounts"));


Dacă printre tipurile permise pentru completarea datelor coloanei este un șir, puteți limita adâncimea de biți (lungimea) acestuia, specificați utilizarea unei lungimi variabile sau fixe. Toate acestea se realizează prin crearea unui obiect folosind constructorul String Qualifiers. În continuare, acest obiect va fi folosit ca unul dintre parametrii constructorului TypeDescription.

Utilizarea calificatorilor pentru a specifica tipul de date al unei coloane de tabel de valori

// Pregătește și stabilește restricții pentru datele de tip String.
String Qualifiers = New String Qualifiers(20, AllowedLength.Variable);
ValidTypes = NewTypeDescription(„String”, StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Acțiuni similare pot fi efectuate în ceea ce privește calificatorii de număr și dată.
Vă rugăm să rețineți: descrierile de tip pot fi construite de către constructor fie „de la zero”, fie o descriere de tip existentă poate fi folosită ca bază.

Utilizarea declarațiilor de tip existente pentru a specifica tipul de date al unei coloane de tabel de valori

// Extindere a descrierii tipului utilizat anterior.
QualifiersNumbers = New QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, „Număr, dată”, Calificatori de număr, Calificatori de dată);

ValueTable.Columns.Add(„Notă”, ExtendedAcceptableTypes);

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 utilizării unui 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 sensul 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 din aceste coloane în mod interactiv, atunci nu puteți adăuga o coloană de tabel de valori pur și simplu cu un nume; 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(Tip(„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. Obținem un tabel TK care conține valorile necesare și este gata pentru a fi transferat la atributul de formular creat. Pentru fiecare coloană din ciclul de coloane TK

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 ciclul de coloane TK

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ВFormProperties(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.



Ți-a plăcut articolul? Împărtășește-l