Objavljeno 21. septembra 2011

Tabela vrijednosti 1C – dio 3. Metapodaci. Petlja kroz kolone tablice vrijednosti

U ovom članku ću vam reći kako raditi s tablicom vrijednosti „nepoznate“ strukture, kako iterirati kroz stupce tablice vrijednosti, kako izvući podatke iz stupaca i redova bez korištenja naziva stupaca. (Ovaj članak pripada seriji članaka 1C od nule; programiranje 1C od nule; tabela 1C vrijednosti)

Da bismo objasnili materijal i bili u mogućnosti da pokrenemo naše primjere koda "uživo", trebaju nam neki test tablica vrijednosti 1C. Neki od naših primjera će izvući podatke iz tablice vrijednosti, pa ćemo napraviti tabelu sa tri kolone “Prezime”, “Ime”, “Srednje ime” i u nju unijeti malu količinu podataka - čak 3 redovi :)

Dakle, napravimo probnu tablicu 1C vrijednosti i popunimo je:

MyTZ = Nova tablica vrijednosti; // kreiramo novu tablicu vrijednosti pohranjenih u varijabli "MyTZ" MyTZ.Columns.Add("Prezime"); // kreiramo kolonu "Prezime" MyTZ.Columns.Add("Name"); // kreiramo kolonu "Name" MyTZ.Columns.Add("Patronymic"); // kreiramo kolonu "Middle name" // dodamo prvi red u našu tablicu vrijednosti NewLine = MyTZ.Add(); NewString.LastName = "Chapaev"; NewLine.Name = "Vasily"; NewString.Middle name = "Ivanovich"; // dodajemo drugi red NewLine = MyTZ.Add(); NewString.LastName = "Dzeržinski"; NewRow.Name = "Felix"; NewString.Middle name = "Edmundovich"; // dodaj treći red NewLine = MyTZ.Add(); NewString.LastName = "Kotovski"; NewLine.Name = "Gregory"; NewString.Middle name = "Ivanovich";

Naša testna tabela se sastoji od tri kolone: ​​Ime, Prezime, Patronim; i ima tri popunjena reda s imenima heroja građanskog rata.

Prvi uzorak koda nabraja kolone 1C tablice vrijednosti kao kolekciju.

// prikazuje imena svih kolona TK-a za svaku kolonu From MyTZ.Columns Cycle Report("Ime kolone: ​​" + Column.Name); EndCycle;

Naš ciklus će prikazati sve nazive kolona u prozoru 1C poruke:

Ime kolone: ​​Prezime Ime kolone: ​​Ime Ime kolone: ​​Srednje ime

Vidimo da se za iteraciju kroz kolone koristi poseban ciklus iteracije kolekcije, sličan ciklusu iteracije reda (u prethodnom članku). MyTK.Columns- ovo je zbirka stupaca 1C tablice vrijednosti "MyTZ". Kolekcija sadrži objekte tipa "Kolona tablice vrijednosti" Svaki objekt ovog tipa je stupac tablice vrijednosti i sadrži svojstva i metode. Pristupanjem ovim svojstvima i metodama dobijamo potrebne informacije o jednoj koloni ili vršimo neke druge radnje sa njom.

Na primjer, pristup svojstvu "ime" (Column.Name) dobijamo ime tekuće kolone.

Skrećem vam pažnju na naslov serije: „Za sve Kolona Iz MyTZ.Culumn Cycle" Varijabla s imenom "kolona" izmislili smo mi. Nije potrebno koristiti isto ime. Ovu varijablu možete nazvati kako god želite, na primjer "MyCurrent Column" Tada bi gornji primjer izgledao ovako:

// prikazuje imena svih kolona TK-a za svaki MyCurrentColumn From MyTK.Columns Cycle Report("Ime kolone: ​​" + MyCurrentColumn.Name); EndCycle;

Kada 1C izvršni podsistem naiđe na ciklus ovog tipa, sa svakim prolazom ciklusa dodeljuje promenljivoj sa navedenim imenom jedan element iz naše kolekcije, u ovom slučaju - jedan element kolekcije kolone tablice vrijednosti MyTK.Columns Zatim pristupamo varijabli koja sadrži trenutni stupac i koristimo svojstvo "ime".

Predlažem da se pored naziva kolone prikaže broj svake kolone u kolekciji kolona:

// prikazuje broj i nazive svih stupaca tablice vrijednosti Za svaku kolonu From MyTZ.Columns Cycle ColumnNumber = MyTZ.Columns.Index(Column); // dobijemo broj kolone ColumnName = Column.Name; // dobijemo naziv kolone Report("Broj kolone:" + Broj kolone + " Naziv kolone: ​​" + Naziv kolone); EndCycle;

Sljedeći tekst će se prikazati u prozoru 1C poruke:

Broj kolone:0 Naziv kolone: ​​Prezime Broj kolone:1 Naziv kolone: ​​Ime Broj kolone:2 Naziv kolone: ​​Srednje ime

Imajte na umu da su stupci u tablici vrijednosti 1C numerirani počevši od nule, baš kao i redovi tablice vrijednosti.

Broj stupaca u tablici 1C vrijednosti

Da bismo saznali broj kolona u tabeli vrijednosti, koristimo metodu "Count()" za kolekciju kolona.

Broj kolona = MyTZ.Columns.Quantity(); Izvještaj (broj kolona);

Na ekranu će biti prikazan broj "3". Zaista, naša tabela ima tri kolone: ​​“Prezime”, “Ime”, “Patronim”

Dobivanje objekta stupca po njegovom broju (indeksu) i nabrajanje kolona pomoću indeksa stupca

Napravimo ciklus pretraživanja kroz sve kolone tablice vrijednosti koristeći indekse kolona (brojeve). Zapamtite da numerisanje kolona počinje od nule. Stoga moramo povećati brojač ciklusa “Sch” sa nule na broj jednak broju kolona minus jedan.

Za račun = 0 By MyTZ.Columns.Quantity() - 1 Cycle CurrentColumn = MyTZ.Columns[Act]; Izvještaj (Trenutna kolona.Naziv); EndCycle;

Na ekranu ćemo dobiti sljedeće

Puno ime

Mislim da je ovaj primjer bio jasan. Okrenuli smo se metodi Količina() kolekcije kolumni" MyTZ.Columns.Quantity()", dobio je broj kolona i započeo petlju sa brojačem od nula prije broj kolona minus jedan. Unutar petlje dobijamo svaku kolonu iz kolekcije kolona i dodeljujemo trenutni objekat kolone promenljivoj CurrentColumn Zatim, varijabla CurrentColumn pristupamo nekretnini Ime i prikažite vrijednost ovog svojstva na ekranu: Izvještaj (Trenutna kolona.Naziv);

Važno je nikada ne brkati svojstvo objekta i metodu objekta.

Svojstvo je određena statička vrijednost i pristup joj se piše bez zagrada, na primjer CurrentColumn.Name. Metoda je u suštini procedura ili funkcija objekta, a pozivi procedurama i funkcijama se uvijek pišu sa zagradama (čak i ako nema ulaznih parametara). Na primjer: MyTZ.Columns.Quantity()

Ako pristupimo metodi i zaboravimo napisati zagrade, 1C tumač će nam dati poruku o grešci i neće pokrenuti kod. Pošto će tumač smatrati da mi ne pristupamo metodi, već svojstvu - jer nema zagrada. Ali neće moći pronaći svojstva s tim imenom (jer postoji samo metoda s tim imenom) - što će biti navedeno u poruci o grešci.

Ovo će tumač napisati ako zaboravim da stavim zagrade u poziv metode na tako netačan način MyTZ.Columns.Quantity(bez zagrada iza "Quantity()"):

Polje objekta nije pronađeno (Količina)

U ovom slučaju, „polje“ i „svojstvo“ treba shvatiti kao sinonime ili netačnost u terminologiji 1C programera. Oni koriste obje ove riječi da upućuju na isti koncept. Iako u drugim programskim jezicima ovi termini mogu značiti različite stvari.

Dobijanje podataka iz tablice 1C vrijednosti pomoću brojeva kolona

Za početak, nudim vam jednostavan primjer dobivanja podataka iz prvog reda naše tabele. Imajte na umu da koristimo unaprijed popunjenu tabelu s početka članka. Sigurno znamo da tabela ima prvi red i barem jednu kolonu. Ako ovaj primjer primijenimo na praznu tablicu, pojavit će se greška. dakle:

Prva linija = MyTK; // dobijamo prvi red (numerisan od nule) FirstColumnValue = FirstRow; // dobijemo vrijednost prve kolone (numeracija kolona je također od nule) Report(Value of the FirstColumn); // prikazuje vrijednost prve kolone u prvom redu tablice

Na ekranu će se prikazati:

Chapaev

Prvo smo dobili objekt reda tablice vrijednosti pristupanjem tablici vrijednosti pomoću [...] operatora. (ako ste zaboravili kako to učiniti, možete pogledati prethodne članke) Proslijedili smo argument “0” unutar operatora. Ovo je indeks prvog reda tablice vrijednosti. Prva linija = MyTK;

Nadalje, također imamo pravo pristupa string objektu koristeći [...] operator. Unutar ovog operatora proslijedili smo broj kolone tablice vrijednosti, u ovom slučaju također “0”. I tako smo dobili vrijednost kolone pod brojem "0" za trenutni red tabele pod brojem "0". Ovu vrijednost smo prikazali na ekranu i ona predstavlja string “Chapaev”.

Zakomplikujmo malo naš primjer:

Prva linija = MyTK; // dobijamo prvi red (numeriran od nule) Report(FirstLine); // prikazuje vrijednost prve kolone u prvom redu tabele Report(FirstRow); // prikazuje vrijednost druge kolone u prvom redu tabele Report(FirstRow); // prikazuje vrijednost treće kolone u prvom redu tabele

Sada smo prikazali vrijednosti iz sve tri kolone prvog reda naše tablice vrijednosti:

Čapajev Vasilij Ivanovič

Sada ću također modificirati ovaj primjer tako da možemo bez varijable "Prva linija"

Izvještaj (MyTZ); // prikazuje vrijednost prve kolone u prvom redu tabele Report(MyTZ); // prikazuje vrijednost druge kolone u prvom redu tabele Report(MyTZ); // prikazuje vrijednost treće kolone u prvom redu tabele

Isto će biti i na ekranu

Čapajev Vasilij Ivanovič

U gornjem primjeru smo vidjeli da za pristup vrijednosti koja se nalazi u određenom redu i određenoj koloni tablice vrijednosti, možemo koristiti sekvencijalni poziv dva operatora [...] u ovom obliku: Tabela vrijednosti[Indeks reda][Indeks kolone]

Dakle, spremni smo da kreiramo petlju i dobijemo podatke o svim redovima i svim kolonama koristeći indekse reda i stupaca:

Za RowCounter = 0 By MyTZ.Quantity() - 1 Loop // kruži kroz redove Za ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugniježđena petlja kroz kolone // dobije vrijednost ćelije (iz trenutnog reda i trenutne kolone) CellValue = MyTK[RowCounter][ColumnCounter]; // prikazuje broj reda, broj kolone i vrijednost ćelije. Report("Row No" + Row Count + "Column No" + Column Count + " = " + CellValue); EndCycle; EndCycle;

Na ekranu će biti prikazano sljedeće:

Linija br. 0 kolona br. 0 = Chapaev Linija br. 0 kolona br. 1 = Vasilij Linija br. 0 kolona 2 = Ivanovič Linija br. 1 kolona br. 0 = Dzeržinski Linija br. 1 kolona br. 1 = Feliks Linija br. 1 kolona br. 2 = Edmundović Linija br. 2 kolona br. 0 = Kotovski Linija br. 2 kolona br. 1 = Grigorij Linija br. 2 kolona br. 2 = Ivanovič

Koristeći dva ciklusa, od kojih je jedan ugniježđen u drugi, prikazali smo vrijednosti svih stupaca iz svih redova 1C tablice vrijednosti. U ovom slučaju nismo koristili nazive stupaca, već smo stupcima i redovima pristupali po njihovim indeksima. Za više razumijevanja, obratite pažnju na komentare unutar primjera.

U zaključku, predlažem da malo promijenimo naš primjer tako da umjesto brojeva kolona, ​​na ekranu prikazuje njihova imena. I pored toga, napravit ću prezentabilniji dizajn za prikazivanje sadržaja na ekranu.

Za LineCounter = 0 By MyTZ.Quantity() - 1 Loop // petlja kroz redove Report(" ======= Br. reda " + LineCounter + " ======="); Prijaviti(" "); // feed (umetanje praznog reda) Za ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugniježđena petlja kroz stupce // dobijemo vrijednost ćelije (iz trenutnog retka i tekuće kolone) CellValue = MyTZ [RowCounter][ ColumnCounter]; // dobijemo ime kolone ColumnName = MyTZ.Columns[ColumnCounter].Name; // prikazuje naziv stupca i vrijednost ćelije Report(ColumnName + ": " + CellValue); EndCycle; Prijaviti(" "); // prijelaz na red (umetanje praznog reda) EndCycle;

Sada su na našem ekranu informacije počele izgledati reprezentativnije:

Linija br. 0 ======= Prezime: Čapajev Ime: Vasilij Patronim: Ivanovič ======= Linija br. 1 ======= Prezime: Dzeržinski Ime: Feliks Patronim: Edmundovič ===== == Linija br. 2 ======= Prezime: Kotovski Ime: Grigorij Patronim: Ivanovič

Da, skoro sam zaboravio. Kada koristimo dva [...][...] operatora u redu, možemo proslijediti ime ove kolone umjesto indeksa stupca: Tabela vrijednosti[Indeks reda][Naziv kolone]

Za LineCounter = 0 By MyTZ.Quantity() - 1 Loop // petlja kroz redove Report(" ======= Br. reda " + LineCounter + " ======="); Prijaviti(" "); // feed (umetanje prazne linije) Za ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugniježđena petlja kroz kolone ColumnName = MyTZ.Columns[ColumnCounter].Name; // dobijemo kolonu nameCell Value = MyTZ[RowCounter][ColumnName]; //

Obratite pažnju na liniju označenu strelicom ". U ovom redu, umjesto indeksa tekuće kolone, argumentu u uglastim zagradama prosljeđujemo naziv tekuće kolone [...] Rezultat će biti isti.

A sada, zadnja stvar u ovom članku.

ISPRAVNO dobivanje svih podataka iz tablice 1C vrijednosti koristeći petlje kroz kolekciju redaka i kolekciju stupaca

Za svaki CurrentLine From MyTZ Loop // petlja kroz kolekciju stringova Report(" ======= Line No. " + MyTZ.Index(CurrentLine) + " ======="); Prijaviti(" "); Za svaki CurrentColumn From MyTZ.Columns Loop // ugniježđena petlja iteracija kroz kolekciju kolona ColumnName = CurrentColumn.Name; // dobijemo kolonu nameCellValue = CurrentRow[ColumnName]; // dobijemo vrijednost ćelije PO stupcu NAME Report(Ime kolone + ": " + CellValue); // prikazuje naziv kolone i vrijednost ćelije End of Cycle; Prijaviti(" "); EndCycle;

U primjeru su korištene dvije petlje. Petlja za petlju kroz kolekciju kolona je ugniježđena unutar petlje za petlju kroz redove. Ako ste radili kroz gornje primjere i pročitali prethodne članke, onda nećete imati poteškoća s razumijevanjem kako ovaj primjer funkcionira.

Konačno, smanjit ću broj redova koda u našem posljednjem primjeru koliko god je to moguće eliminacijom upotrebe srednjih varijabli. Dobićemo uzorak "industrijskog koda" koji se koristi u stvarnim problemima.

Ovo bi trebalo da se radi samo kada dobro razumete šta radite. Ako je kod vrlo složen, onda je prihvatljivo ostaviti međuvarijable kako biste kasnije lakše razumjeli vlastiti kod. Također, svaki kod mora biti barem minimalno komentiran, kako bi nakon nekog vremena bilo lakše razumjeti tekstove programa.

Za svaku trenutnu liniju iz MyTZ ciklusa // iteracija po redovima Report(" ======= Br. reda " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); Za svaki CurrentColumn iz MyTZ.Columns petlje // iteracija po stupcima Report(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); EndCycle; Prijaviti(" "); EndCycle;

Izlaz na ekranu se nije promijenio, ostaje isti kao u prethodnom primjeru:

KURS OD 2 SEDMICE

"PROGRAMIRANJE U 1C ZA POČETNIKE"

Kurs će biti poslat e-poštom. Postanite programer ispunjavanjem zadataka korak po korak.

Za učešće su vam potrebni samo računar i internet

Besplatan pristup kursu:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; padding: 5px; širina: 270px; max-width: 100%; border-radius: 0px; -moz-border -radius: 0px-webkit-border-radius: font-family: "Helvetica Neue", sans-serif: ne-repeat-size: auto;) .sp-form input; neprozirnost: 1; vidljivost: vidljiva;).sp-form .sp-form-fields-wrapper ( margina: 0 auto; širina: 260px;).sp-form .sp -form-control (pozadina: #ffffff; border-). color: #cccccc: font-size: 8,75px; 4px; -webkit-border-radius: 4px; širina: 100%;).sp-form .sp-field label (boja: #444444; font- size: 13px; font-style: normal; font-weight: bold; .sp-form .sp-button ( border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; boja pozadine: #f4394c; boja: #ffffff; širina: 100% ; font-style: normalan; porodica fontova: Arial, "Helvetica Neue", sans-serif; box-shadow: nema; -moz-box-shadow: nema; -webkit-box-shadow: nema; pozadina: linear-gradient(to top, #e30d22 , #f77380);).sp-form .sp-button-container (text-align: center; width: auto;)

Evo male činjenice za početak - jednostavni primjeri rada s tablicom vrijednosti:

1. Kreirajte tablicu vrijednosti

ValueTable = Nova tablica vrijednosti;


2. Kreirajte stupce za tablicu vrijednosti:

ValueTable.Columns.Add("Name");
Vrijednost Table.Columns.Add("Prezime");


3. Dodajte nove redove koristeći nazive kolona:


NewLine.Name = "Vasily";
NewLine.LastName = "Pupkin";


4. Kako potražiti vrijednost u tabeli vrijednosti:
Potrebno je pronaći red tabele koji sadrži željenu vrijednost.

FoundRow = ValueTable. Find(SearchValue);


5. Pronađite prvo pojavljivanje u određenim stupcima tablice vrijednosti

FoundRow = ValueTable.Find(SearchValue, "Dobavljač, Kupac");


6. Ako trebate pronaći sva pojavljivanja u tabeli vrijednosti:
Koristimo strukturu pretraživanja.

SearchStructure = Struktura("Zaposleni", SearchValue);
Niz pronađenih redova = ValueTable.FindRows(Struktura pretraživanja);


Kreirajmo strukturu pretraživanja čiji će svaki element sadržavati naziv kolone kao ključ i željenu vrijednost u ovoj koloni kao vrijednost. Prosljeđujemo strukturu pretraživanja kao parametar metodi FindLines(). Kao rezultat, dobijamo redove tabele.
Ako strukturi pretraživanja dodate pretragu za željenom vrijednošću, na primjer, također u stupcu Odgovorni, tada ćemo kao rezultat primjene metode FindLines() dobiti sve redove u kojima su i Zaposleni i Odgovorni jednaki tražena vrijednost.

7. Kako iterirati kroz tabelu vrijednosti slučajnim redoslijedom

Za svaki trenutni red iz petlje tabele vrijednosti
Izvještaj(Trenutni red.Naziv);
EndCycle;

Ista stvar koristeći indekse:

SeniorIndex = ValueTable.Quantity() - 1;
Za račun = 0 do ciklusa SeniorIndex
Izvještaj(Vrijednosti tabele[račun].Naziv);
EndCycle;


8. Brisanje postojećeg reda tablice vrijednosti

ValueTable.Delete(Red za brisanje);

po indeksu

ValueTable.Delete(0);


9. Brisanje postojeće kolone tablice vrijednosti

ValueTable.Columns.Delete(ColumnToDelete);


po indeksu

ValueTable.Columns.Delete(0);

Potrebno je uzeti u obzir da će brisanje reda (ili stupca) "iz sredine" tablice vrijednosti dovesti do smanjenja indeksa redova koji se nalaze "nakon" obrisanog za jedan.

10. Kako popuniti tabelu vrijednosti ako su nazivi kolona sadržani u varijablama?

NewRow = ValueTable.Add();
NewRow[Ime kolone] = Vrijednost;


11. Kako popuniti cijelu kolonu tablice vrijednosti željenom vrijednošću?
Kolona Fiskalna računovodstvena zastavica u tabeli vrijednosti tabele vrijednosti mora biti popunjena vrijednošću False

Tabela vrijednosti Popunite vrijednosti (Netačno, "Zastava fiskalnog računovodstva");


Koristimo metodu FillValues() za tablicu vrijednosti. Prvi parametar je vrijednost koju treba popuniti. Drugi parametar je naziv kolone koju treba popuniti.

12. Kako mogu popuniti tablicu vrijednosti “Tabela primatelja” podacima iz tablice vrijednosti “SourceTable”?

Ako tablica primatelja još ne postoji u vrijeme operacije ili njene prethodne kolone ne moraju biti spremljene, možete je kreirati kao potpunu kopiju originala

Tablica primatelja = Izvorna tablica.Kopiraj();


Druga opcija: tablica ReceiverTable postoji i bilo bi šteta izgubiti svoje stupce i ograničenja na tipove podataka kolona. Ali morate popuniti podatke za stupce čija se imena podudaraju s imenima izvorne tablice.

Djelomični prijenos podataka za stupce s podudarnim nazivima:

Za svaki red izvorne tabele iz ciklusa izvorne tabele
FillPropertyValues(NewRow, SourceTableRow);
Kraj ciklusa


Za svaki red izvorne tabele, novi red se dodaje u prijemnu tabelu i vrednosti se popunjavaju u onim kolonama nove tabele čiji nazivi odgovaraju nazivima kolona u izvornoj tabeli

Ako tabele nemaju kolone sa istim imenima, odredišna tabela će na kraju sadržati onoliko redova sa nul vrednostima koliko je bilo redova u izvornoj tabeli.
Ako za neke kolone istog imena tip vrijednosti podataka iz izvorne tablice ne spada u niz dozvoljenih tipova kolona u odredišnoj tablici, dobićemo prazne vrijednosti u takvim poljima.
Hajde da razmotrimo treći slučaj. U slučaju kolona istog imena, stupac odredišne ​​tablice mora biti u potpunosti usklađen sa stupcem izvorne tablice.

Potpuno kopiranje podataka za stupce s podudarnim imenima

Iste kolone = Novi niz();

Za svaku kolonu iz ciklusa SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Ako se podudara sa kolonom<>Nedefinirano Onda

// Dobivamo svojstva stupca.
Ime = Column.Name;
ValueType = Column.ValueType;
Zaglavlje = Column.Header;
Širina = Column.Width;

// Zamijenite stupce u odredišnoj tablici.
Indeks = TableReceiver.Columns.Index(MatchingColumn);

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

// Dodajte sljedeće ime odgovarajućih stupaca u niz.
Iste kolone.Dodaj(Ime kolone);

endIf;

EndCycle;

// Kruži kroz redove izvorne tabele.
Za svaki red izvorne tabele iz ciklusa izvorne tabele

// Dodaj novi red u odredišnu tabelu.
NewRow = TableReceiver.Add();

// Popunite vrijednosti u odgovarajućim ćelijama.
Za svaki naziv kolone Iz kolone istog imena Ciklus
NoviRow[Ime kolone] = IzvornaTabelaRow[Ime kolone];

EndCycle;

EndCycle;


Morat ćemo zamijeniti kolonu u odredišnoj tablici novom, čija će svojstva u potpunosti odgovarati koloni izvorne tablice.
Stoga, ako se kolona istog imena pronađe u tabeli primatelja, prikupljamo sva svojstva za novu kolonu u varijablama. Zatim izbrišite staru i kreirajte novu kolonu. Zatim prolazimo kroz redove izvorne tabele.
U petlji dodajemo novi red u prijemnu tabelu i otvaramo petlju preko naziva kolona u nizu odgovarajućih kolona.
Unutar ove ugniježđene petlje popunjavamo ćelije odredišne ​​tablice podacima ćelije izvorne tablice.

13. Kako dodati kolone u tablicu vrijednosti “ValueTable” sa ograničenjima tipa?

Kada dodajete kolonu, možete jednostavno odrediti njeno ime i ostaviti drugi parametar metode Add() netaknutim. U ovom slučaju, tip podataka stupca je proizvoljan.

Dodavanje stupca bez navođenja tipa podataka

// Dodaj kolonu bez ograničenja tipa.
ValueTable.Columns.Add("Objekat");


Možete popuniti vrijednost drugog parametra. Tamo treba da prosledite opis tipa dozvoljenog za kolonu. Sam opis se može dobiti pomoću konstruktora, prenoseći mu kao parametar ime niza tipa (ako postoji mnogo tipova, odvojenih zarezima) ili niz važećih tipova.

Dodavanje kolone koja označava tip podataka

// Ograničenja na tipove podataka stupaca:
// Samo elementi direktorija "Counterparties".
Tabela vrijednosti.Kolone.Dodaj("Račun", Novi opis tipova("DirectoryLink.Accounts"));


Ako među tipovima dozvoljenim za popunjavanje podataka kolone postoji niz, možete ograničiti njegovu bitnu dubinu (dužinu), odrediti upotrebu promjenljive ili fiksne dužine. Sve se to postiže kreiranjem objekta pomoću konstruktora kvalifikatora niza. Zatim će se ovaj objekt koristiti kao jedan od parametara konstruktora TypeDescription.

Korištenje kvalifikatora za specificiranje tipa podataka stupca tablice vrijednosti

// Pripremiti i postaviti ograničenja za podatke tipa String.
Kvalifikatori niza = Novi kvalifikatori niza(20, dozvoljena dužina.Varijabla);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Slične radnje se mogu izvesti u odnosu na kvalifikatore broja i datuma.
Imajte na umu: opise tipova konstruktor može izraditi „od nule“ ili se kao osnova može koristiti postojeći opis tipa.

Korištenje postojećih deklaracija tipa za specificiranje tipa podataka stupca tablice vrijednosti

// Proširenje prethodno korištenog opisa tipa.
Brojevi kvalifikatora = Novi brojevi kvalifikatora(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(Važni tipovi, "Broj, Datum", Kvalifikatori broja, Kvalifikatori datuma);

ValueTable.Columns.Add("Note", ExtendedAcceptableTypes);

Pozdrav svim čitaocima infostarta. Ovaj članak će biti posvećen pitanju kreiranja proizvoljne tablice vrijednosti na obliku upravljane aplikacije programski.

Karakteristike zadatka.

Svako ko je programirao u redovnoj aplikaciji često je bio suočen sa zadatkom dobijanja proizvoljne tabele vrednosti na obrascu. Proizvoljna tablica vrijednosti je tabela čiji broj i vrsta kolona nisu unaprijed poznati. Odnosno, mogu biti 3 kolone, ili možda 6, ili možda 8. U normalnoj aplikaciji, sve je jednostavno: možete postaviti element „Tabela vrijednosti“ na obrazac za obradu, a zatim prenijeti kreiranu tablicu vrijednosti ​na ovaj element programski. Zatim jednostavnom komandom:

Elementi obrasca.TableField.CreateColumns();

dobiti gotovu tablicu vrijednosti na obrascu. Čini se da bi moglo biti jednostavnije.

Sve je to bilo u redovnoj aplikaciji. U upravljanoj aplikaciji, sve se promijenilo. Nije tako lako napraviti proizvoljnu tabelu. Sada trebate ili strogo parametrizirati tablicu vrijednosti na obrascu, ili je kreirati programski (opišite, pa, ovo je, zapravo, suština same upravljane aplikacije). To je ono što ćemo pokušati učiniti: programski kreirati proizvoljnu tablicu vrijednosti na kontroliranom obrascu.

Rješenje problema.

Prva stvar koju treba da uradimo je da odredimo kako će tabela izgledati na obrascu. Glavna stvar je da ne morate kreirati nijedan element forme u obradi. Kreiraćemo ga programski, kao i celu tabelu. Odnosno, tabela će biti opisana i kreirana u trenutku otvaranja obrasca ili pomoću dugmeta - ovisno o tome kome je potrebna.

Kreiranje tabele na obrascu se dešava kroz opis tabele vrednosti kao atributa:
SelectionTypeArray = Novi niz; Niz SelectionType.Add(Type("Tabela vrijednosti")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Niz detalja = Novi niz; Niz atributa.Dodaj(Novi atributi obrasca("Tabela rasporeda", Opis vrste odabira, "", "TZN")); Sada moramo kreirati tablicu vrijednosti programa koja sadrži podatke. Ako se tabela vrijednosti dobije iz upita, onda je sve manje-više u redu. Ako se tabela kreira ručno, onda se značenje kolona koje će sadržavati brojeve ili datume može kreirati kroz “Opis tipova”. Poenta je da kolone u tabeli vrijednosti moraju imati neki tip. Ako se, na primjer, očekuje da će korisnik popuniti podatke u ovim stupcima interaktivno, onda ne možete dodati stupac tablice vrijednosti jednostavno sa imenom; Imajte na umu - ovo je veoma važno jer... Ove vrste ćemo prenijeti u tabelu na obrascu.
Kreiramo tabelu koja sadrži nekoliko kolona:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Novi niz; ArrayCD.Add(Type("Datum")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = Nova tablica vrijednosti;
TK.Columns.Add("With", DescriptionTypesTime);
TK.Columns.Add("Prije", DescriptionTypesTime);
TK.Columns.Add("Naziv");
TK.Columns.Add("Note"); // Puno ime i Napomena - redovi Zatim ćemo popuniti našu TK programsku tabelu potrebnim podacima. Dobijamo TK tablicu koja sadrži potrebne vrijednosti i spremna je za prijenos u kreirani atribut obrasca. Za svaku kolonu iz ciklusa kolona

Niz atributa.Dodaj(Novi atributi obrasca(Ime kolone,Tip vrijednosti stupca,"Tabela rasporeda"));
EndCycle;
ChangeDetails(Detalji niza);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

Ovo je jednostavna kombinacija i naš sto je spreman.

Za svaku kolonu iz ciklusa kolona

NewElement = Elements.Add(Ime kolone, Tip("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "Tabela rasporeda." + Column.Name;
NewElement.Width = 10;
EndCycle;

Uslovni dizajn, ako nam treba, pišemo i ručno, komandni meni - ručno. Rukovaoci tablicama se takođe pišu rukom. Na primjer, da dodate rukovao događajima za tabelu “Izbor”:

Tablica SelectionFields.SetAction("Izbor","TZNSelection");

Za obradu ovog događaja propisana je posebna procedura u obliku procedure:

&OnClient
Procedura TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//naredbe rukovatelja EndProcedure

Imajte na umu da se rukovaoci tablicama aktiviraju na klijentu i stoga moraju imati naredbu pokazivača kompajlera

&OnClient

Pa, posljednja stvar koju sam htio dodati je da nakon svih ovih koraka, ne zaboravite proslijediti gotovu tablicu atributu forme:

ValueVFormAttributes(ToR, "ScheduleTable");

Ovo je ono što imamo kao rezultat:


A evo rukovanja događajem "Izbor":



Pogovor.

Nadam se da će članak pomoći onim 1C programerima koji počinju programski kreirati tabele na obrascu.

Možete preuzeti obradu koja programski kreira tablicu vrijednosti i prikazuje je na obrascu kojim se može upravljati s komentarima koji će vam pomoći da kreirate vlastite tablice.

Postoje dvije posebne metode za pretraživanje tablice vrijednosti:

1. Pronađite

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//također možemo odrediti u kojim stupcima tražiti da bismo ubrzali pretragu
FoundString = TZNomenclature.Find(TVHorizon, "Nomenklatura");

Ova metoda vraća prvi pronađeni red sa željenom vrijednošću ili Undefined ako ga ne pronađe. Stoga ga je zgodno koristiti za traženje jedinstvenih vrijednosti, jer u suprotnom, kada se pronađe vrijednost, morat ćete je ukloniti iz tabele da biste pronašli sljedeću.

Da biste izbjegli ovu gnjavažu, postoji sljedeća metoda koja vam omogućava da pronađete niz podudarnih nizova:

2. FindStrings


Struktura odabira.Insert("Nomenklatura", TVHorizon); // prvo naznači kolonu gdje treba tražiti, a zatim šta tražiti.

Ovaj metod uvijek vraća niz, ali može biti prazan ako ništa nije pronađeno. I ova metoda, kao i prethodna, vraća redove tablice vrijednosti same, a ne same vrijednosti u zasebnom nizu. Stoga, promjenom vrijednosti u nizu niza ili, kao u prethodnoj metodi, za pronađeni niz, promijenit ćete vrijednost u obrađenoj tablici vrijednosti.

Još jedna dobra stvar u vezi ove metode je da može pretraživati ​​kroz nekoliko stupaca tablice vrijednosti odjednom:


SelectionStructure = Nova struktura;
Struktura odabira.Insert("Nomenklatura", TVHorizon);
Struktura odabira.Insert("Količina", 10);
FoundArray of Rows = TZNomenclature.FindLines(SelectionStructure);

Jedina negativna, kao što vidite, je da ne možete koristiti druge vrste poređenja osim "jednako"

Za obračun novca i robe u poslovanju se široko koriste razne tablice. Skoro svaki dokument je tabela.

U jednoj tabeli je navedena roba koja se otprema iz skladišta. Druga tabela prikazuje obaveze plaćanja ove robe.

Stoga u 1C rad sa tablicama zauzima istaknuto mjesto.

Tabele u 1C nazivaju se i „tabelarni dijelovi“. Imenici, dokumenti i ostalo ih imaju.

Upit, kada se izvrši, vraća tablicu kojoj se može pristupiti na dva različita načina.

Prvi - brži - odabir, dobivanje redova iz njega moguće je samo redom. Drugi je učitavanje rezultata upita u tablicu vrijednosti i zatim nasumični pristup njoj.

//Opcija 1 – sekvencijalni pristup rezultatima upita

//uzmite sto
Odaberite = Query.Run().Select();
// prolazimo redom kroz sve redove rezultata upita
Dok Select.Next() petlja
Izvještaj(Izbor.Naziv);
EndCycle;

//Opcija 2 – učitavanje u tablicu vrijednosti
Zahtjev = Novi Zahtjev("IZABERI Ime IZ Direktorija.Nomenklature");
//uzmite sto
Tabela = Query.Run().Unload().
// nadalje možemo preći sve linije
Za svaki red iz ciklusa tabele
Izvještaj(String.Name);
EndCycle;
//ili proizvoljno pristupiti nizovima
Red = Table.Find("Lopata", "Ime");

Važna karakteristika je da će u tabeli koja se dobija iz rezultata upita sve kolone biti striktno otkucane. To znači da ćete zahtjevom za polje Ime iz imenika Nomenklature dobiti stupac tipa String s dozvoljenom dužinom od najviše N znakova.

Tabela na obrascu (debeli klijent)

Korisnik radi sa tabelom kada je postavljena na obrazac.

O osnovnim principima rada sa formama razgovarali smo u lekciji i u lekciji dalje

Dakle, stavimo tabelu na obrazac. Da biste to uradili, možete prevući tabelu sa panela Kontrole. Slično, možete odabrati Form/Insert Control iz menija.

Podaci se mogu pohraniti u konfiguraciju - tada je potrebno odabrati postojeći (prethodno dodan) tabelarni dio konfiguracijskog objekta čiji obrazac uređujete.

Kliknite na dugme "..." u svojstvu Podaci. Da biste vidjeli listu tabelarnih dijelova, potrebno je proširiti granu Objekt.

Kada odaberete tabelarni dio, 1C će sam dodati kolone u tablicu na obrascu. Redovi koje korisnik unese u takvu tabelu biće automatski sačuvani zajedno sa referentnom knjigom/dokumentom.

U istom svojstvu podataka možete unijeti proizvoljno ime i odabrati tip tablice vrijednosti.

To znači da je odabrana proizvoljna tablica vrijednosti. Neće automatski dodavati kolone, niti će se automatski čuvati, ali s njim možete raditi šta god želite.

Desnim klikom na tabelu možete dodati kolonu. U svojstvima kolone možete odrediti njen naziv (za referencu u 1C kodu), naslov stupca na obrascu, vezu s atributom tabelarnog dijela (potonji - ako nije odabrana proizvoljna tabela, već tabelarni deo).

U svojstvima tabele na obrascu možete odrediti da li korisnik može dodavati/brisati redove. Napredniji obrazac je okvir za potvrdu Samo prikaz. Ova svojstva su zgodna za korištenje za organiziranje tabela namijenjenih za prikaz informacija, ali ne i za uređivanje.

Da biste upravljali tabelom, morate prikazati komandni panel na obrascu. Odaberite stavku menija Form/Insert Control/Command Bar.

U svojstvima komandne trake potvrdite izbor u polju za potvrdu Automatsko popunjavanje tako da se dugmad na panelu automatski pojavljuju.

Tabela na obrascu (tanki/upravljani klijent)

Na upravljanom obrascu ove akcije izgledaju malo drugačije. Ako trebate postaviti tabelarni dio na obrazac, proširite granu Objekt i povucite jedan od tabelarnih dijelova ulijevo. To je sve!

Ako trebate postaviti tablicu vrijednosti, dodajte novi atribut obrasca i u njegovim svojstvima navedite tip – tablicu vrijednosti.

Da biste dodali kolone, koristite meni desnim klikom na ovaj atribut obrasca, odaberite Dodaj kolonu atributa.

Zatim povucite tabelu ulijevo.

Da bi tabela imala komandnu traku, u svojstvima tabele izaberite vrednosti u odeljku Upotreba – Položaj komandne trake.

Učitavanje tabele u Excel

Bilo koja 1C tabela koja se nalazi na obrascu može se ispisati ili prenijeti u Excel.

Da biste to uradili, kliknite desnim tasterom miša na prazan prostor u tabeli i izaberite Lista.

U upravljanom (tankom) klijentu, slične radnje se mogu izvesti pomoću stavke menija Sve akcije/Prikaži listu.


Zatvori