1c izberite vrstice tabele vrednosti po pogoju. Pomembno je, da nikoli ne zamenjujete lastnosti objekta in metode objekta

Za obračunavanje denarja in blaga se v poslovanju pogosto uporabljajo različne tabele. Skoraj vsak dokument je tabela.

Ena tabela navaja blago, ki bo odpremljeno iz skladišča. Druga tabela prikazuje obveznosti plačila tega blaga.

Zato v 1C delo s tabelami zavzema vidno mesto.

Tabele v 1C se imenujejo tudi "tabelarni deli". Imajo jih imeniki, dokumenti in drugo.

Ko se poizvedba izvede, vrne tabelo, do katere lahko dostopate na dva različna načina.

Prvi - hitrejši - izbor, pridobivanje vrstic iz njega je možno le po vrstnem redu. Drugi je nalaganje rezultata poizvedbe v tabelo vrednosti in nato naključni dostop do nje.

//Možnost 1 – zaporedni dostop do rezultatov poizvedbe

//dobi tabelo
Izberite = Query.Run().Select();
// pregledamo vse vrstice rezultata poizvedbe po vrstnem redu
Medtem ko Select.Next() Loop
Poročilo (Ime izbora);
EndCycle;

//Možnost 2 – nalaganje v tabelo vrednosti
Zahteva = Nova zahteva ("IZBERI ime IZ Imenika. Nomenklatura");
//dobi tabelo
Tabela = Query.Run().Unload().
//naprej lahko tudi ponavljamo skozi vse vrstice
Za vsako vrstico iz cikla tabele
Poročilo(String.Name);
EndCycle;
//ali poljubno dostopati do nizov
Vrstica = Table.Find("Lopata", "Ime");

Pomembna značilnost je, da bodo v tabeli, ki jo dobimo iz rezultata poizvedbe, vsi stolpci strogo tipizirani. To pomeni, da boste z zahtevo po polju Ime iz imenika Nomenklatura prejeli stolpec tipa Niz z dovoljeno dolžino največ N znakov.

Tabela na obrazcu (debela stranka)

Uporabnik dela s tabelo, ko je postavljena na obrazec.

O osnovnih načelih dela z obrazci smo razpravljali v učni uri in v učni uri

Torej, postavimo tabelo na obrazec. Če želite to narediti, lahko povlečete tabelo iz nadzorne plošče. Podobno lahko v meniju izberete Nadzor obrazca/vstavi.

Podatke lahko shranite v konfiguracijo - takrat morate izbrati obstoječi (prej dodan) tabelarični del konfiguracijskega objekta, katerega obrazec urejate.

Kliknite gumb "..." v lastnosti Podatki. Za ogled seznama tabelarnih delov, morate razširiti vejo Objekt.

Ko izberete tabelarični del, bo 1C sam dodal stolpce v tabelo na obrazcu. Vrstice, ki jih uporabnik vnese v tako tabelo, se samodejno shranijo skupaj z referenčno knjigo/dokumentom.

V isto lastnost Podatki lahko vnesete poljubno ime in izberete vrsto Tabela vrednosti.

To pomeni, da je bila izbrana poljubna tabela vrednosti. Ne bo samodejno dodal stolpcev, niti se ne bo samodejno shranil, vendar lahko z njim počnete, kar želite.

Z desnim klikom na tabelo lahko dodate stolpec. V lastnostih stolpca lahko določite njegovo ime (za referenco v kodi 1C), naslov stolpca na obrazcu, povezavo z atributom tabelarnega dela (slednje - če ni izbrana poljubna tabela, ampak tabelarnega dela).

V lastnostih tabele na obrazcu lahko določite, ali lahko uporabnik dodaja/briše vrstice. Naprednejša oblika je potrditveno polje Samo ogled. Te lastnosti je priročno uporabljati za organiziranje tabel, namenjenih prikazovanju informacij, ne pa tudi urejanju.

Za upravljanje tabele morate na obrazcu prikazati ukazno ploščo. Izberite menijsko točko Obrazec/Vstavi kontrolnik/Ukazna vrstica.

V lastnostih ukazne vrstice izberite potrditveno polje Samodejno izpolnjevanje, da se gumbi na plošči prikažejo samodejno.

Tabela na obrazcu (lahki/upravljani odjemalec)

Na upravljanem obrazcu so ta dejanja videti nekoliko drugače. Če morate na obrazec postaviti tabelarični del, razširite vejo Objekt in enega od tabelaričnih delov povlecite v levo. To je vse!

Če želite postaviti tabelo vrednosti, dodajte nov atribut obrazca in v njegovih lastnostih določite vrsto – tabela vrednosti.

Če želite dodati stolpce, uporabite meni z desnim klikom na tem atributu obrazca in izberite Dodaj stolpec atributa.

Nato tudi povlecite tabelo v levo.

Da bo tabela imela ukazno vrstico, v lastnostih tabele izberite vrednosti v razdelku Uporaba – Položaj ukazne vrstice.

Nalaganje tabele v Excel

Vsako tabelo 1C, ki se nahaja na obrazcu, je mogoče natisniti ali naložiti v Excel.

Če želite to narediti, z desno miškino tipko kliknite prosti prostor v tabeli in izberite Seznam.

V upravljanem (lahkem) odjemalcu lahko podobna dejanja izvedete z menijsko postavko Vsa dejanja/Prikaži seznam.

Obstajata dve posebni metodi za iskanje po tabeli vrednosti:

1. Najdi

TVHorizon = Imeniki.Nomenklatura.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//lahko tudi določimo, v katerih stolpcih naj se išče, da pospešimo iskanje
FoundString = TZNomenclature.Find(TVHorizon, "Nomenklatura");

Ta metoda vrne prvo najdeno vrstico z želeno vrednostjo ali Nedefinirano, če je ne najde. Zato je priročno, da ga uporabite za iskanje edinstvenih vrednosti, ker v nasprotnem primeru, ko je vrednost najdena, jo boste morali odstraniti iz tabele, da bi našli naslednjo.

Da bi se izognili tem težavam, obstaja naslednja metoda, ki vam omogoča iskanje niza ujemajočih se nizov:

2. Iskanje nizov


Struktura izbora.Vstavi("Nomenklatura", TVHorizon); // najprej navedite stolpec, kje iskati, in nato, kaj iskati.

Ta metoda vedno vrne matriko, vendar je lahko prazna, če ne najde ničesar. In ta metoda, tako kot prejšnja, vrne same vrstice tabele vrednosti in ne samih vrednosti v ločenem nizu. Zato boste s spreminjanjem vrednosti v matričnem nizu ali, kot v prejšnji metodi, za najdeni niz spremenili vrednost v obdelani tabeli vrednosti.

Druga dobra stvar pri tej metodi je, da lahko išče po več stolpcih tabele vrednosti hkrati:


SelectionStructure = Nova struktura;
Struktura izbora.Vstavi("Nomenklatura", TVHorizon);
Struktura izbora.Vstavi("Količina", 10);
Najdeno polje vrstic = TZNomenclature.FindLines(SelectionStructure);

Edina slabost, kot lahko vidite, je, da ne morete uporabiti drugih vrst primerjave razen »enako«

Objavljeno 21. septembra 2011

Tabela vrednosti 1C – 3. del. Metapodatki. Skok skozi stolpce tabele vrednosti

V tem članku vam bom povedal, kako delati s tabelo vrednosti "neznane" strukture, kako iterirati po stolpcih tabele vrednosti, kako ekstrahirati podatke iz stolpcev in vrstic brez uporabe imen stolpcev. (Ta članek spada v serijo člankov 1C iz nič; programiranje 1C iz nič; tabela vrednosti 1C)

Za razlago snovi in ​​za izvajanje naših primerov programsko kodo"v živo", nekaj potrebujemo testna tabela vrednosti 1C. Nekateri naši primeri bodo izvlekli podatke iz tabele vrednosti, zato bomo naredili tabelo s tremi stolpci »Priimek«, »Ime«, »Srednje ime« in vanjo vnesli majhno količino podatkov - kar 3 vrstice :)

Torej, ustvarimo testno tabelo vrednosti 1C in jo izpolnimo:

MyTZ = Nova tabela vrednosti; // ustvarite novo tabelo vrednosti, shranjenih v spremenljivki "MyTZ" MyTZ.Columns.Add("Priimek"); // ustvari stolpec "Priimek" MyTZ.Columns.Add("Ime"); // ustvarite stolpec "Ime" MyTZ.Columns.Add("Patronymic"); // ustvarite stolpec "Srednje ime" // dodajte prvo vrstico v našo tabelo vrednosti NewLine = MyTZ.Add(); NewString.LastName = "Chapaev"; NewLine.Name = "Vasilij"; NewString.Middle name = "Ivanovich"; // dodamo drugo vrstico NewLine = MyTZ.Add(); NewString.LastName = "Dzerzhinsky"; NewRow.Name = "Felix"; NewString.Middle name = "Edmundovich"; // dodamo tretjo vrstico NewLine = MyTZ.Add(); NewLine.LastName = "Kotovsky"; NewLine.Name = "Gregory"; NewString.Middle name = "Ivanovich";

Naša testna tabela je sestavljena iz treh stolpcev: ime, priimek, patronim; in ima tri zapolnjene vrstice z imeni junakov državljanske vojne.

Prvi vzorec kode našteje stolpce tabele vrednosti 1C kot zbirko.

// prikaz imen vseh stolpcev TK za vsak stolpec iz MyTZ.Columns Cycle Report("Ime stolpca: " + Ime stolpca); EndCycle;

Naš cikel bo prikazal vsa imena stolpcev v oknu sporočila 1C:

Ime stolpca: Priimek Ime stolpca: Ime Ime stolpca: Srednje ime

Vidimo, da se za ponavljanje po stolpcih uporablja poseben cikel ponavljanja zbirke, podoben ciklu ponavljanja vrstic (v prejšnjem članku). MyTK.Stolpci- to je zbirka stolpcev tabele vrednosti 1C "Moj TZ". Zbirka vsebuje objekte tipa "Stolpec tabele vrednosti" Vsak objekt te vrste je stolpec tabele vrednosti in vsebuje lastnosti in metode. Z dostopom do teh lastnosti in metod pridobimo potrebne informacije o enem stolpcu ali izvedemo z njim kakšna druga dejanja.

Na primer dostop do nepremičnine "Ime" (Ime stolpca) dobimo ime trenutnega stolpca.

Rada bi vas opozorila na naslov serije: »Za vsakogar Stolpec Iz MyTZ.Column Cycle" Spremenljivka z imenom "Stolpec" ki smo ga izumili mi. Ni nujno, da uporabite isto ime. To spremenljivko lahko na primer imenujete kakor koli želite "Moj trenutni stolpec" Potem bi zgornji primer izgledal takole:

// prikaz imen vseh stolpcev TK za vsak MyCurrentColumn From MyTK.Columns Cycle Report("Ime stolpca: " + MyCurrentColumn.Name); EndCycle;

Ko izvajalni podsistem 1C naleti na cikel te vrste, z vsakim prehodom cikla dodeli spremenljivko z določeno ime en element iz naše zbirke, v tem primeru - en zbirni element stolpce tabele vrednosti MyTK.Stolpci Nato dostopamo do spremenljivke, ki vsebuje trenutni stolpec, in uporabimo lastnost "Ime".

Predlagam, da poleg imena stolpca prikažete številko vsakega stolpca v zbirki stolpcev:

// prikaži število in imena vseh stolpcev tabele vrednosti za vsak stolpec iz cikla MyTZ.Columns ColumnNumber = MyTZ.Columns.Index(Column); // pridobi številko stolpca ColumnName = Column.Name; // pridobi ime stolpca Report("Številka stolpca:" + Številka stolpca + " Ime stolpca: " + Ime stolpca); EndCycle;

V oknu s sporočilom 1C bo prikazano naslednje besedilo:

Številka stolpca:0 Ime stolpca: Priimek Številka stolpca:1 Ime stolpca: Ime Številka stolpca:2 Ime stolpca: Srednje ime

Upoštevajte, da so stolpci v tabeli vrednosti 1C oštevilčeni od nič, tako kot vrstice tabele vrednosti.

Število stolpcev v tabeli vrednosti 1C

Če želite izvedeti število stolpcev v tabeli vrednosti, uporabimo metodo "Count()" na zbirki stolpcev.

Število stolpcev = MyTZ.Columns.Quantity(); Poročilo (število stolpcev);

Na zaslonu se prikaže številka "3". Dejansko ima naša tabela tri stolpce: "Priimek", "Ime", "Patronim"

Pridobivanje predmeta stolpca po njegovi številki (indeks) in oštevilčenje stolpcev z uporabo indeksa stolpca

Naredimo cikel iskanja po vseh stolpcih tabele vrednosti z uporabo stolpčnih indeksov (številk). Ne pozabite, da se številčenje stolpcev začne od nič. Zato moramo povečati števec ciklov "Sch" z nič na število, ki je enako številu stolpcev minus ena.

Za račun = 0 po MyTZ.Columns.Quantity() - 1 cikel CurrentColumn = MyTZ.Columns[Act]; Poročilo(TrenutniColumn.Name); EndCycle;

Na zaslonu bomo dobili naslednje

Polno ime

Mislim, da je bil ta primer jasen. Obrnili smo se na metodo Količina() zbirke stolpcev" MyTZ.Columns.Quantity()", dobil število stolpcev in začel zanko s števcem iz nič prej število stolpcev minus ena. Znotraj zanke dobimo vsak stolpec iz zbirke stolpcev in spremenljivki dodelimo trenutni predmet stolpca CurrentColumn Nato spremenljivka CurrentColumn dostopamo do nepremičnine Ime in prikažite vrednost te lastnosti na zaslonu: Poročilo(TrenutniColumn.Name);

Pomembno je, da nikoli ne zamenjujete lastnosti objekta in metode objekta.

Lastnost je določena statična vrednost in dostop do nje je npr. zapisan brez oklepaja CurrentColumn.Name. Metoda je v bistvu postopek ali funkcija objekta, klici postopkov in funkcij pa so vedno zapisani v oklepajih (tudi če ni vhodnih parametrov). Na primer: MyTZ.Columns.Quantity()

Če dostopamo do metode in pozabimo napisati oklepaj, nam bo tolmač 1C izdal sporočilo o napaki in ne bo zagnal kode. Ker bo tolmač menil, da ne dostopamo do metode, ampak do lastnosti - ker ni oklepajev. Vendar ne bo mogel najti lastnosti s tem imenom (ker obstaja samo metoda s tem imenom) - kar bo navedeno v sporočilu o napaki.

To bo napisal tolmač, če pozabim dati oklepaj v klic metode na tako nepravilen način MyTZ.Columns.Quantity(brez oklepajev za "Quantity()"):

Polja predmeta ni bilo mogoče najti (količina)

V tem primeru je treba "polje" in "lastnino" razumeti kot sinonima ali netočnost v terminologiji razvijalcev 1C. Obe besedi uporabljata za označevanje istega koncepta. Čeprav lahko v drugih programskih jezikih ti izrazi pomenijo različne stvari.

Pridobivanje podatkov iz tabele vrednosti 1C z uporabo številk stolpcev

Za začetek vam ponujam preprost primer pridobivanja podatkov iz prve vrstice naše tabele. Upoštevajte, da uporabljamo predhodno izpolnjeno tabelo z začetka članka. Zagotovo vemo, da ima tabela prvo vrstico in vsaj en stolpec. Če ta primer uporabimo za prazno tabelo, bo prišlo do napake. Torej:

FirstLine = MyTK; // pridobi prvo vrstico (oštevilčeno od nič) FirstColumnValue = FirstRow; // pridobi vrednost prvega stolpca (številčenje stolpcev je prav tako od začetka) Report(Vrednost prvega stolpca); // prikaži vrednost prvega stolpca v prvi vrstici tabele

Na zaslonu se prikaže:

Čapajev

Najprej smo pridobili objekt vrstice tabele vrednosti z dostopom do tabele vrednosti z uporabo operatorja [...]. (če ste pozabili, kako se to naredi, si lahko ogledate prejšnje članke) Znotraj operatorja smo posredovali argument “0”. To je indeks prve vrstice tabele vrednosti. FirstLine = MyTK;

Poleg tega imamo tudi pravico do dostopa do objekta niza z uporabo operatorja [...]. Znotraj tega operatorja smo posredovali številko stolpca tabele vrednosti, v tem primeru tudi “0”. In tako smo prejeli vrednost stolpca s številko "0" za trenutno vrstico tabele s številko "0". To vrednost smo prikazali na zaslonu in predstavlja niz "Chapaev".

Malce zakomplicirajmo naš primer:

FirstLine = MyTK; // pridobi prvo vrstico (oštevilčeno od nič) Report(FirstLine); // prikaži vrednost prvega stolpca v prvi vrstici tabele Report(FirstRow); // prikaži vrednost drugega stolpca v prvi vrstici tabele Report(FirstRow); // prikaži vrednost tretjega stolpca v prvi vrstici tabele

Zdaj smo prikazali vrednosti iz vseh treh stolpcev prve vrstice naše tabele vrednosti:

Čapajev Vasilij Ivanovič

Zdaj bom tudi ta primer spremenil, tako da bomo lahko brez spremenljivke "Prva vrsta"

Poročilo (MyTZ); // prikaz vrednosti prvega stolpca v prvi vrstici tabele Report(MyTZ); // prikaži vrednost drugega stolpca v prvi vrstici tabele Report(MyTZ); // prikaži vrednost tretjega stolpca v prvi vrstici tabele

Enako bo na ekranu

Čapajev Vasilij Ivanovič

V zgornjem primeru smo videli, da lahko za dostop do vrednosti v določeni vrstici in določenem stolpcu tabele vrednosti uporabimo zaporedni klic dveh operaterjev [...] v tej obliki: Tabela vrednosti[Indeks vrstice][Indeks stolpca]

Tako smo pripravljeni ustvariti zanko in pridobiti podatke vseh vrstic in vseh stolpcev z uporabo indeksov vrstic in stolpcev:

For RowCounter = 0 By MyTZ.Quantity() - 1 Loop // cikel skozi vrstice For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugnezdena zanka skozi stolpce // pridobi vrednost celice (iz trenutne vrstice in trenutni stolpci) CellValue = MyTK[RowCounter][ColumnCounter]; // prikaz številke vrstice, številke stolpca in vrednosti celice Report("Row No" + Row Count + "column No" + Column Count + " = " + CellValue); EndCycle; EndCycle;

Na zaslonu bo prikazano naslednje:

Vrstica št. 0 stolpec št. 0 = Čapajev št. vrstica 0 stolpec št. 1 = Vasilij št. vrstica 0 stolpec št. 2 = Ivanovič vrstica št. 1 stolpec št. 0 = vrstica Dzerzhinsky št. 1 stolpec št. 1 = Felix Vrstica št. 1 stolpec št. 2 = Edmundovich Vrstica št. 2 stolpec št. 0 = Kotovsky Linija št. 2 stolpec št. 1 = Grigorij Vrstica št. 2 stolpec št. 2 = Ivanovič

Z uporabo dveh ciklov, od katerih je eden ugnezden v drugem, smo prikazali vrednosti vseh stolpcev iz vseh vrstic tabele vrednosti 1C. V tem primeru nismo uporabili imen stolpcev, temveč smo do stolpcev in vrstic dostopali z njihovimi indeksi. Za boljše razumevanje bodite pozorni na komentarje v primeru.

Na koncu predlagam, da nekoliko spremenimo naš primer, tako da namesto številk stolpcev na zaslonu prikaže njihova imena. In poleg tega bom naredil bolj predstavljiv dizajn za prikaz vsebine na zaslonu.

For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // zanka skozi vrstice Poročilo(" ======= Št. vrstice " + LineCounter + " ======="); Poročati(" "); // podajanje vrstice (vstavi prazna vrstica) For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugnezdena zanka skozi stolpce // pridobi vrednost celice (iz trenutne vrstice in trenutnega stolpca) CellValue = MyTZ[RowCounter][ColumnCounter]; // pridobi ime stolpca ColumnName = MyTZ.Columns[ColumnCounter].Name; // prikaz imena stolpca in vrednosti celice Report(ColumnName + ": " + CellValue); EndCycle; Poročati(" "); // podajanje vrstice (vstavljanje prazne vrstice) EndCycle;

Zdaj so na našem zaslonu informacije postale bolj reprezentativne:

Vrstica št. 0 ======= Priimek: Chapaev Ime: Vasilij Patronim: Ivanovič ======= Vrstica št. 1 ======= Priimek: Dzerzhinsky Ime: Felix Patronim: Edmundovich ===== == Vrstica št. 2 ======= Priimek: Kotovsky Ime: Grigorij Patronim: Ivanovich

Ja, skoraj sem pozabil. Pri uporabi dveh [...][...] operatorjev v vrsti lahko posredujemo ime tega stolpca namesto indeksa stolpca: Tabela vrednosti[indeks vrstice][imestolpca]

For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // zanka skozi vrstice Poročilo(" ======= Št. vrstice " + LineCounter + " ======="); Poročati(" "); // podajanje vrstice (vstavljanje prazne vrstice) For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // ugnezdena zanka skozi stolpce ColumnName = MyTZ.Columns[ColumnCounter].Name; // pridobite ime stolpcaCell Value = MyTZ[RowCounter][ColumnName]; //

Bodite pozorni na vrstico, označeno s puščico ". V tej vrstici namesto indeksa trenutnega stolpca posredujemo ime trenutnega stolpca argumentu v oglatih oklepajih [...] Rezultat bo enak.

In zdaj, zadnja stvar v tem članku.

PRAVILNO pridobivanje vseh podatkov iz tabele vrednosti 1C z uporabo zank skozi zbirko vrstic in zbirko stolpcev

Za vsako CurrentLine iz MyTZ Loop // zanka skozi zbirko nizov Report(" ======= Line No. " + MyTZ.Index(CurrentLine) + " ======="); Poročati(" "); Za vsak CurrentColumn iz zanke MyTZ.Columns // ugnezdena zanka, ki se ponavlja skozi zbirko stolpcev ColumnName = CurrentColumn.Name; // pridobite ime stolpcaCellValue = CurrentRow[ColumnName]; // pridobi vrednost celice PO IMENU stolpca Report(ColumnName + ": " + CellValue); // prikaz imena stolpca in vrednosti celice Konec cikla; Poročati(" "); EndCycle;

V primeru sta bili uporabljeni dve zanki. Zanka za zanko skozi zbirko stolpcev je ugnezdena znotraj zanke za zanko po vrsticah. Če ste pregledali zgornje primere in prebrali prejšnje članke, potem ne boste imeli težav razumeti, kako ta primer deluje.

Nazadnje bom zmanjšal število vrstic kode v našem zadnjem primeru, kolikor je mogoče, tako da bom odstranil uporabo vmesnih spremenljivk. Dobili bomo vzorec "industrijske kode", ki se uporablja v resničnih problemih.

To storite le, če dobro razumete, kaj počnete. Če je koda zelo zapletena, je sprejemljivo pustiti vmesne spremenljivke, da boste kasneje lažje razumeli lastno kodo. Prav tako mora biti vsaka koda vsaj minimalno komentirana, da bo čez nekaj časa lažje razumeti programska besedila.

Za vsako CurrentLine iz cikla MyTZ // ponavljanje vrstic Report(" ======= Line No. " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); Za vsak CurrentColumn iz zanke MyTZ.Columns // ponovitev stolpcev Report(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); EndCycle; Poročati(" "); EndCycle;

Izpis na zaslonu se ni spremenil, ostaja enak kot v prejšnjem primeru:

2 TEDENSKI TEČAJ

"PROGRAMIRANJE V 1C ZA ZAČETNIKE"

Tečaj bo prišel do E-naslov. Postanite programer z izpolnjevanjem nalog po korakih.

Za sodelovanje potrebujete le računalnik in internet

Brezplačen dostop do tečaja:

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; družina pisav: Arial, "Helvetica Neue", sans-serif; ponavljanje ozadja: brez ponavljanja; položaj ozadja: sredina; velikost ozadja: samodejno;) .sp-form input ( display: inline-block; motnost: 1; vidnost: visible;).sp-form .sp-form-fields-wrapper ( margin: 0 auto; width: 260px;).sp-form .sp -form-control (ozadje: #ffffff; barva obrobe: #cccccc; slog obrobe: polna; širina obrobe: 1px; velikost pisave: 15px; obroba-levo: 8,75px; obroba-desno: 8,75px; obroba -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; višina: 35px; širina: 100 %;).sp-form .sp-field label (barva: #444444; pisava- velikost: 13px; slog pisave: normalno; teža pisave: krepko;).sp-form .sp-button (polmer-obrobe: 4px; -moz-polmer-obrobe: 4px; -webkit-polmer-obrobe: 4px; barva ozadja: #f4394c; barva: #ffffff; širina: 100 %; teža pisave: 700; slog pisave: normalen; družina pisav: Arial, "Helvetica Neue", sans-serif; box-shadow: brez; -moz-box-shadow: brez; -webkit-box-shadow: brez; ozadje: linearni gradient (na vrh, #e30d22, #f77380);).sp-forma .sp-button-container (text-align: center; width: auto;)

Lep pozdrav vsem bralcem infostarta. Ta članek se bo osredotočil na vprašanje ustvarjanja tabele vrednosti po meri v obliki upravljane aplikacije programsko.

Značilnosti naloge.

Vsakdo, ki je programiral v redni aplikaciji, se je pogosto soočil z nalogo pridobitve poljubne tabele vrednosti na obrazcu. Poljubna tabela vrednosti je tabela, katere število in vrsta stolpcev nista vnaprej znana. To pomeni, da so lahko 3 stolpci ali morda 6 ali morda 8. V običajni aplikaciji je vse preprosto: na obrazec za obdelavo lahko postavite element »Tabela vrednosti« in nato prenesete ustvarjeno tabelo vrednosti ​na ta element programsko. Nato s preprostim ukazom:

Elementi obrazca.TableField.CreateColumns();

dobite pripravljeno tabelo vrednosti na obrazcu. Zdi se, da bi lahko bilo preprostejše.

Vse to je bilo v redni aplikaciji. V upravljani aplikaciji se je vse spremenilo. Ustvariti poljubno tabelo ni tako enostavno. Zdaj morate bodisi togo parametrizirati tabelo vrednosti na obrazcu ali jo ustvariti programsko (opišite, no, to je pravzaprav bistvo same upravljane aplikacije). To bomo poskušali storiti: programsko opremo ustvarite tabelo vrednosti po meri na upravljanem obrazcu.

Rešitev problema.

Prva stvar, ki jo moramo narediti, je določiti, kako bo tabela prikazana na obrazcu. Glavna stvar je, da vam pri obdelavi ni treba ustvariti nobenega elementa obrazca. Ustvarili jo bomo programsko, kot celotno tabelo. To pomeni, da bo tabela opisana in ustvarjena v trenutku, ko odprete obrazec ali uporabite gumb - odvisno od tega, kdo jo potrebuje.

Ustvarjanje tabele na obrazcu poteka z opisom tabele vrednosti kot atributa:
SelectionTypeArray = Nova matrika; Niz SelectionType.Add(Type("Tabela vrednosti")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Niz podrobnosti = nov niz; Array of Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN")); Zdaj moramo ustvariti programsko tabelo vrednosti, ki vsebuje podatke. Če je tabela vrednosti pridobljena iz poizvedbe, potem je vse bolj ali manj v redu. Če je tabela ustvarjena ročno, lahko pomen stolpcev, ki bodo vsebovali številke ali datume, ustvarite prek »Opisa vrst«. Bistvo je, da morajo imeti stolpci v tabeli vrednosti neko vrsto. Če se na primer pričakuje, da bo uporabnik podatke v te stolpce vnašal interaktivno, potem v tabelo vrednosti ne morete dodati stolpca samo z imenom; imeti mora vrsto. Ne pozabite – to je zelo pomembno, ker... Te vrste bomo prenesli v tabelo na obrazcu.
Ustvarimo tabelo, ki vsebuje več stolpcev:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Nova matrika; ArrayCD.Add(Vrsta("Datum")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = Nova tabela vrednosti;
TK.Columns.Add("With", DescriptionTypesTime);
TK.Columns.Add("Pred", DescriptionTypesTime);
TK.Columns.Add("Ime");
TK.Columns.Add("Note"); // Polno ime in opomba - vrstice Nato bomo našo programsko tabelo TK napolnili s potrebnimi podatki. Prejmemo tabelo TK, ki vsebuje potrebne vrednosti in je pripravljena za prenos v ustvarjeni atribut obrazca. Za vsak stolpec iz TK. Cikel stolpcev

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;

To je preprosta kombinacija in naša miza je pripravljena.

Za vsak stolpec iz TK. Cikel stolpcev

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "ScheduleTable." + Ime stolpca;
NewElement.Width = 10;
EndCycle;

Pogojno oblikovanje, če ga potrebujemo, ga napišemo tudi ročno, ukazni meni - ročno. Ročno so napisani tudi tabelski rokovalci. Če želite na primer dodati obravnavo dogodkov za tabelo »Izbira«:

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

Za obdelavo tega dogodka je predpisan ločen postopek v obliki postopka:

&OnClient
Postopek TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//ukazi obdelovalca EndProcedure

Upoštevajte, da se upravljalniki tabel sprožijo na odjemalcu in morajo zato imeti ukaz kazalca prevajalnika

&OnClient

No, zadnja stvar, ki sem jo želel dodati, je, da po vseh teh korakih ne pozabite posredovati končane tabele atributu obrazca:

ValueВFormAttributes(ToR, "ScheduleTable");

Tole imamo kot rezultat:


In tukaj je obravnava dogodka "Izbira":



Pogovor.

Upam, da bo članek pomagal tistim programerjem 1C, ki začenjajo programsko ustvarjati tabele na obrazcu.

Prenesete lahko obdelavo, ki programsko ustvari tabelo vrednosti in jo izpiše v kontrolirani obliki s komentarji, ki vam bodo pomagali ustvariti lastne tabele.

Tukaj je nekaj dejstev za začetek - preprosti primeri delo s tabelo vrednosti:

1. Ustvarite tabelo vrednosti

ValueTable = Nova tabela vrednosti;


2. Ustvarite stolpce za tabelo vrednosti:

ValueTable.Columns.Add("Ime");
Tabela vrednosti.Columns.Add("Priimek");


3. Dodajte nove vrstice z uporabo imen stolpcev:


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


4. Kako poiskati vrednost v tabeli vrednosti:
V tabeli je treba najti vrstico, ki vsebuje želeno vrednost.

FoundRow = ValueTable.Find(SearchValue);


5. Poiščite prvo pojavitev v določenih stolpcih tabele vrednosti

FoundRow = ValueTable.Find(SearchValue, "Dobavitelj, Kupec");


6. Če želite najti vse pojavitve v tabeli vrednosti:
Uporabljamo iskalno strukturo.

SearchStructure = Structure("Employee", SearchValue);
Niz najdenih vrstic = ValueTable.FindRows(SearchStructure);


Ustvarimo iskalno strukturo, katere vsak element bo vseboval ime stolpca kot ključ in želeno vrednost v tem stolpcu kot vrednost. Iskalno strukturo posredujemo kot parameter metodi FindLines(). Kot rezultat dobimo vrstice tabele.
Če v strukturo iskanja dodate iskanje želene vrednosti, na primer tudi v stolpcu Odgovorni, potem bomo kot rezultat uporabe metode FindLines() dobili vse vrstice, kjer sta Zaposleni in Odgovorni enaka iskana vrednost.

7. Kako ponoviti tabelo vrednosti v naključnem vrstnem redu

Za vsako trenutno vrstico iz zanke tabele vrednosti
Poročilo (Ime trenutne vrstice);
EndCycle;

Ista stvar z uporabo indeksov:

SeniorIndex = ValueTable.Quantity() - 1;
Za račun = 0 do cikla SeniorIndex
Poročilo(TableValues[Account].Name);
EndCycle;


8. Brisanje obstoječe vrstice tabele vrednosti

ValueTable.Delete(Vrstica za brisanje);

po indeksu

ValueTable.Delete(0);


9. Brisanje obstoječega stolpca tabele vrednosti

ValueTable.Columns.Delete(ColumnDeleted);


po indeksu

ValueTable.Columns.Delete(0);

Upoštevati je treba, da bo brisanje vrstice (ali stolpca) "s sredine" tabele vrednosti povzročilo zmanjšanje za eno v indeksih vrstic, ki se nahajajo "za" izbrisanim

10. Kako izpolniti tabelo vrednosti, če so imena stolpcev v spremenljivkah?

Nova vrstica = Tabela vrednosti.Dodaj();
Nova vrstica[imestolpca] = vrednost;


11. Kako zapolniti celoten stolpec tabele vrednosti z želeno vrednostjo?
Stolpec zastavice davčnega računovodstva v tabeli vrednosti tabele vrednosti mora biti izpolnjen z vrednostjo False

Tabela vrednosti Izpolnite vrednosti (False, "Zastavica davčnega računovodstva");


Za tabelo vrednosti uporabljamo metodo FillValues(). Prvi parameter je vrednost, ki jo je treba izpolniti. Drugi parameter je ime stolpca, ki ga je treba izpolniti.

12. Kako lahko izpolnim tabelo vrednosti “Receiver Table” s podatki iz tabele vrednosti “SourceTable”?

Če tabela prejemnikov v času operacije še ne obstaja ali njenih prejšnjih stolpcev ni treba shraniti, jo lahko ustvarite kot popolno kopijo izvirnika

Tabela prejemnikov = Izvorna tabela.Kopiraj();


Druga možnost: tabela ReceiverTable obstaja in škoda bi bilo izgubiti njene stolpce in omejitve podatkovnih tipov stolpcev. Vendar morate izpolniti podatke za stolpce, katerih imena se ujemajo z imeni izvorne tabele.

Delni prenos podatkov za stolpce z ujemajočimi se imeni:

Za vsako vrstico izvorne tabele iz cikla izvorne tabele
FillPropertyValues(NewRow, SourceTableRow);
Konec cikla


Za vsako vrstico v izvorni tabeli se v ciljno tabelo doda nova vrstica in vrednosti v teh stolpcih se izpolnijo nova tabela, katerih imena se ujemajo z imeni stolpcev v izvorni tabeli

Če tabele nimajo stolpcev z enakimi imeni, bo ciljna tabela na koncu vsebovala toliko vrstic z ničelnimi vrednostmi, kot je bilo vrstic v izvorni tabeli.
Če za nekatere istoimenske stolpce tip vrednosti podatkov iz izvorne tabele ne spada v matriko dovoljenih vrst stolpcev ciljne tabele, bomo v takih poljih dobili prazne vrednosti.
Razmislimo o tretjem primeru. V primeru istoimenskih stolpcev mora biti stolpec ciljne tabele popolnoma skladen s stolpcem izvorne tabele.

Popolno kopiranje podatkov za stolpce z ujemajočimi se imeni

Isti stolpci = Nova matrika ();

Za vsak stolpec iz SourceTable.Columns Cycle
UjemanjeColumn = TableReceiver.Columns.Find(Column.Name);

Če se ujema stolpec<>Nedefinirano Potem

// Pridobi lastnosti stolpca.
Ime = Ime stolpca;
ValueType = Column.ValueType;
Glava = Column.Header;
Širina = Column.Width;

// Zamenjaj stolpce v ciljni tabeli.
Index = TableReceiver.Columns.Index(MatchingColumn);

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

// Dodajte naslednje ime ujemajočih se stolpcev v matriko.
Same Columns.Add(Column.Name);

endIf;

EndCycle;

// Kroženje po vrsticah izvorne tabele.
Za vsako vrstico izvorne tabele iz cikla izvorne tabele

// Dodaj nova vrstica do sprejemne mize.
NewRow = TableReceiver.Add();

// Izpolnite vrednosti v ujemajoče se celice.
Za vsako ime Stolpci iz stolpcev z istim imenom Cikel
Nova vrstica[imestolpca] = Vrstica izvorne tabele[imestolpca];

EndCycle;

EndCycle;


Stolpec v ciljni tabeli bomo morali zamenjati z novim, katerega lastnosti se bodo popolnoma ujemale s stolpcem izvorne tabele.
Če torej v tabeli prejemnikov najdemo stolpec z enakim imenom, zberemo vse lastnosti za nov stolpec v spremenljivkah. Nato izbrišite starega in ustvarite nov stolpec. Nato se pomikamo po vrsticah izvorne tabele.
V zanki dodamo novo vrstico v sprejemno tabelo in odpremo zanko nad imeni stolpcev v nizu ujemajočih se stolpcev.
Znotraj te ugnezdene zanke zapolnimo celice ciljne tabele s podatki celice izvorne tabele.

13. Kako dodati stolpce v tabelo vrednosti »ValueTable« z omejitvami vrste?

Ko dodajate stolpec, lahko preprosto določite njegovo ime in pustite drugi parameter metode Add() nedotaknjen. V tem primeru je podatkovni tip stolpca poljuben.

Dodajanje stolpca brez navedbe vrste podatkov

// Dodajte stolpec brez omejitev glede vrste.
ValueTable.Columns.Add("Object");


Izpolnite lahko vrednost drugega parametra. Tam morate posredovati opis dovoljene vrste za stolpec. Sam opis lahko dobite s pomočjo konstruktorja, tako da mu kot parameter posredujete ime niza tipa (če je tipov veliko, ločenih z vejicami) ali matriko veljavnih tipov.

Dodajanje stolpca, ki označuje vrsto podatkov

// Omejitve podatkovnih tipov stolpcev:
// Samo elementi imenika "Nasprotne stranke".
Tabela vrednosti.Columns.Add("Račun", Nov opis vrst("DirectoryLink.Accounts"));


Če je med vrstami, ki so dovoljene za izpolnjevanje podatkov stolpca, niz, lahko omejite njegovo bitno globino (dolžino), določite uporabo spremenljive ali fiksne dolžine. Vse to dosežemo z ustvarjanjem predmeta z uporabo konstruktorja kvalifikatorjev nizov. Nato bo ta objekt uporabljen kot eden od parametrov konstruktorja TypeDescription.

Uporaba kvalifikatorjev za podajanje podatkovnega tipa stolpca tabele vrednosti

// Priprava in nastavitev omejitev za podatke tipa String.
Kvalifikatorji nizov = Novi kvalifikatorji nizov (20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Podobna dejanja je mogoče izvesti glede kvalifikatorjev števila in datuma.
Upoštevajte: opise tipov lahko sestavi konstruktor "iz nič" ali pa se lahko kot osnova uporabi obstoječi opis tipa.

Uporaba obstoječih deklaracij tipa za podajanje podatkovnega tipa stolpca tabele vrednosti

// Razširitev predhodno uporabljenega opisa tipa.
QualifiersNumbers = Nova števila QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = New DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "Številka, datum", kvalifikatorji številk, kvalifikatorji datumov);

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