Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • OS
  • Listele și tabelele de valori sunt stocate în. Și acum: repetarea materialului

Listele și tabelele de valori sunt stocate în. Și acum: repetarea materialului

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ă.

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 rânduri noi 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 din tabelul de valori

ValueTable.Columns.Delete(ColumnDeleted);


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

Tabel de valori Completați valorile (fals, „Stavilul contabilității fiscale”);


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 „Receiver Table” cu date din tabelul de valori „SourceTable”?

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 pur și simplu să specificați 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, „Number, Date”, Number Qualifiers, Data Qualifiers);

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

Cele mai bune articole pe această temă