1c opprettelse av en verditabell. Hvilke metoder finnes og hvordan søke etter flere verdier samtidig

Publisert 21. september 2011

Verditabell 1C – del 3. Metadata. Sløyfe gjennom verditabellkolonner

I denne artikkelen vil jeg fortelle deg hvordan du jobber med en verditabell av en "ukjent" struktur, hvordan du itererer gjennom kolonnene i en verditabell, hvordan du trekker ut data fra kolonner og rader uten å bruke kolonnenavn. (Denne artikkelen tilhører serien med artikler 1C fra bunnen av; programmering 1C fra bunnen av; tabell over 1C-verdier)

For å forklare materialet og for å kunne kjøre kodeeksemplene våre "live", trenger vi noen testtabell med verdier 1C. Noen av eksemplene våre vil trekke ut data fra en verditabell, så vi lager en tabell med tre kolonner "Etternavn", "Fornavn", "Mellomnavn" og legger inn en liten mengde data i den - så mange som 3 rader :)

Så la oss lage en testtabell med 1C-verdier og fylle den ut:

MyTZ = New ValueTable; // lag en ny tabell med verdier lagret i variabelen "MyTZ" MyTZ.Columns.Add("Etternavn"); // opprett kolonnen "Etternavn" MyTK.Columns.Add("Navn"); // opprett kolonnen "Name" MyTZ.Columns.Add("Patronymic"); // lag "Mellomnavn"-kolonnen // legg til den første raden i verditabellen vår NewLine = MyTZ.Add(); NewString.LastName = "Chapaev"; NewLine.Name = "Vasily"; NewString.Middle name = "Ivanovich"; // legg til den andre linjen NewLine = MyTZ.Add(); NewString.LastName = "Dzerzhinsky"; NewRow.Name = "Felix"; NewString.Middle name = "Edmundovich"; // legg til den tredje linjen NewLine = MyTZ.Add(); NewLine.LastName = "Kotovsky"; NewLine.Name = "Gregory"; NewString.Middle name = "Ivanovich";

Vår testtabell består av tre kolonner: Fornavn, Etternavn, Patronym; og har tre fylte linjer med navn på borgerkrigshelter.

Det første kodeeksemplet teller opp kolonnene i en 1C-verditabell som en samling.

// vis navnene på alle kolonnene i TK for hver kolonne fra MyTZ.Columns Cycle Report("Kolonnenavn: " + Column.Name); EndCycle;

Syklusen vår vil vise alle kolonnenavn i 1C-meldingsvinduet:

Kolonnenavn: Etternavn Kolonnenavn: Fornavn Kolonnenavn: Mellomnavn

Vi ser at for å iterere gjennom kolonner, brukes en spesiell samling iterasjonssyklus, som ligner på raditerasjonssyklusen (i forrige artikkel). MyTK.Columns- dette er en samling av kolonner i 1C-verditabellen "MyTZ". Samlingen inneholder gjenstander av typen "Verditabellkolonne" Hvert objekt av denne typen er en kolonne i verditabellen og inneholder egenskaper og metoder. Ved å få tilgang til disse egenskapene og metodene får vi den nødvendige informasjonen om én kolonne eller utfører noen andre handlinger med den.

For eksempel tilgang til eiendommen "Navn" (Column.Name) får vi navnet på gjeldende kolonne.

Jeg vil gjerne gjøre deg oppmerksom på tittelen på serien: «For Alle Kolonne Fra MyTZ.Column Cycle" Variabel med navn "Kolonne" oppfunnet av oss. Det er ikke nødvendig å bruke samme navn. Du kan kalle denne variabelen hva du vil, for eksempel "MyCurrentColumn" Da vil eksemplet ovenfor se slik ut:

// vis navnene på alle kolonnene i TK for hver MyCurrentColumn Fra MyTK.Columns Cycle Report("Kolonnenavn: " + MyCurrentColumn.Name); EndCycle;

Når 1C-utførelsesundersystemet støter på en syklus av denne typen, tilordner det for hver gjennomgang av syklusen til en variabel med det angitte navnet ett element fra samlingen vår, i dette tilfellet - ett samlingselement verditabellkolonner MyTK.Columns Og så får vi tilgang til variabelen som inneholder gjeldende kolonne og bruker egenskapen "Navn".

Jeg foreslår å vise ved siden av kolonnenavnet nummeret til hver kolonne i samlingen av kolonner:

// vis nummeret og navnene på alle kolonnene i verditabellen for hver kolonne fra MyTZ.Columns Cycle ColumnNumber = MyTZ.Columns.Index(Columns); // få kolonnenummeret ColumnName = Column.Name; // få kolonnenavnet Rapport("Kolonnenummer:" + Kolonnenummer + " Kolonnenavn: " + Kolonnenavn); EndCycle;

Følgende tekst vil vises i 1C-meldingsvinduet:

Kolonnenummer:0 Kolonnenavn: Etternavn Kolonnenummer:1 Kolonnenavn: Fornavn Kolonnenummer:2 Kolonnenavn: Mellomnavn

Vær oppmerksom på at kolonnene i 1C-verditabellen er nummerert fra null, akkurat som radene i verditabellen.

Antall kolonner i 1C-verditabellen

For å finne ut antall kolonner i verditabellen bruker vi "Count()"-metoden på samlingen av kolonner.

Antall kolonner = MyTZ.Columns.Quantity(); Rapport(Antall kolonner);

Tallet "3" vil vises på skjermen. Faktisk har tabellen vår tre kolonner: "Etternavn", "Fornavn", "Patronym"

Hente et kolonneobjekt etter dets nummer (indeks) og telle kolonner ved hjelp av kolonneindeksen

La oss lage en syklus med å søke gjennom alle kolonnene i verditabellen ved å bruke kolonneindekser (tall). Husk at kolonnenummerering starter fra null. Derfor må vi øke syklustelleren "Sch" fra null til et tall som er lik antall kolonner minus én.

For konto = 0 Av MyTZ.Columns.Quantity() - 1 Cycle CurrentColumn = MyTZ.Columns[Act]; Report(CurrentColumn.Name); EndCycle;

På skjermen får vi opp følgende

Fullt navn

Jeg synes dette eksemplet var tydelig. Vi vendte oss til metoden Mengde() kolonnesamlinger" MyTZ.Columns.Quantity()", fikk antall kolonner, og startet en løkke med en teller fra null før antall kolonner minus én. Inne i løkken får vi hver kolonne fra samlingen av kolonner og tilordner gjeldende kolonneobjekt til en variabel Gjeldende kolonne Deretter variabelen Gjeldende kolonne vi får tilgang til eiendommen Navn og vis verdien av denne egenskapen på skjermen: Report(CurrentColumn.Name);

Det er viktig å aldri forveksle et objekts egenskap og et objekts metode.

En egenskap er en viss statisk verdi og tilgang til den skrives for eksempel uten parentes CurrentColumn.Name. En metode er i hovedsak en prosedyre eller funksjon av et objekt, og kall til prosedyrer og funksjoner skrives alltid med parenteser (selv om det ikke er noen inngangsparametere). For eksempel: MyTZ.Columns.Quantity()

Hvis vi får tilgang til en metode og glemmer å skrive parentesene, vil 1C-tolken gi oss en feilmelding og vil ikke kjøre koden. Siden tolken vil vurdere at vi ikke får tilgang til en metode, men en egenskap - fordi det ikke er noen parenteser. Men den vil ikke kunne finne egenskaper med det navnet (fordi det bare finnes en metode med det navnet) - som vil bli oppgitt i feilmeldingen.

Dette er hva tolken vil skrive hvis jeg glemmer å sette parentes i et metodekall på en så feil måte MyTZ.Columns.Quantity(uten parentes etter "Quantity()"):

Objektfelt ikke funnet (antall)

I dette tilfellet skal "felt" og "eiendom" forstås som synonymer, eller en unøyaktighet i terminologien til 1C-utviklere. De bruker begge disse ordene for å referere til det samme konseptet. Selv om disse begrepene i andre programmeringsspråk kan bety forskjellige ting.

Innhenting av data fra en tabell med 1C-verdier ved å bruke kolonnenummer

Til å begynne med tilbyr jeg deg et enkelt eksempel på innhenting av data fra den første raden i tabellen vår. Vær oppmerksom på at vi bruker den forhåndsutfylte tabellen fra begynnelsen av artikkelen. Vi vet med sikkerhet at tabellen har en første rad og minst én kolonne. Hvis vi bruker dette eksemplet på en tom tabell, vil det oppstå en feil. Så:

FirstLine = MyTK; // få den første raden (nummerert fra null) FirstColumnValue = FirstRow; // få verdien av den første kolonnen (kolonnenummerering er også fra bunnen av) Report(Value of the FirstColumn); // vis verdien av den første kolonnen i den første raden i tabellen

Skjermen vil vise:

Chapaev

Først fikk vi et verditabellradobjekt ved å få tilgang til verditabellen ved å bruke [...]-operatoren. (hvis du har glemt hvordan du gjør dette, kan du se på tidligere artikler) Vi sendte argumentet "0" inne i operatøren. Dette er indeksen til den første raden i verditabellen. FirstLine = MyTK;

Videre har vi også rett til å få tilgang til et strengobjekt ved å bruke [...]-operatoren. Inne i denne operatoren passerte vi kolonnenummeret til verditabellen, i dette tilfellet også "0". Og dermed mottok vi verdien av kolonnen nummerert "0" for den gjeldende tabellraden nummerert "0". Vi viste denne verdien på skjermen, og den representerer strengen "Chapaev".

La oss komplisere eksemplet vårt litt:

FirstLine = MyTK; // få den første linjen (nummerert fra null) Report(FirstLine); // vis verdien av den første kolonnen i den første raden i tabellen Report(FirstRow); // vis verdien av den andre kolonnen i den første raden i tabellen Report(FirstRow); // vis verdien av den tredje kolonnen i den første raden i tabellen

Vi har nå vist verdiene fra alle tre kolonnene i den første raden i verditabellen vår:

Chapaev Vasily Ivanovich

Nå skal jeg også modifisere dette eksemplet slik at vi kan klare oss uten variabelen "Første linje"

Rapport(MyTZ); // vis verdien av den første kolonnen i den første raden i tabellen Rapport(MyTZ); // vis verdien av den andre kolonnen i den første raden i tabellen Rapport(MyTZ); // vis verdien av den tredje kolonnen i den første raden i tabellen

Det vil være det samme på skjermen

Chapaev Vasily Ivanovich

Vi så i eksemplet ovenfor at for å få tilgang til en verdi som ligger i en bestemt rad og en spesifikk kolonne i en verditabell, kan vi bruke et sekvensielt kall av to operatører [...] i denne formen: Verditabell[Radindeks][Kolonneindeks]

Så vi er klare til å lage en løkke og hente dataene for alle rader og alle kolonner ved å bruke rad- og kolonneindekser:

For RowCounter = 0 Av MyTZ.Quantity() - 1 Loop // gå gjennom rader For ColumnCounter = 0 Av MyTZ.Columns.Quantity() - 1 Loop // nestet loop gjennom kolonner // få celleverdien (fra gjeldende rad og gjeldende kolonner) CellValue = MyTK[RowCounter][ColumnCounter]; // vis radnummer, kolonnenummer og celleverdi Rapport("Row No" + Row Count + "column No" + Column Count + " = " + CellValue); EndCycle; EndCycle;

Følgende vil vises på skjermen:

Linje nr. 0 kolonne nr. 0 = Chapaev Linje nr. 0 kolonne nr. 1 = Vasily Linje nr. 0 kolonne nr. 2 = Ivanovich Linje nr. 1 kolonne nr. 0 = Dzerzhinsky Linje nr. 1 kolonne nr. 1 = Felix Linje nr. 1 kolonne nr. 2 = Edmundovich Linje nr. 2 kolonne nr. 0 = Kotovsky Linje nr. 2 kolonne nr. 1 = Grigory Linje nr. 2 kolonne nr. 2 = Ivanovich

Ved å bruke to sykluser, hvorav den ene er nestet i den andre, viste vi verdiene til alle kolonner fra alle rader i 1C-verditabellen. I dette tilfellet brukte vi ikke kolonnenavn, men fikk tilgang til kolonner og rader etter deres indekser. For mer forståelse, vær oppmerksom på kommentarene i eksemplet.

Avslutningsvis foreslår jeg å endre eksempelet vårt litt slik at det i stedet for kolonnenummer viser navnene deres på skjermen. Og i tillegg skal jeg lage et mer presentabelt design for å vise innhold på skjermen.

For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // loop through rows Report(" ======= Linjenr. " + LineCounter + " ======="); Å melde(" "); // linjemating (sett inn en tom rad) For ColumnCounter = 0 Av MyTZ.Columns.Quantity() - 1 Loop // nestet loop gjennom kolonner // få celleverdien (fra gjeldende rad og gjeldende kolonne) CellValue = MyTZ [RowCounter][ ColumnCounter]; // få navnet på kolonnen ColumnName = MyTZ.Columns[ColumnCounter].Name; // vis kolonnenavnet og celleverdien Report(ColumnName + ": " + CellValue); EndCycle; Å melde(" "); // linjemating (sett inn en tom linje) EndCycle;

Nå, på skjermen vår begynte informasjonen å se mer representativ ut:

Linje nr. 0 ======= Etternavn: Chapaev Fornavn: Vasily Patronym: Ivanovich ======= Linje nr. 1 ======= Etternavn: Dzerzhinsky Fornavn: Felix Patronym: Edmundovich ===== == Linje nr. 2 ======= Etternavn: Kotovsky Fornavn: Grigory Patronym: Ivanovich

Ja, jeg glemte nesten. Når du bruker to [...][...] operatorer på rad, kan vi sende navnet på denne kolonnen i stedet for en kolonneindeks: Verditabell[Radindeks][Kolonnenavn]

For LineCounter = 0 By MyTZ.Quantity() - 1 Loop // loop through rows Report(" ======= Linjenr. " + LineCounter + " ======="); Å melde(" "); // linjemating (sett inn en tom linje) For ColumnCounter = 0 By MyTZ.Columns.Quantity() - 1 Loop // nestet loop gjennom kolonner ColumnName = MyTZ.Columns[ColumnCounter].Name; // få kolonnenavnetCell Value = MyTZ[RowCounter][ColumnName]; //

Vær oppmerksom på linjen merket med en pil ". I denne linjen, i stedet for indeksen til gjeldende kolonne, sender vi navnet på gjeldende kolonne til argumentet i hakeparenteser [...] Resultatet vil være det samme.

Og nå, det siste i denne artikkelen.

RIKTIG innhenting av alle data fra 1C-verditabellen ved å bruke løkker gjennom en samling av rader og en samling av kolonner

For hver CurrentLine From MyTZ Loop // sløyfe gjennom en samling av strenger Report(" ======= Linjenummer. " + MyTZ.Index(CurrentLine) + " ======="); Å melde(" "); For hver CurrentColumn Fra MyTZ.Columns Loop // nestet loop som itererer gjennom en samling av kolonner ColumnName = CurrentColumn.Name; // få kolonnenavnetCellValue = CurrentRow[ColumnName]; // få celleverdien BY kolonne NAVN Report(ColumnName + ": " + CellValue); // vis kolonnenavnet og celleverdien End of Cycle; Å melde(" "); EndCycle;

I eksemplet ble det brukt to løkker. En løkke for å gå gjennom en samling av kolonner er nestet inne i en løkke for å gå gjennom rader. Hvis du har jobbet gjennom eksemplene ovenfor og lest tidligere artikler, vil du ikke ha noen problemer med å forstå hvordan dette eksemplet fungerer.

Til slutt vil jeg redusere antall kodelinjer i vårt siste eksempel så mye som mulig ved å eliminere bruken av mellomvariabler. Vi vil få et eksempel på "industrikode" som brukes i reelle problemer.

Dette bør bare gjøres når du har en god forståelse av hva du gjør. Hvis koden er veldig kompleks, er det akseptabelt å la mellomliggende variabler være igjen for å gjøre det lettere å forstå din egen kode senere. Dessuten må enhver kode kommenteres minst minimalt, slik at det etter en tid blir lettere å forstå programtekstene.

For hver CurrentLine From MyTZ Cycle // iterate over rows Report(" ======= Linjenummer. " + MyTZ.Index(CurrentLine) + " =======" + Symbols.PS); For hver CurrentColumn Fra MyTZ.Columns Loop // iterate over columns Report(CurrentColumn.Name + ": " + CurrentRow[CurrentColumn.Name]); EndCycle; Å melde(" "); EndCycle;

Utgangen på skjermen har ikke endret seg, den forblir den samme som i forrige eksempel:

2 UKER KURS

"PROGRAMMERING I 1C FOR NYBEGYNNERE"

Kurset sendes på e-post. Bli en programmerer ved å fullføre trinnvise oppgaver.

For å delta trenger du bare en datamaskin og internett

Gratis tilgang til kurset:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; polstring: 5px; width: 270px; maks-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-familie: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; bakgrunnsposisjon: senter; bakgrunnsstørrelse: auto;) .sp-form input ( display: inline-block; opasitet: 1; synlighet: synlig;).sp-form .sp-form-fields-wrapper ( margin: 0 auto; width: 260px;).sp-form .sp -form-control ( bakgrunn: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-venstre: 8.75px; padding-right: 8.75px; border -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; høyde: 35px; bredde: 100%;).sp-form .sp-field label (farge: #444444; font- størrelse: 13px; font-stil: normal; font-weight: fet;).sp-form .sp-button ( border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; bakgrunnsfarge: #f4394c; farge: #ffffff; bredde: 100%; font-vekt: 700; font-stil: normal; font-familie: Arial, "Helvetica Neue", sans-serif; box-shadow: ingen; -moz-box-shadow: ingen; -webkit-box-shadow: ingen; bakgrunn: linear-gradient(to top, #e30d22 , #f77380);).sp-form .sp-button-container (tekstjustering: center; width: auto;)

(Denne artikkelen tilhører serien med artikler 1C fra bunnen av; programmering 1C fra bunnen av; tabell over 1C-verdier)

En virtuell datalagringsstruktur i tabellform - det er det det er

Verditabellen er ikke et permanent objekt i 1C-databasen og lagres ikke mellom lanseringsøktene.

Tabell over verdier 1C(TK) opprettes "on the fly" ved hjelp av programkode, og deretter utføres arbeidet med det på samme måte som med et hvilket som helst annet programobjekt i 1C-programmeringsspråket. Bruke metodekall og få tilgang til egenskapene til et tabellobjekt.

Med andre ord, programmereren lager en tabell i minnet, fyller den med data, jobber med den, sorterer, grupperer, beregner totaler og så videre. Mottar nødvendige data for videre bruk.

La oss lage en verditabell og fylle den med noe. Det må huskes at en tabell med 1C-verdier ikke bare kan opprettes manuelt, ved å ringe operatøren

Nyverditabell;

En verditabell er ofte resultatet av et metodekall på et annet objekt, for eksempel kan resultatet av en spørring dumpes inn i en verditabell, og så videre.

La meg gi deg et enkelt eksempel med en gang.

// MyTZ = New ValueTable; // lag en ny tabell med verdier lagret i variabelen "MyTZ" MyTZ. Kolonner. Add("Etternavn" ); // opprett kolonnen "Etternavn" MyTZ. Kolonner. Add("Navn"); // opprett "Navn"-kolonnen Rapport (MyTZ); // viser verdien til MyTZ-variabelen //

Jeg opprettet en tabell med 1C-verdier, med to kolonner: "Etternavn", "Fornavn". Fremgangsmåte Rapport (MyTK) vil vise variabeltypen i meldingsvinduet MyTZ: Verditabell

Verditabellen vår er tom foreløpig. La oss legge til et par linjer med for- og etternavn.

// fyll ut verditabellen // legg til den første raden i verditabellen vår NewLine = MyTZ. Legg til() ; Ny linje. Etternavn = "Sidorov" ; Ny linje. Navn = "Vasya" ; // legg til en andre rad i verditabellen vår NewLine = MyTZ. Legg til() ; Ny linje. Etternavn = "Ivanov" ; Ny linje. Navn = "Peter" ;

Vi fikk et bord som dette:

Må huske: Radnummer i verditabellen starter fra null

Hvorfor trenger vi i det hele tatt linjenummer? Og slik at vi for eksempel kan få tilgang til en egen rad i verditabellen, ta og vis denne raden på skjermen.

// *** vis verdiene til nulllinjen på skjermen *** (i hverdagen nummererer vi vanligvis ting fra én, men her - fra null) // få nullraden i tabellen vår ved å bruke radindeksen i hakeparenteser OurNullString = MyTZ[ 0] ; // nå er hele nullstrengen inneholdt i variabelen "OurFirstLine" Report(OurNullString.LastName) ; // vis verdien av kolonnen "Etternavn" lagret i rad null Rapport (OurNullString.Name) ; // vis verdien av "Navn"-kolonnen fra samme linje

Som et resultat vil skjermen vise:

Sidorov Vasya

Nå, for det veldig smarte og konsise, vil jeg vise et eksempel som lar deg få tilgang til verdien av en kolonne i en slik og en slik rad (Verdien av en kolonne i en slik og en slik rad er en celle i verditabellen En uoffisiell betegnelse, men praktisk). Men uten å bruke en mellomvariabel som "OurZeroString".

For å vise verdien av celler fra den andre raden (ikke glem at raden er den andre, men indeksen til denne raden er én, så nummereringen starter fra null)

Til slutt, det siste punktet i denne artikkelen. Jeg viste deg et eksempel på tilgang til en enkelt rad i en verditabell etter indeks (radnummer). Den universelle formen for å lese eller tilordne innholdet i en celle er: "Min verditabell[Radnummer].Kolonnenavn"

Nå skal jeg gi deg en syklus med fullstendig utdata av innholdet i verditabellen. Uten detaljerte forklaringer, slik at du også kan pusse hjernen din :)

// // gå gjennom og vis alle radene i verditabellen vår// For LineNumber = 0 Ifølge MyTZ. Quantity() - 1 syklusrapport (MyTZ[Linjenummer] . Etternavn) ; // vis verdien av "Etternavn"-kolonnen Rapport (MyTK[LineNumber] . Navn) ; // vis verdien av "Navn"-kolonnen EndCycle ;

Som et resultat av å kjøre denne sløyfen, vil følgende vises på skjermen:

Sidorov Vasya Ivanov Petya

Her fortalte jeg deg det aller grunnleggende om å jobbe med 1C-verditabellen. Denne informasjonen gjelder for 1C 8.0, 8.1, 8.2. De interessante detaljene om "1C verditabell"-objektet slutter ikke der. Dette objektet har enorme muligheter for praktisk arbeid med data. Jeg vil snakke om dette i de følgende artiklene.

Degtyarev Roman.

Hvordan lære å programmere i 1C fra bunnen av?

Hvordan jobbe som 1C-programmerer og tjene opptil 150 000 rubler per måned?

REGISTRER DEG GRATIS

2 UKER KURS

"PROGRAMMERING I 1C FOR NYBEGYNNERE"

Kurset sendes på e-post. Bli en programmerer ved å fullføre trinnvise oppgaver.

For å delta trenger du bare en datamaskin og internett

Gratis tilgang til kurset:

Sp-force-hide ( display: none;).sp-form ( display: block; background: #eff2f4; polstring: 5px; width: 270px; maks-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-familie: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; bakgrunnsposisjon: senter; bakgrunnsstørrelse: auto;) .sp-form input ( display: inline-block; opasitet: 1; synlighet: synlig;).sp-form .sp-form-fields-wrapper ( margin: 0 auto; width: 260px;).sp-form .sp -form-control ( bakgrunn: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-venstre: 8.75px; padding-right: 8.75px; border -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; høyde: 35px; bredde: 100%;).sp-form .sp-field label (farge: #444444; font- størrelse: 13px; font-stil: normal; font-weight: fet;).sp-form .sp-button ( border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; bakgrunnsfarge: #f4394c; farge: #ffffff; bredde: 100%; font-vekt: 700; font-stil: normal; font-familie: Arial, "Helvetica Neue", sans-serif; box-shadow: ingen; -moz-box-shadow: ingen; -webkit-box-shadow: ingen; bakgrunn: linear-gradient(to top, #e30d22 , #f77380);).sp-form .sp-button-container (tekstjustering: center; width: auto;)

Hilsen alle lesere av infostart. Denne artikkelen vil bli viet til spørsmålet om å lage en vilkårlig verditabell i form av en administrert applikasjon programmatisk.

Funksjoner ved oppgaven.

Alle som har programmert i en vanlig applikasjon har ofte blitt møtt med oppgaven med å få en vilkårlig verditabell på et skjema. En vilkårlig verditabell er en tabell hvis antall og type kolonner ikke er kjent på forhånd. Det vil si at det kan være 3 kolonner, eller kanskje 6, eller kanskje 8. I en vanlig applikasjon er alt enkelt: du kan plassere elementet "Table of Values" på behandlingsskjemaet, og deretter overføre den opprettede verditabellen ​til dette elementet programmatisk. Så med en enkel kommando:

Form Elements.TableField.CreateColumns();

få en ferdig tabell over verdier på skjemaet. Det ser ut til at det kunne vært enklere.

Dette var alt i den vanlige søknaden. I en administrert applikasjon har alt endret seg. Det er ikke så lett å lage en vilkårlig tabell. Nå må du enten stivt parameterisere verditabellen på skjemaet, eller lage den programmatisk (beskriv, vel, dette er faktisk essensen av selve den administrerte applikasjonen). Dette er hva vi vil prøve å gjøre: programmessig lage en vilkårlig verditabell på en kontrollert form.

Løsningen på problemet.

Det første vi må gjøre er å bestemme hvordan tabellen vil vises på skjemaet. Hovedsaken er at du ikke trenger å lage noe formelement i behandlingen. Vi vil lage det programmatisk, som hele tabellen. Det vil si at tabellen vil bli beskrevet og opprettet i øyeblikket du åpner skjemaet eller bruker en knapp - avhengig av hvem som trenger det.

Opprettelsen av en tabell på skjemaet skjer gjennom beskrivelsen av verditabellen som et attributt:
SelectionTypeArray = New Array; Array of SelectionType.Add(Type("Verditabell")); ChoiceTypeDescription = New TypeDescription(ChoiceTypeArray); Array of Details = New Array; Array of Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN")); Nå må vi lage en programmatisk verditabell som inneholder dataene. Hvis verditabellen er hentet fra en spørring, er alt mer eller mindre i orden. Hvis tabellen opprettes manuelt, kan betydningen av kolonnene som vil inneholde tall eller datoer opprettes gjennom "Beskrivelse av typer". Poenget er at kolonnene i verditabellen må ha en type. Hvis det for eksempel forventes at brukeren skal fylle ut data i disse kolonnene interaktivt, kan du ikke legge til en kolonne i verditabellen bare med et navn, den må ha en type. Husk - dette er veldig viktig fordi... Vi overfører disse typene til tabellen på skjemaet.
Vi lager en tabell som inneholder flere kolonner:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = New Array; ArrayCD.Add(Type("Dato")); DescriptionTypesTime = New DescriptionTypes(ArrayCD,CD); TZ = New ValueTable;
TK.Columns.Add("With", DescriptionTypesTime);
TK.Columns.Add("Før", DescriptionTypesTime);
TK.Columns.Add("Navn");
TK.Columns.Add("Note"); // Fullt navn og merknad - rader Deretter vil vi fylle vår TK-programtabell med de nødvendige dataene. Vi mottar en TK-tabell som inneholder de nødvendige verdiene og er klar til å overføres til det opprettede skjemaattributtet. For hver kolonne fra TK. Kolonnesyklus

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;

Dette er en enkel kombinasjon og bordet vårt er klart.

For hver kolonne fra TK. Kolonnesyklus

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

Betinget design, hvis vi trenger det, skriver vi det også manuelt, kommandomenyen - manuelt. Bordbehandlere skrives også for hånd. For eksempel, for å legge til en hendelsesbehandler for "Utvalg"-tabellen:

Table of SelectionFields.SetAction("Selection","TZNSelection");

For å behandle denne hendelsen er det foreskrevet en egen prosedyre i form av en prosedyre:

&På klient
Prosedyre TKNSelection(TK, Selected Row, Field, StandardProcessing)
//handler kommandoer EndProcedure

Merk at tabellbehandlere skyter på klienten og derfor må ha en kompilatorpekerkommando

&På klient

Vel, det siste jeg ville legge til er at etter alle disse trinnene, husk å sende den ferdige tabellen til skjemaattributtet:

ValueВFormAttributes(ToR, "ScheduleTable");

Dette er hva vi har som resultat:


Og her er håndteringen av "Selection"-arrangementet:



Etterord.

Jeg håper artikkelen vil hjelpe de 1C-programmererne som begynner å lage tabeller på et skjema programmatisk.

Du kan laste ned en prosessering som programmatisk oppretter en verditabell og viser den på et håndterbart skjema med kommentarer som hjelper deg med å lage dine egne tabeller.

For å gjøre rede for penger og varer, er ulike tabeller mye brukt i næringslivet. Nesten hvert dokument er et bord.

En tabell viser varene som skal sendes fra lageret. En annen tabell viser forpliktelsene til å betale for disse varene.

Derfor, i 1C, inntar arbeid med bord en fremtredende plass.

Tabeller i 1C kalles også "tabelldeler". Kataloger, dokumenter og andre har dem.

Spørringen, når den utføres, returnerer en tabell som kan nås på to forskjellige måter.

Det første - raskere - utvalget, å skaffe rader fra det, er bare mulig i rekkefølge. Den andre er å laste opp søkeresultatet til en verditabell og deretter tilfeldig tilgang til det.

//Alternativ 1 – sekvensiell tilgang til søkeresultater

//få bordet
Select = Query.Run().Select();
// vi går gjennom alle linjene i søkeresultatet i rekkefølge
Mens Select.Next() Loop
Rapport(Utvalg.Navn);
EndCycle;

//Alternativ 2 – opplasting til en verditabell
Request = New Request("SELECT Name FROM Directory.Nomenclature");
//få bordet
Tabell = Query.Run().Unload().
//Videre kan vi også iterere gjennom alle linjene
For hver rad fra tabellsyklus
Rapport(String.Name);
EndCycle;
//eller vilkårlig tilgang til strenger
Rad = Tabell.Finn("Skovel", "Navn");

En viktig funksjon er at i tabellen som er hentet fra søkeresultatet, vil alle kolonner være strengt skrevet. Dette betyr at ved å be om Navn-feltet fra nomenklaturkatalogen, vil du motta en kolonne av typen String med en tillatt lengde på ikke mer enn N tegn.

Tabell på skjemaet (tykk klient)

Brukeren arbeider med tabellen når den er plassert på skjemaet.

Vi diskuterte de grunnleggende prinsippene for å jobbe med skjemaer i timen på og i timen på

Så la oss plassere tabellen på skjemaet. For å gjøre dette kan du dra tabellen fra kontrollpanelet. På samme måte kan du velge Form/Insert Control fra menyen.

Dataene kan lagres i konfigurasjonen - da må du velge den eksisterende (tidligere lagt til) tabelldelen av konfigurasjonsobjektet hvis skjema du redigerer.

Klikk på "..."-knappen i Data-egenskapen. For å se listen over tabelldeler, må du utvide objektgrenen.

Når du velger tabelldelen, vil 1C selv legge til kolonner i tabellen på skjemaet. Rader som legges inn av brukeren i en slik tabell vil bli lagret automatisk sammen med oppslagsboken/dokumentet.

I den samme Data-egenskapen kan du skrive inn et vilkårlig navn og velge typen Verditabell.

Dette betyr at en vilkårlig verditabell er valgt. Den vil ikke automatisk legge til kolonner, og den vil heller ikke automatisk lagres, men du kan gjøre hva du vil med den.

Ved å høyreklikke på tabellen kan du legge til en kolonne. I egenskapene til en kolonne kan du spesifisere navnet (for referanse i 1C-kode), kolonneoverskriften på skjemaet, forbindelsen med attributtet til den tabellformede delen (sistnevnte - hvis ikke en vilkårlig tabell er valgt, men en tabelldel).

I tabellegenskapene på skjemaet kan du angi om brukeren kan legge til/slette rader. Et mer avansert skjema er avmerkingsboksen Vis Bare. Disse egenskapene er praktiske å bruke for å organisere tabeller beregnet for visning av informasjon, men ikke redigering.

For å administrere tabellen må du vise et kommandopanel på skjemaet. Velg menypunktet Skjema/Sett inn kontroll/kommandolinje.

I kommandolinjens egenskaper merker du av for Autofyll slik at knappene på panelet vises automatisk.

Tabell på skjema (tynn/administrert klient)

På et administrert skjema ser disse handlingene litt annerledes ut. Hvis du trenger å plassere en tabelldel på skjemaet, utvider du objektgrenen og drar en av tabelldelene til venstre. Det er alt!

Hvis du trenger å plassere en verditabell, legg til et nytt skjemaattributt og spesifiser typen – verditabell i egenskapene.

For å legge til kolonner, bruk høyreklikkmenyen på dette skjemaattributtet, velg Legg til attributtkolonne.

Dra også tabellen til venstre.

For at en tabell skal ha en kommandolinje, i tabellegenskapene, velg verdiene i delen Bruk – Kommandolinjeposisjon.

Laster opp en tabell til Excel

Enhver 1C-tabell på skjemaet kan skrives ut eller lastes opp til Excel.

For å gjøre dette, høyreklikk på en tom plass i tabellen og velg Liste.

I en administrert (tynn) klient kan lignende handlinger utføres ved å bruke menypunktet Alle handlinger/Vis liste.

Spørsmål Opprette en tabellkolonne med verdier av forskjellige typer i 1C v8
Svar
Når du oppretter en verditabellkolonne, kan du passere rekke typer, og kanskje en bestemt type. En rekke typer brukes når du skal spesifisere flere forskjellige typer for én kolonne.

Brukes til å angi typer "generelt objekt" - "Beskrivelse av typer". Derfor skal vi først forklare hva «Beskrivelse av typer» («Beskrivelse av verdityper») er.

"Beskrivelse av verdityper". For å beskrive de akseptable typene egenskapsverdier til forskjellige objekter i systemet, brukes et spesielt objekt "Beskrivelse av typer". Ved å bruke dette objektet kan du beskrive de gyldige typene verdier som kan tilordnes egenskaper. For ytterligere å begrense de mulige verdiene til de primitive typene Number, String og Date er gitt kvalifiseringer. Kvalifiserte beskriver parametere som lengden på en streng eller et tall, gyldige deler av en dato osv.

Syntaks for "Typebeskrivelse"-metoden

Nye beskrivelsestyper(<Исходное описание типов>, <Добавляемые типы>, <Вычитаемые типы>, <Квалификаторы числа>, <Квалификаторы строки>, <Квалификаторы даты>)
Alternativer:
<Исходное описание типов> (valgfri)
Type: BeskrivelseTyper. Den første beskrivelsen av typer, på grunnlag av hvilke en ny vil bli bygget.
<Добавляемые типы> (valgfri)
Type: Array, String. En rekke typeverdier En type som består av typene som skal brukes i objektet, eller en streng som inneholder navnene på typene atskilt med komma.
<Вычитаемые типы> (valgfri)
Type: Array, String. En rekke Type-verdier (eller en streng som inneholder kommaseparerte typenavn) som består av typene som vil bli ekskludert fra den innledende erklæringen spesifisert i den første parameteren.
<Квалификаторы числа> (valgfri)
Type: Kvalifiseringsnummer. Tallkvalifikatoren som beskriver gyldige verdier av en numerisk type.
<Квалификаторы строки> (valgfri)
Type: QualifiersStrings. Stringkvalifikatoren som beskriver gyldige verdier av en strengtype.
<Квалификаторы даты> (valgfri)
Type: Kvalifiseringsdatoer. Datokvalifikatoren som beskriver gyldige verdier av datotypen.
Beskrivelse:
Oppretter en typebeskrivelse basert på en annen typebeskrivelse, ved å legge til noen typer og ekskludere andre. Dersom en ny kvalifisering ikke er spesifisert, beholdes kvalifikasjonene til den opprinnelige typeerklæringen.
Et eksempel på bruk av "Type Description"-objektet:

// utvide beskrivelsen av gyldige typer med nye typer Array = New Array; Array. Legg til(Type( "Referanselenke. Metoder")); Array. Add(Type("Tall" )); Sign = ValidSign. Ikke-negativ; QuNumbers = New QualifiersNumbers(10, 2, Sign); ValidTypes = NewTypeDescription(ValidTypes, Array, KvNumbers);
Nå, faktisk, eksempler på korrekt oppretting av kolonneverdier av forskjellige typer i en tabell.

Generelt er det nok å definere kolonnetypene som følger:

TK. Kolonner. Legg til( "Sorteringsindeks", Nye beskrivelsestyper ("Nummer") ); TK. Kolonner. Add("Seksjonsnavn", New TypeDescription("String" ) ) ; TK. Kolonner. Add("DataCorr" , New TypeDescription("Dato" ) ); TK. Kolonner. Legg til( "Ubetinget sletting", New TypeDescription("Boolean")); TK. Kolonner. Add("Nomenklatur" , New TypeDescription() ) ; TK. Kolonner. Add("SectionData" , New TypeDescription("Structure" )​) ; // eksempel på å lage kolonner "nummer" og "streng" med klargjøring av parametere: TK. Kolonner. Legg til( "Prosent fullført", New DescriptionTypes ( "Number" , New QualifiersNumbers ( 18 , 2 ) ) ); TK. Kolonner. Add("SectionName" , NewTypeDescription("String" , , NewStringQualifiers(200, AllowedLength. Variable) ) ); TK. Kolonner. Add("DecommissionedDate" , NewTypeDescription("Date" , , , NewDateQualifiers(DateParts.DateTime) ) );

Mer generelt sendes imidlertid en matrise som kolonnetype. En matrise brukes når flere typer må tilordnes én kolonne. Da vil definisjonen av strukturen være noe sånt som dette (eksempler er gitt for forskjellige typer kolonner, når typen er en matrise, men for enkelhets skyld er sammensetningen av matrisen gitt av samme type, for ikke å bli forvirret )

////// dannelse av strukturen til de tekniske spesifikasjonene (oppretting av kolonner) //// definerer kvalifikasjoner for substitusjon i kvalifiseringsfeltene i den tekniske spesifikasjonen CN = New QualifiersNumbers(18, 9); KS = NewStringQualifiers(200); CD = NewDateQualifiers(DataParts.DateTime) ; //// definere typebeskrivelser for fremtidige TK-kolonner // En matrise er den første beskrivelsen av typer, på grunnlag av hvilke en ny vil bli bygget // Vær oppmerksom på at for TK-kolonner er den første typebeskrivelsen i dette eksemplet en matrise Array = New Array; Array. Add(Type("String") ); TypeDescriptionString = New TypeDescription(Array, , KS) ; Array. Clear() ; Array. Add(Type("Tall") ); TypeDescriptionNumber = New TypeDescription(Array, , , CN) ; Array. Clear() ; Array. Add(Type("Dato") ); DescriptionTypesDate = New DescriptionTypes(Array, , , , CD) ; Array. Clear() ; Array. Legg til(Type( "DirectoryLink.Nomenclature") ) ; Type DescriptionNomenclature = Ny typebeskrivelse (Array) ; Array. Clear() ; Array. Legg til(Type( "DirectoryLink.SeriesNomenclature") ) ; TypeDescriptionSeries = New TypeDescription(Array) ; Array. Clear() ; Array. Legg til(Type( "DirectoryLink.Quality") ) ; TypeDescriptionQuality = New TypeDescription(Array) ; Array. Clear() ; Array. Add(Type("Boolean") ); TypeDescriptionBoolean = Ny TypeDescription(Array) ; // faktisk legger til kolonner til TK (oppretter strukturen til den fremtidige TK) TK. Kolonner. Add("Nomenklatur", BeskrivelseTyperNomenklatur) ; TK. Kolonner. Add("Code" , TypeDescriptionString) ; TK. Kolonner. Legg til( "Serienomenklatur", BeskrivelseTypesSeries); TK. Kolonner. Add("Kontokode" , Type DescriptionString) ; TK. Kolonner. Add("ActionDate" , TypeDescriptionDate) ; TK. Kolonner. Add("Kvalitet" , TypeDescriptionQuality) ; TK. Kolonner. Add("NumberUS", BeskrivelseTypesNumber) ; TK. Kolonner. Add("Skriv av" , TypeDescriptionBoolean) ; . . . //////// dannelse av strukturen til de tekniske spesifikasjonene (oppretting av kolonner) ////////////////////////////////////////////////////////

For å legge til en rad i en verditabell, se