1s 8.3 struktura u tablicu vrijednosti

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, dobijanje 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 iterirati kroz sve redove
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 stupce 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 kolone 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 forme 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 tabela 1C 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.

Pozdrav svim čitaocima infostarta. Ovaj će članak 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 da dobije proizvoljnu tablicu vrijednosti 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 može 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.

Prvo što 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 programsku tablicu vrijednosti koja sadrži podatke. Ako se tablica 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 interaktivno popunjavati podatke u ovim stupcima, onda ne možete dodati stupac tablice vrijednosti samo imenom; ona mora imati tip. 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 našu TK programsku tablicu popuniti potrebnim podacima. Dobijamo TK tablicu koja sadrži potrebne vrijednosti i spremna je za prijenos u kreirani atribut obrasca. Za svaku kolonu iz TK Ciklus 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 TK Ciklus 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 postupka:

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

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(Structure pretrage);


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(ColumnDeleted);


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, "Zastavica 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.Copy();


Druga opcija: tablica ReceiverTable postoji i bilo bi šteta izgubiti svoje stupce i ograničenja na tipove podataka stupaca. 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 odredišne ​​tablice, dobićemo prazne vrijednosti u takvim poljima.
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 kolona u niz.
Iste kolone.Dodaj(Ime kolone);

endIf;

EndCycle;

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

// Dodajte 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 specificiranja 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 je među tipovima dozvoljenim za popunjavanje podataka kolone niz, možete ograničiti njegovu bitnu dubinu (dužinu), navesti 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.Variable);
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 izgraditi „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);
Prošireni ValidTypes = New TypeDescription(Valjani tipovi, "Broj, Datum", Kvalifikatori broja, Kvalifikatori datuma);

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

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 kolonama treba pretraživati ​​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"