Găsiți o coloană în tabelul cu valori 1s. Este important să nu confundați niciodată o proprietate de obiect cu o metodă de obiect.

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

1. Creați un tabel de valori

ValueTable = Nou ValueTable;


2. Creați coloane ale tabelului de valori:

ValueTable.Columns.Add(„Nume”);
ValueTable.Columns.Add(„Nume”);


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


NewString.Name = "Vasily";
NewRow.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ă.

FoundString = ValueTable.Find(LookupValue);


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

FoundString = ValueTable.Find(LookupValue, „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”, LookupValue);
ArrayFoundStrings = ValueTable.FindStrings(SearchStructure);


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

7. Cum să parcurgeți un tabel de valori în ordine aleatorie

Pentru fiecare CurrentRow din bucla ValueTable
Raport (CurrentLine.Name);
EndCycle;

Faceți același lucru folosind indecși:

SeniorIndex = ValueTable.Count() - 1;
Pentru MF = 0 prin ciclul SeniorIndex
Raport(ValueTable[Count].Name);
EndCycle;


8. Ștergerea unui rând de tabel cu valori existente

ValueTable.Delete(RemoveRow);

prin index

ValueTable.Delete(0);


9. Ștergerea unei coloane existente din tabelul de valori

ValueTable.Columns.Delete(RemoveColumn);


prin index

ValueTable.Columns.Delete(0);

Trebuie avut în vedere că ștergerea unui rând (sau a unei coloane) „din mijlocul” tabelului de valori va duce la o scădere cu unul dintre indicii rândurilor care au fost „după” șters.

10. Cum se completează tabelul 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 FiscalAccounting Flag din tabelul de valori din Tabelul de valori trebuie completată cu valoarea False

ValueTable.FillValue(False, „Stavilul de contabilitate fiscală”);


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

12. Cum se completează tabelul de valori „TableRecipient” cu datele din tabelul de valori „SourceTable”?

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

TableReceiver = TableOriginal.Copy();


Opțiunea a doua: tabelul TableReceiver există și este păcat să-și piardă coloanele și restricțiile privind tipurile de date de 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 de SourceTable din SourceTable Loop
FillPropertyValues(NewString, SourceTableString);
EndCycle


Pentru fiecare rând al tabelului sursă, se adaugă un nou rând în tabelul de destinație, 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 același nume, tabelul de destinație se va termina cu 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 permise ale coloanei 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ă.

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

SimilarColumns = New Array();

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

Dacă MatchedColumn<>Nedefinit Atunci

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

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

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

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

EndIf;

EndCycle;

// Buclă prin rândurile tabelului sursă.
Pentru fiecare rând de SourceTable din SourceTable Loop

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

// Completați valorile în celulele care se potrivesc.
Pentru fiecare buclă NameColumns Of Same NameColumns
NewString[ColumnName] = SourceTableString[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ă în tabelul destinatar se găsește o coloană cu același nume, colectăm în variabile toate proprietățile pentru noua coloană. 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 destinatar și deschidem o buclă prin numele coloanelor din matricea de coloane potrivite.
În interiorul acestei bucle imbricate, umplem celulele tabelului destinatar cu datele celulei tabelului sursă.

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

Când adăugați o coloană, puteți specifica pur și simplu numele acesteia și nu atingeți 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. Este necesar să treceți o descriere de tipul permis pentru coloana acolo. Descrierea în sine poate fi obținută folosind constructorul, pasând numele șirului tipului ca parametru (dacă sunt multe tipuri, apoi separate prin virgule) sau o matrice de tipuri valide.

Adăugarea unei coloane care specifică tipul de date

// Restricții privind tipurile de date coloane:
// Numai elemente din directorul „Contractanti”.
ValueTable.Columns.Add(„Cont”, New TypeDescription(„ReferenceReference.Accounts”));


Dacă există un șir printre tipurile permise pentru completarea datelor coloanei, puteți limita adâncimea de biți (lungimea) acestuia, puteți specifica utilizarea unei lungimi variabile sau fixe. Toate acestea sunt furnizate prin crearea unui obiect folosind constructorul StringQualifiers. În plus, 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ătiți și setați limite pentru datele de tip String.
String Qualifiers = New String Qualifiers (20, ValidLength.Variable);
AllowedTypes = NewTypeDescription("String",StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Puteți face același lucru pentru calificativele de număr și dată.
Vă rugăm să rețineți: descrierea tipului poate fi construită de constructor atât „de la zero”, și puteți utiliza o descriere a tipului existentă ca bază

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

// Extinderea descrierii de tipuri utilizate anterior.
Număr de calificare = New Number Qualifiers (10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
ExtendedValidTypes = NewTypeDescription(ValidTypes, „Număr, dată”, NumărCalificatori,Calificatori pentru dată);

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

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.

Toți cei care au programat într-o aplicație obișnuită s-au confruntat adesea cu sarcina de a obține un tabel arbitrar de valori pe un formular. Un tabel arbitrar de valori este înțeles ca un tabel, al cărui număr și tip de coloane nu sunt cunoscute în prealabil. Adică pot 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 și apoi transferați programatic tabelul de valori creat. ​\u200b\u200bla acest element. Apoi cu o comandă simplă:

FormElements.TableField.CreateColumns();

pentru a primi tabelul de valori gata pe formular. S-ar părea că ar putea fi mai ușor.

Totul a fost într-o aplicație normală. Lucrurile s-au schimbat într-o aplicație gestionată. Deci nu poate fi creat doar un tabel arbitrar. Acum trebuie fie să parametrizați rigid tabelul de valori pe formular, fie să îl creați programatic (pentru a descrie, 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 un formular gestionat.

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 cu ajutorul unui buton - așa aveți nevoie.

Crearea unui tabel pe formular are loc prin descrierea tabelului de valori ca atribut:
ArrayChoiceType = Matrice nouă; ArrayChoiceType.Add(Type("ValueTable")); ChoiceTypeDescription = New ChoiceTypeDescription(ChoiceTypeArray); ArrayAttributes = Matrice nouă; ArrayAttributes.Add(New FormAttribute("ScheduleTable", ChoiceTypeDescription, "", "TRN")); Acum trebuie să creăm un tabel cu valori programatice 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 valoarea coloanelor care vor conține numere sau date poate fi creată prin „Descrierea tipurilor”. Linia de jos este că coloanele din tabelul de valori trebuie să aibă un anumit tip. Dacă, de exemplu, se presupune că utilizatorul va completa datele din aceste coloane în mod interactiv, atunci nu puteți adăuga o coloană de tabel de valori cu un nume simplu, aceasta trebuie să aibă un tip. Rețineți - acest lucru este foarte important. vom transfera aceste tipuri în tabelul din formular.
Creați un tabel care conține mai multe coloane:
CD = New DateQualifiers(DateParts.Time); ArrayCD = matrice nouă; ArrayKD.Add(Tip(„Data”)); TypeDescriptionTime = New TypeDescription(ArrayKD,KD); TK = New ValueTable;
TK.Columns.Add(„De la”, TypeDescriptionTime);
TK.Columns.Add(„Înainte”, TypeDescriptionTime);
TK.Columns.Add(„Nume”);
TK.Columns.Add("Notă");//Nume și Notă - șiruri În continuare, vom completa tabelul nostru de programe TK cu datele necesare. Obținem un tabel TK care conține valorile necesare și este gata pentru a fi transferat la atributul formular creat. Pentru fiecare coloană din TK.Column Loop

ArrayAttributes.Add(New FormAttribute(Column.Name, Column.ValueType,"ScheduleTable"));
EndCycle;
ChangeAttributes(ArrayAttributes);
SelectionFieldTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = DisplayTable.List;

Iată o combinație atât de simplă și masa noastră este gata.

Pentru fiecare coloană din TK.Column Loop

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

Proiectare condiționată, dacă avem nevoie, 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 „Alegere”:

ChoiceFieldTable.SetAction("Choice","TCChoice");

Pentru a gestiona acest eveniment sub forma unei proceduri, este scrisă o procedură separată:

&AtClient
Procedura TSNSelect(TK, SelectedRow, Field, StandardProcessing)
//comenzile handlerului EndProcedure

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

&AtClient

Ei bine, ultimul lucru pe care am vrut să-l adaug este că, după toate aceste acțiuni, nu trebuie să uităm să transferăm tabelul finit în atributul formular:

ValueVFormAttribute(TK, „Tabel de planificare”);

Iată ce avem ca rezultat:


Și aici este gestionarea evenimentului „Select”:



Postfaţă.

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

Puteți descărca o procesare care creează în mod programatic un tabel de valori și rezultate într-un formular gestionat cu comentarii pentru a vă ajuta să vă creați tabelele.

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

1. Găsiți

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

Această metodă returnează primul șir găsit cu valoarea pe care o căutați 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 găsiți o valoare, va trebui să o ștergeți din tabel pentru a găsi următoarea.

Pentru a nu suferi astfel, există următoarea metodă, care vă permite să găsiți o serie de șiruri potrivite:

2. FindStrings


Selection Structure.Insert("Nomenclatura", TVHorizon); // mai întâi specificăm coloana unde să căutăm, apoi ce să căutam.

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 linia matricei sau, ca și în metoda anterioară, pentru linia găsită, veți modifica valoarea din tabelul de valori procesat.

Ce altceva este bun la această metodă este că poate căuta simultan mai multe coloane din tabelul de valori:


SelectionStructure = Structură nouă;
Selection Structure.Insert("Nomenclatura", TVHorizon);
Selection Structure.Insert("Cantitate", 10);
FoundStringArray = TKNomenclature.FindStrings(SelectionStructure);

Singurul negativ, după cum puteți vedea, nu puteți utiliza alte tipuri de comparație, altele decât „egale”

Pentru a ține cont de bani și de bunuri, diferite tabele sunt utilizate pe scară largă în afaceri. Aproape fiecare document este un tabel.

Un tabel listează mărfurile care urmează să fie expediate din depozit. Într-un alt tabel - obligația de a plăti pentru aceste bunuri.

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

Tabelele din 1C mai sunt numite și „părți de masă”. Cărțile de referință, documentele și altele le au.

Interogarea returnează un tabel ca rezultat al execuției sale, 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 descă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ți masa
Selecție = Query.Execute().Select();
// ocolește toate rândurile rezultatului interogării în ordine
While Selection.Next() Loop
Raport (Selectie.Nume);
EndCycle;

//Opțiunea 2 - încărcarea în tabelul de valori
Interogare = Interogare nouă ("SELECT Name FROM Directory.Nomenclature");
// obțineți masa
Tabel = Query.Execute().Upload().
// atunci putem și ocoli toate liniile
Pentru fiecare rând din bucla de masă
Raport (String.Nume);
EndCycle;
//sau accesează în mod arbitrar șiruri de caractere
String = Table.Find ("Lopata", "Nume");

O caracteristică importantă este că în tabel, care este obținut din rezultatul interogării, toate coloanele vor fi puternic tastate. Aceasta înseamnă că prin solicitarea câmpului Nume din căutarea Nomenclaturii, veți primi o coloană de tip String cu o lungime permisă 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 de control. În mod similar, puteți selecta controlul Formular/Inserare din meniu.

Datele pot fi stocate într-o configurație - atunci trebuie să selectați o parte 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.

Atunci când alegeți o parte tabulară, 1C însuși va adăuga coloane la tabelul din formular. Șirurile introduse de utilizator într-un astfel de tabel vor fi salvate automat împreună cu directorul/documentul.

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

Aceasta înseamnă că a fost selectat un tabel arbitrar de valori. Nu va adăuga automat coloane, 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 coloanei, 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, dar o parte 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 ViewOnly. Aceste proprietăți sunt utile pentru organizarea tabelelor destinate afișării informațiilor, dar nu și pentru editare.

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

În proprietățile barei de comenzi, bifați caseta de selectare Completare automată, astfel încât butoanele de pe bara de instrumente 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 secțiune tabelară pe formular, extindeți ramura Obiect și trageți una dintre secțiunile tabelare spre stânga. Si asta e!

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

Pentru a adăuga coloane, utilizați meniul butonului dreapta al mouse-ului pe acest atribut de formular, elementul Adăugare coloană atribut.

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

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

Exportarea 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 Afișare listă.

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

Postat pe 21 septembrie 2011

Tabelul valorilor 1C - partea 3. metadate. Iterarea peste coloanele tabelului 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 se referă la o serie de articole 1C de la zero; programarea 1c de la zero; tabel de valori 1c)

Pentru a explica materialul și pentru a putea rula exemplele noastre de cod de program „live”, avem nevoie de câteva tabelul de testare a valorilor 1C. O parte din exemplele noastre va extrage date dintr-un tabel de valori, așa că vom face un tabel cu trei coloane „Nume”, „Prenume”, „Patronimic” ș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:

MyTR = New ValueTable; // creează un nou tabel de valori stocat în variabila „MyTR” MyTR.Columns.Add(„Nume”); // creăm coloana "Nume" MyTR.Columns.Add("Prenumele"); // creează coloana "Nume" MyTM.Columns.Add("Patronimic"); // creăm coloana „Nume de mijloc” // adăugăm primul rând la tabelul nostru de valori NewRow = MyТЗ.Add(); NewLine.Surname = "Chapaev"; NewString.Name = "Vasily"; NewString.Patronymic = „Ivanovici”; // adaugă a doua linie NewLine = MyТЗ.Add(); NewLine.Lastname = "Dzerzhinsky"; NewString.Name = „Felix”; NewLine.Patronymic = „Edmundovich”; // adaugă a treia linie NewLine = MyTR.Add(); NewRow.LastName = "Kotovsky"; NewString.Name = „Gregory”; NewString.Patronymic = „Ivanovici”;

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

Primul eșantion de cod repetă prin coloanele tabelului de valori 1C ca o colecție.

// afișează numele tuturor coloanelor TK pentru fiecare coloană din TK-ul meu.Columns Notify loop("Numele coloanei: " + Column.Name); EndCycle;

Bucla noastră va afișa toate numele coloanelor în caseta de mesaj 1C:

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

Vedem că o buclă de colecție specială este folosită pentru a itera coloanele, similar buclei de iterare a rândurilor (în ultimul articol). MyTM.Columns- aceasta este o colecție de coloane ale tabelului de valori 1C "MoyaTZ". Colecția conține obiecte de tip „ColumnValueTable” Fiecare obiect de acest tip este o coloană a tabelului de valori și conține proprietăți și metode. Referindu-ne la 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.

Vreau să vă atrag atenția asupra titlului ciclului: „Pentru Fiecare Coloană Din MyTR.Columns Loop" Variabila numită "Coloană" inventat de noi. Nu este necesar să folosiți același nume. Puteți numi această variabilă cum doriți, de exemplu „Coloana mea curentă” Atunci exemplul de mai sus ar arăta astfel:

// imprimă numele tuturor coloanelor TK pentru fiecare MyCurrentColumn Din MyTK.Columns Notify Loop("Numele coloanei: " + MyCurrentColumn.Name); EndCycle;

Când subsistemul de execuție 1C întâlnește un ciclu de acest fel, la fiecare trecere a ciclului, el atribuie un element din colecția noastră variabilei cu numele specificat, în acest caz - un element al colecției coloane din tabelul de valori MyTM.ColumnsȘi apoi ne referim la variabila care conține coloana curentă și folosim proprietatea "Nume".

Vă sugerez să afișați numărul fiecărei coloane din colecția de coloane lângă numele coloanei:

// afișează numărul și numele tuturor coloanelor din tabelul de valori pentru fiecare coloană din MyTR.Columns LoopColumnNumber = MyTR.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;

Textul va fi afișat în caseta 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

Să fim atenți la faptul că coloanele din tabelul de valori 1C sunt numerotate începând de la zero, la fel ca și rândurile tabelului de valori.

Numărul de coloane din tabelul de valori 1C

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

Number ofColumns = MyTM.Columns.Number(); Raport (Număr de coloane);

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

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

Să facem o buclă prin toate coloanele tabelului de valori folosind indicii coloanei (numerele). Amintiți-vă că numerotarea coloanelor începe de la zero. Prin urmare, trebuie să creștem contorul ciclului „Sh” de la zero la un număr egal cu numărul de coloane minus unu.

Pentru SC = 0 By MyTM.Columns.Quantity() - 1 Loop CurrentColumn = MyTM.Columns[SC]; Notify(CurrentColumn.Name); 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" MyTM.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: Notify(CurrentColumn.Name);

Este important să nu confundați niciodată o proprietate de obiect cu o metodă de obiect.

O proprietate este un fel de 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: MyTM.Columns.Quantity()

Dacă ne referim la metodă, uitând să scriem paranteze, interpretul 1C ne va da un mesaj de eroare și nu va rula codul pentru execuție. Deoarece interpretul va presupune că nu accesăm o metodă, ci o proprietate - pentru că nu există paranteze. Și nu va putea găsi proprietăți cu acel nume (pentru că există doar o metodă cu acel nume) - ceea ce va fi spus în mesajul de eroare.

Asta va scrie interpretul dacă uit să pun paranteze într-un apel de metodă într-un mod atât de greșit MyTM.Columns.Quantity(fără paranteze după „Cantitate()”):

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

Î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 concepte diferite.

Obținerea datelor din tabelul cu valori 1C folosind numerele coloanei

Vă ofer, pentru început, 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-completat de la începutul articolului. Știm sigur că tabelul are primul 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 = MyTR; // obține primul rând (numerotare de la zero) ColumnFirstValue = RowFirst; // obține valoarea primei coloane (numerotarea coloanelor este tot de la zero) Report(FirstColumnValue); // afișează valoarea primei coloane din primul rând al tabelului

Ecranul va afișa:

Chapaev

Mai întâi am obținut obiectul rând tabel de valori accesând tabelul de valori folosind operatorul [...]. (dacă ai uitat cum să faci asta, poți să te uiți la articolele anterioare) În interiorul operatorului, am trecut argumentul „0”. Acesta este indexul primului rând al tabelului de valori. Prima linie = MyTR;

Mai mult, avem și dreptul de a ne referi la obiectul șir folosind operatorul [...]. În interiorul acestei instrucțiuni, am trecut numărul coloanei tabelului de valori, în acest caz și „0”. Și astfel, am obținut valoarea coloanei cu numărul "0" pentru rândul curent al tabelului cu numărul "0". Am afișat această valoare pe ecran și reprezintă șirul „Chapaev”.

Să ne complicăm puțin exemplul:

Prima linie = MyTR; // 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 modific acest exemplu în continuare, astfel încât să ne putem descurca fără o variabilă "Prima linie"

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

Ecranul va fi același.

Chapaev Vasily Ivanovici

Am văzut în exemplul de mai sus că pentru a accesa o valoare care se află într-un anumit rând și coloană specifică a unui tabel de valori, putem folosi apelul consecutiv a doi operatori [...] sub această formă: ValueTable[IndexRows][IndexColumns]

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 RowCount = 0 By MyTM.Quantity() - 1 Buclă // buclă prin rânduri Pentru ColumnCount = 0 By MyTM.Columns.Quantity() - 1 Buclă // buclă imbricată prin coloane // obține valoarea celulei (din rândul curent și coloanele curente) CellValue = MyTR[RowCount][ColumnCount]; // afișează numărul rândului, numărul coloanei și valoarea celulei Raport ("Line #" + RowCount + "coloana #" + ColumnCount + " = " + CellValue); EndCycle; EndCycle;

Următoarele vor fi afișate pe ecran:

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

Cu ajutorul a două bucle, dintre care una este imbricată în cealaltă, am afișat valorile tuturor coloanelor din toate rândurile tabelului de valori 1C. În acest caz, nu am folosit numele coloanelor, ci ne-am referit la coloane și rânduri prin indicii lor. Pentru o mai bună î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 RowCount = 0 By MyTR.Quantity() - 1 Buclă // Buclă prin rânduri Raport(" ======= Rând # " + RowCount + " ======="); A raporta(" "); // line feed (inserați o linie goală) Pentru ColumnCount = 0 By MyTR.Columns.Quantity() - 1 Loop // bucla de iterație a coloanei imbricate // obțineți valoarea celulei (din rândul curent și coloana curentă) CellValue = MyTR[RowCount][ ColumnCount]; // obțineți numele coloanei ColumnName = MyTR.Columns[ColumnCount].Name; // afișează numele coloanei și valoarea celulei Report(ColumnName + ": " + CellValue); EndCycle; A raporta(" "); // linie nouă (introduceți linia goală) EndCycle;

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

Linia nr. 0 ======= Nume: Chapaev Prenume: Vasily Al doilea nume: Ivanovich ======= Linia nr. 1 ======= Nume: Dzerzhinsky Prenume: Felix Middle nume: Edmundovich ===== == Linia nr. 2 ======= Prenume: Kotovsky Prenume: Grigory Patronimic: Ivanovich

Da, aproape am uitat. Când folosim doi operatori [...][...] într-un rând, putem trece numele acestei coloane în loc de indexul coloanei: ValueTable[RowIndex][ColumnName]

Pentru RowCount = 0 By MyTR.Quantity() - 1 Buclă // Buclă prin rânduri Raport(" ======= Rând # " + RowCount + " ======="); A raporta(" "); // line feed (inserarea unei linii goale) Pentru ColumnCount = 0 By MyTR.Columns.Quantity() - 1 Buclă // buclă imbricată prin coloane ColumnName = MyTR.Columns[ColumnCount].Name; // obțineți coloana nameCellValue = MyTR[RowCount][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 din acest articol.

Primirea CORECTA a tuturor datelor din tabelul de valori 1C, folosind bucle pentru a itera pe colecția de rânduri și colecția de coloane

Pentru fiecare rând curent din bucla MyTR // parcurge colecția de șiruri Raport(" ======= Linia # " + MyTR.Index(CurrentRow) + " ======="); A raporta(" "); Pentru fiecare coloană curentă din bucla MyTR.Columns // buclă imbricată prin colecția de coloane ColumnName = CurrentColumn.Name; // obțineți coloana nameCellValue = CurrentRow[ColumnName]; // obține valoarea celulei DUPĂ NUMELE coloanei Raport (ColumnName + ": " + CellValue); // afișează numele coloanei și valoarea celulei EndCycle; A raporta(" "); EndCycle;

În exemplu, s-au folosit două bucle. Bucla de colectare a coloanelor este imbricată în interiorul buclei de rând. Dacă te-ai ocupat de exemplele de mai sus și ai citit articolele anterioare, atunci nu vei avea nicio dificultate în a înțelege cum funcționează acest exemplu.

În cele din urmă, voi păstra numărul de linii de cod din ultimul nostru exemplu cât mai scurt posibil, eliminând utilizarea variabilelor intermediare. Vom obține un eșantion de „cod industrial” care este utilizat în aplicațiile din lumea reală.

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 să fie cel puțin comentat, astfel încât după ceva timp să fie mai ușor de înțeles textele programului.

Pentru fiecare rând curent din bucla MyTR // buclă prin linii Raport (" ======= Line # " + MyTR.Index(CurrentRow) + " =======" + Symbols.PS); Pentru fiecare coloană curentă din bucla MyTr.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 vă va fi trimis prin e-mail. Deveniți un programator completând sarcini pas cu pas.

Tot ce aveți nevoie pentru a participa este un computer și 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; cutie-umbră: 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;)