Egendefinert søk i dynamisk liste

I tillegg til primitive datatyper som kan finnes i alle programmeringsspråk, er det unike typer i 1C. Hver av dem har sine egne egenskaper, metoder, funksjoner, formål og bruksnyanser i systemet. En av disse typene er en dynamisk liste, som i stor grad letter mange anvendte oppgaver. Det er derfor utviklere må kjenne til og kunne håndtere dette universelle verktøyet.

Funksjoner av dynamiske lister i 1C

Hensikten med denne typen er å vise informasjon fra alle databasetabeller, uavhengig av type. Mekanismen ble opprettet på grunnlag av SKD og har lignende evner. Men dette betyr ikke at du nødvendigvis må skrive en forespørsel på 1C-språket, selv om denne muligheten eksisterer og bør brukes. Du kan ganske enkelt spesifisere tabellen hvis informasjon interesserer deg og 1C vil uavhengig generere en enkel spørring.

For å se hvordan en dynamisk liste dannes og hvilke data den viser, må du åpne de administrerte skjemaene der den er plassert i konfiguratoren: i listen over detaljer, bruk kontekstmenyen for å åpne egenskapene og ta hensyn til "Egendefinert Forespørsel" element. Hvis det ikke er noen avmerkingsboks, gjenspeiler parameteren "Hovedtabell" databasetabellen som dataene er hentet fra. Ellers gjenspeiler den dynamiske listen dataene til et tilpasset søk, som kan sees ved å åpne listeinnstillingene.

Det tilpassede spørringsskjemaet er mye mer vanlig, da dette gir en utmerket mulighet til å kombinere og vise et bredt utvalg av data. Oftest brukes denne mekanismen for å reflektere lagersaldoer, varepriser, kvitteringer, utgifter eller kjøp. Du må bruke den forsiktig, siden ytelsen kan falle for komplekse søk.

En annen nyttig egenskap for en dynamisk liste åpnes når du klikker på inskripsjonen "Listeinnstillinger". Denne menyen lar deg gjøre informasjon mer tilgjengelig og forståelig for sluttbrukere, selv når du bruker et standardsett med felt. Uansett om forespørselen er vilkårlig eller ikke, vil du se fanen "Innstillinger", der du kan spesifisere:

  • Dynamisk listevalg;
  • Grupper;
  • Sortering;
  • Innredning.

Bruken av parametere gjør dynamiske lister universelle og ganske fleksible. Du kan også koble dem til detaljer på et administrert skjema, og dataene vil endres avhengig av parameterne valgt av brukeren. Bruken av disse mekanismene kan forstås og verdsettes ved å vurdere eksempler på virkelige problemer.

Som et eksempel, vurder oppgaven med å reflektere restene av nomenklaturen på en kontrollert form. I praksis forekommer slike ordre ganske ofte i ulike konfigurasjoner, og en dynamisk liste er ideell som et verktøy. For denne oppgaven må vi bruke en egendefinert spørring, dynamiske listeparametere og dens innstillinger.

For større klarhet, la oss lage en separat ekstern behandling og plassere en dynamisk liste på den. For å implementere planene våre vil ikke tabellen med nomenklaturen være nok, så vi må tillate en vilkårlig spørring. I den vil vi beskrive den venstre forbindelsen til katalogen med listen over varer og balanseregisteret og angi katalogen som hovedtabell. Denne ordningen vil tillate brukere, som arbeider med en dynamisk liste, å legge til eller endre elementer.



SELECT NomenclatureList.Name AS Name, GoodsInWarehousesRemainings.Warehouse AS Warehouse, GoodsInWarehousesRemainings.QuantityRemaining AS QuantityRemaining FROM Directory.Nomenclature AS NomenclatureList VENSTRE TILKOBLING RegisterAccumulations.GoodsInWarehouses,ASur.RemaiResma. ing software NomenclatureList.Link = ProductsInWarehousesRemainings.Nomenclature HVOR

Siden forespørselen vår brukte "CurrentDate"-parameteren, må vi angi verdien før vi bruker behandlingen. For å gjøre dette, i skjemamodulen i "When CreatedOnServer"-prosedyren, ved å bruke en standardkommando, tilordne den "CurrentSessionDate"-funksjonen. Vi må også vise den dynamiske listen på kontrollskjemaet og endre rekkefølgen på feltene for klarhet. Dra «Resterende nomenklatur»-attributtet inn i skjemaelementene (øvre venstre del) og bruk de blå pilene for å endre rekkefølgen på feltene i tabellen på skjemaet.

&På serverprosedyren når den opprettes på serveren (feil, standardbehandling) nomenklatur forblir. Parametere. Sett ParameterValue("CurrentDate", CurrentSessionDate()) EndProcedure


Allerede på dette stadiet kan vi åpne vår eksterne behandling i 1C og se at den dynamiske listen fungerer. Vi kan se på saldo, lage varer og grupper og søke. Ofte ber kunder om å legge til muligheten til å velge datoen de vil se saldoene. Når det gjelder et skjema med en dynamisk liste, oppnås dette gjennom et tilleggsfelt og innstilling av parametere ved hjelp av det.

Legg til «DateRemaining»-attributtet av «Date»-typen og overfør det til skjemaelementene. I felthendelsene oppretter vi «OnChange»-hendelsen og skriver koden for innstilling av «CurrentDate»-parameteren som brukes i den dynamiske forespørselen. Slik at når brukeren åpner skjemaet umiddelbart forstår på hvilken dato han ser saldoene, vil vi gjøre små endringer i "When CreatedOnServer"-prosedyren.



&OnServerProcedureWhenCreatingOnServer(Failure, StandardProcessing)RemainingDate = CurrentSessionDate(); Item Remains.Parameters.SetParameterValue("CurrentDate", RemainDate); Slutt på prosedyre &På klienten Prosedyre Gjenstående DatoWhenChanged(Element)Nomenclature Remaining.Parameters.SetParameterValue("CurrentDate",RemainingDate); Slutt på prosedyre

Som et resultat kan vårt dynamiske listeskjema gjenspeile saldoer på en hvilken som helst dato.

Vi har bare vurdert en liten del av mulighetene til dette verktøysettet, men dette er allerede nok til å forstå bekvemmeligheten med denne typen dynamiske lister. En lignende mekanisme brukes til mange oppgaver, men den finnes oftest i typiske konfigurasjoner i administrerte former:

  1. Utvalg;
  2. Lister.

For å motta en dynamisk liste og dens forespørsel i standard administrerte skjemaer, må utvikleren åpne ønsket skjema i konfiguratoren. I detaljdelen finner du detaljene med datatypen "DynamicList" (oftest er den uthevet med fet skrift). Egenskapene inneholder forespørselstekst, valg og andre innstillinger.

Hjemmenotater fra gjennom glasset

21.04.2014 Mottar dynamiske listedata

Implementert i versjon 8.3.6.1977.

Vi har implementert muligheten til å enkelt og bekvemt skaffe data vist ved hjelp av en dynamisk liste.

Du kan trenge dynamiske listedata for å skrive dem ut i en ikke-standard, "spesifikk" form. Eller for å utføre visse handlinger med dem. Send for eksempel et brev til alle entreprenører som du har valgt ut i listen basert på bestemte kriterier.

I tillegg er det en rekke oppgaver der brukeren, i tillegg til listen over elementer, også ønsker å se sammendragsdataene knyttet til denne listen. For eksempel etter å ha valgt produkter fra en bestemt produktgruppe og en bestemt leverandør, ønsker han umiddelbart å se det totale antallet slike produkter i databasen.

En dynamisk liste i seg selv kan ikke gi deg denne informasjonen. Hensikten med en dynamisk liste er å gi rask visning av store datamengder. Derfor leser den dataene i biter som kreves for å vises på en eller to skjermer. Og "vet ingenting", for eksempel om den totale mengden data han må telle.

Generelt, for å få tilleggsinformasjon som brukeren ønsker, må du kjøre en databasespørring. Nøyaktig den samme som den som brukes i den dynamiske listen.

Du pleide å kunne gjøre dette. Men det var ikke alltid lett. Tross alt, i tillegg til teksten til den opprinnelige forespørselen som den dynamiske listen fungerer på, trengte du å vite alle valgene, sorteringene og andre parametere som brukeren interaktivt satte i tabellen som viser dataene.

Nå kan dette problemet løses enkelt. Den dynamiske listetabellen har nå to nye metoder:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

Dermed får du selve dataoppsettet, og viktigst av alt, alle innstillingene, takket være at brukeren ser listen akkurat slik. Alt du trenger å gjøre er å komponere oppsettet programmatisk og vise det i en samling av verdier (for programbehandling) eller i et regnearkdokument (for visning):

Som et resultat vil du motta en struktur (eller rapport) som inneholder kolonner og rader som vises i en dynamisk listetabell.

Det viktige poenget er at oppsettet og innstillingene du mottar fra den dynamiske listetabellen tar hensyn til blant annet synligheten til kolonnene og søket som er brukt. Siden innstillingene hentes separat, kan du endre sammensetningen av feltene til dine egne formål og få opp for eksempel alle kolonnene i listen, og ikke bare de som er synlige for brukeren.

Når du skriver ut til et regnearkdokument, er det enda et hyggelig øyeblikk. Generelt vil utseendet til rapporten tilsvare utseendet til den dynamiske listetabellen på det tidspunktet skjemaet og innstillingene mottas. Inkludert den betingede utformingen av bordet. Du trenger bare noen ekstra handlinger hvis du vil overføre den betingede utformingen av skjemaet til rapporten.

Skriv ut (Ctrl+P)

Dynamisk liste

1. Generell informasjon

En dynamisk liste er en spesiell datatype som lar deg vise vilkårlig informasjon fra databasetabeller på et skjema. For å gjøre dette må du spesifisere tabellen du vil vise data fra, eller beskrive det resulterende utvalget på et spørringsspråk.
Mekanismen er basert på et datasammensetningssystem og gir muligheter for sortering, valg, søk, gruppering og betinget formatering av mottatte data. I dette tilfellet er datakilden en forespørsel, som enten genereres av systemet automatisk (basert på spesifiserte data) eller skrevet manuelt av utvikleren.

Ris. 1. Alternativer for å lage en dynamisk liste

Når du oppretter skjemaattributter av typen Dynamisk liste en utvikler kan velge to måter å lage en dataspørring på:
● Ved å spesifisere hovedtabellen - i dette tilfellet trenger du bare å spesifisere tabellen (hovedtabellegenskapen) som du vil motta data fra, og systemet vil automatisk generere en spørring for dataene (se høyre del i fig. 1).
● Manuell generering av en forespørsel - for dette må du angi egenskapen Egendefinert forespørsel (se venstre side av fig. 1). Etter dette vil manuell generering av en forespørsel om å hente data fra infobasen være tilgjengelig.
En spørring kan hente data fra flere tabeller, slik at du kan spesifisere en primærtabell. Dette er slik at den dynamiske listen kan bestemme hvilke data som er primære og hvilke som er sekundære, og kan korrekt velge og vise informasjon, samt gi standardkommandoer. Men hvis det er umulig å bestemme hovedtabellen i spørringen, kan den ikke spesifiseres, men da
den dynamiske listen vil ikke gi kommandoer relatert til hovedtabellen. I tillegg, i dette tilfellet (uten å spesifisere hovedtabellen) vil effektiviteten av å skaffe data med en dynamisk liste bli betydelig redusert.
For å forbedre ytelsen anbefales det at alle sammenføyninger som brukes i en egendefinert spørring kun for å hente tilleggsdata, gjøres valgfrie ved å bruke en utvidelse for et datakomposisjonssystem for spørrespråk.
For en dynamisk liste, som er hovedskjemaattributtet, er det mulig å angi utvalgsverdier ved hjelp av en skjemaparameter Utvalg. For å gjøre dette, er det nødvendig at navnet på strukturegenskapen ligger i parameteren Utvalg,
falt sammen med navnet på det dynamiske listevalgfeltet. I dette tilfellet vil verdien til strukturegenskapen settes som riktig verdi for utvalgselementet. Hvis en matrise, en fast matrise eller en liste med verdier sendes som verdien til et element i utvalgsparameteren i et dynamisk listeskjema, blir en betingelse med alternativet In List lagt til utvalget, i riktig verdi hvorav en liste over verdier er plassert (som matrisen og den faste matrisen konverteres til).
En vilkårlig spørring i en dynamisk liste kan være en spørring der en parameter brukes til å generere verdien til et felt, for eksempel:

VELGE
VALG
NÅR Levering. Koeffisient = 1 SÅ & Presentasjon
ELLER Levering. Koeffisient
SLUTT SOM Forhold
FRA

Dessuten, hvis typen av parameterverdien er forskjellig fra typen objektattributt (f.eks. Rekvisitter 1 har type Antall, og parameterverdien er type Linje), så for å vise feltet riktig, må du eksplisitt caste parameterverdien til ønsket type:

VELGE
VALG
NÅR Levering. Koeffisient = 1 SÅ EXPRESS(&Representasjon AS String(100)) ELLES Levering. Koeffisient
SLUTT SOM Forhold
FRA
Dokument.Levering av produkter HVORDAN du skal levere

Hvis feltet som utvalget er satt til er deaktivert ved hjelp av funksjonelle alternativer, blir ikke valg etter et slikt felt installert, selv om valgverdien sendes som skjemaparametere eller koblinger for utvalgsparameter.
Ved å bruke egenskapen Dynamisk datalesing indikerer du til en dynamisk liste behovet for å lese data i små porsjoner
(for mer informasjon om måter å skaffe data ved hjelp av en dynamisk liste og databufring, se nedenfor). Uavhengig av dette attributtet, gjelder følgende betingelser:

● Hvis visningsmodusen er satt til hierarkisk liste, vil bare dataene til den gjeldende gruppen og dataene til alle overordnede elementer (uten underordnede) bli lest.
● Hvis trevisningsmodus er satt, vil kun data fra åpne trenoder bli lest.
● Engangslasting av dynamiske listedata støttes ikke hvis hierarkisk surfing er angitt (Visningsegenskapen er satt til Tre) og den første trevisningen er satt til Utvid alle nivåer. For å skaffe data vil det bli gjort like mange forespørsler til serveren som det er noder i den viste listen.
Innenfor en enkelt datainnhenting gjenbruker en dynamisk liste tidligere opprettede midlertidige tabeller hvis følgende betingelser er oppfylt:
● Listebatch-spørringen har ingen spørringer etter hovedbatch-spørringen.
● Sammensetningen av midlertidige tabeller og feltene i dem er uendret fra forrige utførelse av batchforespørselen.

I sitt arbeid bruker den dynamiske listen verdiene til følgende egenskaper for metadataobjektdetaljer:
● format,
● redigeringsformat,
● hint,
● tegn for å fremheve negative verdier,
● maske,
● skilt for flerlinjemodus,
● tegn på avansert redigering,
● passordmodus.
Når du viser og redigerer utvalget og parameterne til datasammensetningssystemet, brukes redigeringsformatet til det tilsvarende feltet.

2. Begrensninger og funksjoner

Når du angir valg i en dynamisk liste, husk at valg ikke påvirker grupper hvis visningsmodusen for den dynamiske listen er Hierarkisk liste eller Tre. Med "grupper" mener vi et element i en katalog eller plan av karakteristiske typer hvis ThisGroup-egenskap er satt til True.
Kvalifikasjoner som automatisk brukes av en dynamisk liste til standarddetaljene Eier, Foreldre, Dato, Periode og Denne Gruppen brukes
ved hjelp av standard verktøy for datasammensetningssystem. Utvelgelse, automatisk brukt av en dynamisk liste på nøkkelfelt, kan brukes både ved standard hjelp av datasammensetningssystemet og ved å legge til betingelser direkte i forespørselsteksten I til feltene i hovedtabellen. Som et resultat av å bruke valg ved hjelp av layoutverktøy, kan de brukes både i nestede spørringer og i parametere for virtuelle tabeller.

Når du utvikler dynamiske lister, anbefales det å teste alle dynamiske lister med tilpassede søk. Under verifiseringsprosessen bør du sørge for at hvis en listespørring inneholder nestede spørringer eller virtuelle tabeller, og i disse felt med aliaser som samsvarer med aliasene til standarddetaljene, er eier, overordnet, dato, periode, denne gruppen eller nøkkelfelt tilgjengelig for valg, så er disse feltene gyldige tilsvarer standarddetaljene som kallenavnet deres samsvarer med. Hvis dette ikke er tilfelle, bør du endre forespørselen slik at de stemmer med eller
kallenavnet var annerledes.
Hvis du velger å generere en forespørsel manuelt, pålegges noen begrensninger for forespørselen:
● Bruk av FIRST-setningen i en dynamisk listespørring støttes ikke. Hvis du trenger å bruke et utvalg begrenset av antall poster i en dynamisk liste, bør du omarbeide forespørselen for å generere en dynamisk liste på en slik måte at det faktiske innholdet i forespørselen plasseres i en underspørring og begrense antallet poster mottatt i denne underspørringen. Du kan også bruke en midlertidig tabell i stedet for en underspørring.
● Valg, sortering og gruppering støttes ikke:

  • I henhold til detaljene i tabelldelene.
  • Vis felt.
  • DataVersjon-feltet.
  • Forhåndsdefinert DataName-felt.
  • Kontoplantabelltypefelt.
  • Felt Type bevegelse av akkumuleringsregistertabellen.
  • Felttypeverdier for den karakteristiske typeplantabellen.
  • Typefelt Type;
  • Felt av typen String (ubegrenset lengde).
  • Felt av typen BinaryData.

● Sortering og gruppering etter Subconto-felt støttes ikke<НомерСубконто>og ViewSubconto<НомерСубконто>Tabeller Bevegelser Underkonto av regnskapsregisteret.
● Gruppering etter felt som er spørringsspråkuttrykk som inneholder aggregerte funksjoner, støttes ikke.
● Når hovedtabellen er valgt, har den dynamiske listespørringen følgende begrensninger:

  • Blir støttes ikke.
  • ORDER BY-delen støttes ikke. Du bør bruke en spørring uten hovedtabell eller angi den nødvendige rekkefølgen gjennom de dynamiske listeinnstillingene.

● Hvis en dynamisk liste vises som en hierarkisk liste eller tre, vil ikke en oppføring vises som en dynamisk liste med mindre minst én overordnet av oppføringen vises. Med andre ord, for å vise et element i en hierarkisk liste, må en dynamisk liste også vise alle foreldrene til det elementet opp til toppen av listen. I dette tilfellet mener vi enten med toppen av listen
rotelementet til det hierarkiske objektet som vises av en dynamisk liste, eller elementet angitt som ParentTopLevel-egenskapen til en skjematabellutvidelse for en dynamisk liste.

Bruk av følgende tabeller som hovedtabell for en dynamisk liste støttes ikke:

● En tabell som ikke har en nøkkel som unikt identifiserer hver tabellpost (en referanse for objekttabeller og en postnøkkel for registertabeller). Følgende tabeller kan imidlertid settes som hovedtabellen i en dynamisk liste (til tross for at de ikke har en nøkkel):

● Underkontotabell til regnskapsregisteret;
● alle virtuelle tabeller i regnskapsregisteret, bortsett fra MovementsSubconto-tabellen;
● tabeller med konstante verdier (inkludert tabellen konstanter);
● tabeller over eksterne datakilder uten nøkkelfelt;
● kubetabeller over eksterne datakilder;
● akkumuleringsregistertabeller:

  • revolusjon tabellen;
  • balanse tabellen;
  • tabell over omsetning og saldo.

● beregningsregistertabeller:

  • tabell over faktisk gyldighetsperiode;
  • tidsplan data;
  • grunnleggende data.

● Tabeller av tabellformede deler av objekter;
● Endre registreringstabeller (brukes i datautvekslingsmekanismer);
● Sekvenstabeller;
● Konverteringstabeller (brukes i periodiske oppgjørsmekanismer).
● En tabell som bare brukes i en spørring i en ytre sammenføyning.

Med andre ord vil en dynamisk liste med den spesifiserte hovedtabellen fungere korrekt hvis, som et resultat av å utføre spørringen,
spesifisert som en datakilde, øker ikke antall rader hentet fra hovedtabellen (med tanke på det pålagte utvalget). Hvis antallet rader oppnådd av spørringen fra hovedtabellen øker som et resultat av å utføre en spørring, vil dette føre til et brudd på unikheten til nøkkelen til postene i tabellen som vises i listen. I dette tilfellet må du deaktivere bruken av den dynamiske hovedlistetabellen.
Når du arbeider med en dynamisk liste, må du ta hensyn til tilgangsrettighetene til detaljene som vises av listen:
● Data fra dynamiske listekolonner som er merket med Bruk alltid-egenskapen, men som gjeldende bruker ikke har Vis-rettigheten for, overføres ikke til klientsiden. Tilgang til data for slike kolonner (ved bruk av CurrentData-egenskapen og RowData()-metoden)
ikke mulig på klientsiden.
● Hvis den gjeldende brukeren ikke har Vis-rettigheten på et nøkkelfelt i en dynamisk liste, vil henting av data fra den dynamiske listen resultere i en tilgangsbruddsfeil.
For en dynamisk liste som viser en oppregningsliste, er det ikke noe alternativ for interaktivt å tilpasse listen.
Sammensetningen av kolonnene og innstillingene til den dynamiske listen er knyttet til spørringsfeltene ved å bruke aliaser til utvalgsfeltene. Hvis et alias ikke er eksplisitt spesifisert i en spørring for et utvalgsfelt og feltet er et system, blir feltnavnet for den engelske versjonen av det innebygde språket brukt som et alias.
Det spesifiserte forholdet betyr at når du endrer (eller eksplisitt spesifiserer et alias for et felt som et automatisk alias ble brukt for)
alias for spørringsfeltet som genererer de dynamiske listedataene, innstillingene for dynamisk listeattributt vil gå tapt, skjemaelementene vil "miste" de viste detaljene, de dynamiske listeinnstillingene blir feil, osv.
Hvis datakilden til en dynamisk liste er en tabell (vanlig eller virtuell), som lar deg angi et utvalg etter periode, så hvis brukeren setter visningsperioden i en slik dynamisk liste (kommando Angi datointervall...),
de angitte periodegrensene vil bli satt som utvalgsverdier eller virtuelle tabellparametere. Hvis ved hjelp av språkutvidelse
spørringer for datasammensetningssystemet, navnene på de virtuelle tabellparametrene ble eksplisitt spesifisert - parametrene med den spesifiserte
navn. Tabeller som det er mulig å kontrollere perioden for visning eller behandling av data:
● registertabeller (hoved- eller virtuelle), som det er mulig å velge etter periode (for beregningsregisteret - etter registreringsperiode);
● hovedtabeller over dokumenter, forretningsprosesser og oppgaver;
● hovedtabeller over dokumentjournaler;
● hovedsekvenstabeller, sekvensgrensetabeller.
Den dynamiske listespørringsparameteren kan være en matrise eller en liste med verdier. Men hvis parameteren er en liste med verdier, vil bare den første verdien i listen bli brukt som valgverdi. Hvis en dynamisk liste bruker en spørring med parametere, må den første innstillingen av parameterverdier utføres i OnCreateOnServer-behandleren.
Når du viser dynamiske listedata, må du huske på følgende punkter:
● Når du programmatisk endrer egenskapene til en dynamisk liste, blir ikke kommandopanelene knyttet til listen automatisk fylt ut på nytt.
med denne dynamiske listen.
● Hvis flere felt er gruppert i en gruppe med grupperingsmodus i en celle og i de grupperte feltene er det et felt som vises som en avkrysningsboks, vil denne avmerkingsboksen alltid vises først i den resulterende cellen (til venstre for tekst).
I en dynamisk liste, når du bestemmer datatypen for felt hvis uttrykk inkluderer parametere, felt eller bokstaver, bestemmes den resulterende typen av typene felt og bokstaver. Hvis parameterverditypen ikke er inkludert i den resulterende datatypen, vil verdien avkortes.
For eksempel, i følgende eksempel vil feltet være av typen Number.

VALG
NÅR DET ER LØGN
SÅ 5
ELLERS
&Parameter
SLUTT

Hvis du setter parameterparameteren til en verdi av en annen type, vil den dynamiske listen for det feltet motta verdien 0 (standardverdien for nummertypen).
Hvis du i en slik situasjon må velge en parameter av en annen type, anbefales det å bruke spørringsspråkkonstruksjonen UTTRYKKE. For eksempel,
hvis du i eksemplet ovenfor trenger å sende en streng på ikke mer enn 100 tegn inn i parameteren, bør du erstatte den enkle indikasjonen av parameteren med et uttrykk med en eksplisitt type cast:

VALG
NÅR DET ER LØGN
SÅ 5
ELLERS
EXPRESS(&Parameter AS String(100))
SLUTT

Hvis den vilkårlige teksten til en dynamisk listeforespørsel bruker parametere i uttrykkene til utvalgsfeltene, bør du eksplisitt angi parametertypen ved å bruke konstruksjonen UTTRYKKE. For eksempel i stedet for &Nomenclature AS Nomenklatur bruk
EXPRESS(&Nomenclature AS Directory.Nomenclature) AS Nomenclature. Ellers kan det fungere å søke gjennom søkefeltet
feil eller gir feil.

3. Metoder for å hente og bufre data med en dynamisk liste

Når du henter data som skal vises, bruker en dynamisk liste en av tre metoder:
1. Lesing fra databasen utføres i biter med et antall dataelementer litt større enn antall rader som vises samtidig av listen (men ikke mindre enn 20). Data er ikke bufret på serveren.
2. Lesing fra databasen gjøres på sider med 1000 dataelementer. Data bufres på serveren. Hierarkiske data bufres: ikke mer enn 2 sider med elementer bufres for hver overordnet. Ikke mer enn 20 sider med elementer bufres per dynamisk liste. Bufring vil bli aktivert av en dynamisk liste for følgende tabeller:
● Utvalgskriterier;
● Alle tabeller i regnskapsregisteret, bortsett fra hovedtabellen og MovementsSubconto-tabellen;
● Alle akkumuleringsregistertabeller, unntatt hovedtabellen;
● Alle tabeller i informasjonsregisteret, unntatt hovedtabellen;
● Alle tabeller i beregningsregisteret, unntatt hovedtabellen;
● Virtuell tabell med oppgaver etter utøver;
● Tabeller over eksterne kilder uten nøkler;
● Kuber fra eksterne kilder.

3. Lesing fra databasen utføres i sider med 1000 elementer. Den første delen er lik 1 side. Hver påfølgende del øker med 1 side (når slutten av forrige prøve er nådd). Jo nærmere "visningspunktet" beveger seg mot slutten av de viste dataene, desto større blir prøven lest fra databasen, og blir til slutt lik alle de viste dataene. Data bufres på serveren. Maksimalt antall oppføringer i hurtigbufferen og den dynamiske listen er 1 000 000.
Avhengig av hva som er valgt av hovedtabellen til den dynamiske listen og hvilken verdi den dynamiske leseegenskapen har, brukes en eller annen metode for å lese data:

● En av følgende tabeller er spesifisert som verdien av hovedtabell-egenskapen: utvekslingsplan, katalog, dokumentliste, dokumentjournal, plan over kjennetegnstyper, kontoplan, plan for beregningstyper, forretningsprosess, oppgave, tabell over forretningsprosesspunkter:



● En av følgende tabeller er spesifisert som verdien av Main table-egenskapen: hovedtabellen til informasjonsregisteret, akkumuleringsregisteret, regnskapsregisteret, beregningsregisteret, den virtuelle tabellen til regnskapsregisteret MovementsSubconto:

● Dynamisk leseegenskap:
● Installert: metode 1 brukes (beskrivelse av metodene er gitt ovenfor).
● Tilbakestill: Metode 2 brukes (beskrivelse av metoder er gitt ovenfor).

● Main table-egenskapen inneholder utvalgskriterietabellen eller oppgavetabellen etter utfører (Tasks By Performer):
● Nøkkel som identifiserer en tabellrad: Link.

● Main table-egenskapen spesifiserer den virtuelle tabellen til informasjonsregisteret SliceFirst eller SliceLast:
● Nøkkel som identifiserer en tabellrad: RecordKey.
● Egenskapen Dynamisk lesing er ikke aktuelt.
● Metode 2 brukes (beskrivelse av metoder er gitt ovenfor).

● Main table-egenskapen er satt til en av de virtuelle registertabellene, bortsett fra de som er oppført ovenfor:

● Egenskapen Dynamisk lesing er ikke aktuelt.

● Main table-egenskapen er ikke spesifisert, en vilkårlig spørring brukes:
● Nøkkel som identifiserer en tabellrad: Nummer.
● Egenskapen Dynamisk lesing er ikke aktuelt.
● Metode 3 brukes (beskrivelse av metoder er gitt ovenfor).

For visning overføres data til klienten i porsjoner, hvis størrelse er lik porsjonsstørrelsen i den første metoden for å lese data (beskrevet i begynnelsen av denne delen).
Når du oppretter et skjema som inneholder en dynamisk liste, sendes 45 dataelementer for hver synlige dynamiske liste først til klienten (hvis listen har mer enn 45 elementer). Hvis den dynamiske listen viser mer enn 45 rader, vil et ekstra serverkall bli foretatt når skjemaet åpnes for å hente de manglende dataelementene.

4. Dynamiske listeinnstillinger

Innstillinger for eiendomsliste - ved å klikke på hyperkoblingen Åpne åpnes et skjema for å sette opp visningen av en dynamisk liste. Å sette opp en liste gjøres på samme måte som lignende operasjoner i et datakomposisjonssystem.


Ris. 2. Betinget styling av en dynamisk liste

Når du setter opp en dynamisk liste i konfigurasjonen, har applikasjonsutvikleren mulighet til å gjøre følgende:
● angi feltene du vil sortere etter;
● beskrive utvalget av data i listen;
● angi betingede utseendeinnstillinger;
● angi feltene du vil gruppere dataene etter.
Det er fornuftig å stille inn sorteringen til utvikleren hvis du ikke er fornøyd med standardsortering som er installert av systemet.

RÅD. Det bør huskes at dårlig utvalg av sorteringsfelt (samt utvalg og gruppering av data) påvirker effektiviteten av dynamisk sampling negativt.
Fra en applikasjonsutviklers synspunkt består dynamiske listeinnstillinger av flere deler som er sammenkoblet. Hovedegenskapen som du kan administrere innstillingene for en dynamisk liste gjennom er LinkerSettings. Dette objektet inneholder tre sett med innstillinger som, når systemet kjører, bestemmer de endelige innstillingene som brukes på den dynamiske listen:
● Innstillinger – innstillinger opprettet i konfiguratormodus. Den dynamiske listens Order-egenskap gir rask tilgang til Settings.Order-egenskapen til den dynamiske listens innstillingsbygger, så følgende konstruksjoner er likeverdige:
List.Order og List.SettingsLinker.Settings.Order;
● Brukerinnstillinger – dette er innstillinger som endres av brukeren i 1C:Enterprise-modus;
● Faste innstillinger – disse innstillingene angis fra det innebygde språket. Denne egenskapen inneholder også utvalgsverdier som overføres til skjemaet ved hjelp av parameterne. De dynamiske listeegenskapene Selection, Options, Conditional Appearance gir rask tilgang til de faste innstillingene til den dynamiske listeinnstillingsbyggeren. Med andre ord, disse samtalene er likeverdige:
List.Settings Composer.FixedSettings.Selection og List.Selection.
Når du oppretter de endelige innstillingene for en dynamisk liste, kombineres ulike innstillingsalternativer som følger:
● Hvis noen type innstillinger er helt merket som egendefinerte, inkluderer de resulterende innstillingene de egendefinerte innstillingene
(List.ComposerSettings.UserSettings). Dessuten, hvis noen innstillingselementer er merket som utilgjengelige, vil disse innstillingene bli plassert i de resulterende innstillingene fra List.Settings Composer-egenskapen. Innstillinger.
● Hvis noen type innstillinger er merket som egendefinerte ikke helt, men element for element, gjør du følgende:
● Elementer merket som tilpasset vil bli inkludert i de resulterende innstillingene fra List.SettingsComposer.CustomSettings-egenskapen.
● Elementer merket som utilgjengelige vil bli inkludert i de resulterende innstillingene fra List.SettingsComposer.Settings-egenskapen.
● Faste innstillinger (List.SettingsComposer.FixedSettings) legges til de resulterende innstillingene "som de er". Samtidig er det uakseptabelt at de faste og brukerinnstillingene inneholder innstillinger med samme navn, for eksempel valg med samme venstre verdi i betingelsen.

Hvis de dynamiske listeinnstillingene inneholder innstillinger som er deaktivert ved hjelp av funksjonelle alternativer, vil disse innstillingene bli fjernet fra listen over tilgjengelige innstillinger når de dynamiske listedataene er hentet.
Kontroll av hvilke innstillinger som vil være tilgjengelige for brukeren og hvilke som ikke vil gjøres i vinduet for dynamiske listeinnstillinger.


Ris. 3. Kontroller inkludering i brukerinnstillinger

Avmerkingsboksen nederst i vinduet (se fig. 3) er ansvarlig for å plassere hele typen innstillinger i innstillingene (normal eller rask). Denne funksjonen er tilgjengelig for utvelgelse, bestilling, gruppering og betinging. Hvis innstillingene er spesifisert med redigeringsmodusen Hurtigvalg, må du i egenskapen Brukerinnstillingergruppe i tabellen for skjemaet som viser den dynamiske listen spesifisere en tom gruppe av skjemaet der elementene som er knyttet til hurtigbrukerinnstillingene til den dynamiske listen vil bli lokalisert. Hvis gruppen ikke er spesifisert, vil ikke hurtigbrukerinnstillinger vises på skjemaet. Det er også mulig å eksplisitt påkalle opprettelsen av egendefinerte innstillinger ved å bruke det innebygde språket ved å bruke CreateCustomSettingsFormItems()-metoden til den dynamiske listeutvidelsen.
Det er også mulig å velge om du vil plassere spesifikke innstillingselementer i brukerinnstillingene. Denne funksjonen er tilgjengelig for utvalg og betingede designelementer (se figur 3).

Hvis du trenger spesielle innstillinger som skal lastes når du åpner en dynamisk liste, kan dette gjøres på to måter:
● Bruke parameteren for dynamisk listeskjema UserSettings. Dataene i denne parameteren vil bli plassert i brukerens dynamiske listeinnstillinger.
● Bruke parameteren for dynamisk listeskjemaUserSettingsKey. Hvis du spesifiserer denne parameteren når du åpner et skjema, vil brukerinnstillingene som ligger i innstillingslageret med den angitte nøkkelen lastes inn i den dynamiske listen, som er hovedattributtet til skjemaet.

5. Søk i en dynamisk liste

En dynamisk liste på skjemaet gir muligheten til interaktivt å søke i de viste dataene. Søket kan utføres ved hjelp av følgende verktøy: søkefelt, søkedialog, søk etter gjeldende verdi, bruk søkehistorikk og innstilling av periode (for dynamiske lister som viser dokumenter). Søkeresultatet er et begrenset sett med poster
en dynamisk liste (over de tilgjengelige for en gitt bruker) som samsvarer med søkekriteriene.
For å kontrollere søkemulighetene til en dynamisk liste, er det tre tabellegenskaper på det administrerte skjemaet som viser den dynamiske listen:
● Søkestrengposisjon – bestemmer posisjonen til søkestrengen. Kan ta følgende verdier: Auto, Command Bar, None, Top, Bottom.


Ris. 4. Søkestreng i en dynamisk liste

Hvis verdien av denne egenskapen er satt til Kommandopanel, vil søkestrengen vises i skjemakommandopanelet (hvis den dynamiske listen er hovedskjemaattributtet) eller i kommandopanelet knyttet til den dynamiske listen. Søkefeltet plassert i kommandolinjen er alltid trykket til høyre kant av kommandolinjen (sammen med knappene til høyre for søkefeltet).
Hvis egenskapen er satt til Nei, vil ikke søkestrengen være på skjemaet, og når du begynner å skrive søkestrengen, åpnes en dialogboks.
Hvis egenskapen er satt til Topp, vil søkefeltet være plassert mellom listekommandolinjen og tabellen som viser den dynamiske listen. Hvis egenskapen er satt til Bunn, vil søkestrengen plasseres umiddelbart etter tabellen som viser den dynamiske listen.


● Hvis egenskapen Kompatibilitetsmodus er satt til Ikke bruk eller eldre enn versjon 8.3.4 – verdien er Kommandopanel.
Gå til søkelinjen som følger:
● Ved å trykke på tastekombinasjonen Ctrl+F;
● Mus;
● Når du begynner å skrive i en dynamisk liste (med hensyn til verdien av SearchOnTyping-egenskapen til den dynamiske listen).
● Vis tilstandsposisjon – beskriver hvor visningstilstanden vil vises: hvilke felt ble søkt på og hvilke verdier
søkte i hvert felt. Kan ta følgende verdier: Auto, Ingen, Topp, Bunn


Ris. 5. Søk tilstand i dynamisk liste

Hvis egenskapen er satt til Nei, vil ikke visningstilstanden være til stede på skjemaet. Som et resultat vil det være mulig å avgjøre om søket er fullført eller ikke bare ved tilgjengeligheten av Avbryt søk-knappen.
Hvis egenskapen er satt til Topp, vil visningstilstanden være plassert mellom listekommandolinjen og tabellen som viser den dynamiske listen. Hvis egenskapen er satt til Bunn, vil visningstilstanden plasseres umiddelbart etter tabellen som viser den dynamiske listen.
Hvis skjemaet ble opprettet i 1C:Enterprise versjon 8.3.4 og tidligere, er egenskapen satt til No. Hvis skjemaet ble opprettet i 1C:Enterprise versjon 8.3.5 og eldre, er egenskapen satt til Auto. Den virkelige verdien av eiendommen i dette tilfellet vil bli bestemt som følger:
● Hvis egenskapen Kompatibilitetsmodus er satt til versjon 8.3.4 (og lavere) – verdi No;
● Hvis egenskapen Kompatibilitetsmodus er satt til Ikke bruk eller eldre enn versjon 8.3.4 – verdi Topp;
● Søkekontrollposisjon – Bestemmer hvor søkekontrollknappen skal vises. Knappen åpner en meny som inneholder følgende informasjon: kommandoer Finn etter gjeldende verdi, Avansert søk, Avbryt søk, Angi periode (for dokument- og journallister) og søkehistorikk (siste 5 søk). Egenskapen kan ha følgende verdier: Auto, Ingen, Kommandopanel.


Ris. 6. Administrere søk i en dynamisk liste

Hvis egenskapen er satt til Nei, vil ikke søkekontrollknappen være på skjemaet (men kommandoene vil være tilgjengelige ved å bruke Mer-menyen). Kommandolinjeegenskapsverdien plasserer en knapp på kommandolinjen knyttet til en tabell som viser en dynamisk liste.
Hvis skjemaet ble opprettet i 1C:Enterprise versjon 8.3.4 og tidligere, er egenskapen satt til No. Hvis skjemaet ble opprettet i 1C:Enterprise versjon 8.3.5 og eldre, er egenskapen satt til Auto. Den virkelige verdien av eiendommen i dette tilfellet vil bli bestemt som følger:
● Hvis egenskapen Kompatibilitetsmodus er satt til versjon 8.3.4 (og lavere) – verdi No;
● Hvis egenskapen Kompatibilitetsmodus er satt til Ikke bruk eller eldre enn versjon 8.3.4 – verdien er Kommandopanel;
Hvis det er flere kommandopaneler på et skjema, hvor kommandokilden er én tabell i det administrerte skjemaet (som viser dynamiske listedata), vil søkelinjen og søkekontrollknappen være plassert i bare ett kommandopanel:
● Eller i kommandolinjen til selve den dynamiske listen (hvis den har automatisk fullføring aktivert)
● Eller i et av de gjenværende kommandopanelene.

La oss se på funksjonene ved å bruke søk i en dynamisk liste:
● For å gjøre søket praktisk å bruke (inkludert når det gjelder ytelse), må du aktivere fulltekstsøk for alle konfigurasjonsobjekter som kan brukes som hovedtabellen i den dynamiske listen. Fulltekstsøket bør også inkludere alle detaljer om konfigurasjonsobjekter som kan vises i en dynamisk liste og som det kan være nødvendig å søke etter.
Hvis et objekt ekskluderes fra fulltekstsøk, vil den aktuelle søkemekanismen fungere, men ytelsen til et slikt søk vil være ekstremt lav. Det anbefales ikke å bruke søk på objekter som ikke er indeksert av fulltekstsøk.
● Applikasjonsløsningen må ha en rutineoppgave som jevnlig oppdaterer fulltekstsøkeindeksen.

● Søket utføres ikke på tvers av alle kolonnene i den dynamiske listen (og konfigurasjonsobjektet), men bare gjennom de kolonnene som vises i tabellen.
● Søk i en dynamisk liste etter felt med referansetyper med vilkårlig representasjon utføres av felt som brukes til
representasjonsdannelse (se her). Feltene som er inkludert i visningen er hentet under hensyntagen til ViewFieldGettingProcessing()-behandleren til det tilsvarende objektet.
● For dynamiske lister med en spesifisert hovedtabell brukes fulltekstsøk på hovedtabellen. Alle ikke-indekserte lenker fra hovedtabellen vil bli lagt til fulltekstsøkeresultatene. Resultatet av et fulltekstsøk etter hovedtabellen brukes som et utvalg basert på nøkkelfelt. Et fulltekstsøk utføres også på felt som vises i listen fra andre tabeller (hvis feltet og konfigurasjonsobjektet bruker fulltekstsøk). Uten fulltekstsøk aktivert, kan data være
funnet, men selve søket vil gå veldig sakte.
Hvis det oppstår en feil under forsøk på å utføre et fulltekstsøk, vil søket utføres uten å bruke fulltekstsøket.
Dette kan for eksempel skje når du søker etter én bokstav og et stort antall linjer i informasjonsgrunnlaget som starter med denne bokstaven.
● Hvis et utvalg med sammenligningstypen er lik brukes for et felt i hovedtabellen til en dynamisk liste, vil en valgverdi legges til søket for denne tabellen når du utfører et fulltekstsøk.
● Søkestrengen er delt inn i ord. Denne partisjonen utføres i henhold til følgende regler:
● Linjen brytes med mellomrom og tabulatortegn som skilletegn.
● Deretter behandles hvert resulterende fragment:
● Hvis fragmentet er en daterepresentasjon (med eller uten tid) basert på gjeldende sesjonslokalitet, er ordet fragmentet.
● Ellers deles fragmentet videre ved å bruke tegnene “,.-/\” som skilletegn. I dette tilfellet tas hvert resulterende fragment av strengen som et ord.

● For hvert ord dannes dets eget sett med betingelser, som er kombinert "ved ELLER". Dette settet med betingelser genereres hvis et fulltekstsøk etter et gitt ord i tabellen som dette feltet ble hentet fra, returnerte minst ett objekt, eller et fulltekstsøk ikke ble brukt for dette feltet. Betingelsene er dannet som følger:
● For et felt av typen String er betingelsen FieldName LIKE %Word%.
● For et felt av typen Number, har betingelsen formen Feltnavn=Verdi, der Verdi er et ord konvertert til talltypen. Hvis kastet ikke kan utføres, vil ikke feltsøket bli utført.
● Ordet slås opp som en delstreng i standard boolsk representasjon som er definert for gjeldende økt. Hvis søkeordet er funnet i en visning, søker den etter verdien som tilsvarer visningen der ordet ble funnet. I dette tilfellet bruker ikke søket visninger som er spesifisert med egenskapen Format form element.
● For et felt av typen Dato ser betingelsen ut som FieldName>=StartofDay(Word) ANDFieldName<=КонецДня(Слово). Если Слово подобно дате, в которой год
angitt med ett eller to sifre, vil året reduseres til det nåværende århundre og denne verdien vil bli lagt til søkebetingelsen.
● For referansefelt utføres et søk på feltene som brukes til å danne referansevisningen. Søk i hvert av disse feltene
utføres i henhold til reglene beskrevet ovenfor. Søket bruker ikke felt som brukes til å danne en egendefinert datarepresentasjon.
Settet med betingelser for hvert ord er kombinert "AND".
● For verdier med innledende nuller kan du søke enten i strengen med innledende nuller eller strengen som er spesifisert uten innledende nuller.
● Hvis en dynamisk liste viser en liste over dokumenter eller en dokumenthistorikk, vises listevisningsintervallet som du angir også i området av skjemaet som er reservert for visning av visningsstatus for ønsket dynamisk liste.
● Kommandoen Søk etter gjeldende verdi er ikke tilgjengelig hvis hovedtabellen i den dynamiske listen er valgkriteriet.
● Fante strengfragmenter utheves når de vises i tabellen.
● Bare én søkestreng støttes for én kolonne. Når du legger til et nytt søk for en kolonne som allerede søkes i, vil søkeuttrykket erstattes i stedet for at de to søkene legges sammen.
● Hvis skjemaet ikke har et skjemaelementtilføyelse av skjemaet Søkestrengvisning knyttet til tabellen (skjemaelementtilføyelse Kilde-egenskap) som viser en dynamisk liste, åpner du søkedialogen ved å trykke på Ctrl+F-tastekombinasjonen.


Ris. 7. Søk dialog

Hvis skjemaet inneholder et skjemaelementtilføyelse av skjemaet Søkestrengvisning knyttet til en tabell (skjemaelementaddisjon Kilde-egenskap) som viser en dynamisk liste, bør du bruke Avansert søk-kommandoen for å åpne søkedialogen.
● Når du bruker søkedialogen, må du huske på følgende punkter:
● Åpning av søkedialogen ved hjelp av en hurtigtast fører til at verdien til den gjeldende cellen vises på linjen Hva skal søkes, og verdien for Hvordan søke-bryteren settes til Ved eksakt samsvar.

● Åpning av søkedialogen ved å begynne å skrive en søkestreng direkte i den dynamiske listen fører til at verdien av Hvordan søke-bryteren settes til verdien Ved del av strengen, og den skrevne teksten havner i Hva til søkefeltet.

6. Få dataene vist av en dynamisk liste

Når du bruker dynamiske lister, kan det hende du må utføre ulike handlinger på dataene som vises i den dynamiske listen, med tanke på valgene og søkene som er brukt. Slike handlinger inkluderer: behandle den viste informasjonen, for eksempel sende valgte dokumenter på nytt eller angi noen detaljer for utvalgte objekter, generere en liste over tilgjengelige objekter (med design osv.), for eksempel for utskrift eller lagring i et regnearkdokument.
For å få data som vises av en dynamisk liste, bør du bruke GetExecutableDataCompositionSchema() og
GetExecutableDataCompositionSettings().
Eksempel på mottak av data:

Schema = Elements.List.GetExecutableDataCompositionSchema();
Settings = Items.List.GetExecutableDataCompositionSettings();
LayoutLinker = newDataCompositionLayoutLinker();
LayoutLayout = LayoutComposer.Execute(Scheme, Settings);
CompositionProcessor = newDataCompositionProcessor;
LayoutProcessor.Initialize(LayoutLayout);
OutputProcessor = New OutputProcessorDataCompositionResultInTabularDocument;
ReturnOutputProcessor.Output(CompositionProcessor);

Å få data inn i en verdisamling (tabell eller verdiliste) gjøres på samme måte.
Innhenting av dynamiske listedata på denne måten har en rekke funksjoner som må tas i betraktning når du utvikler applikasjonsløsninger:
● Følgende tabelldesign støttes ikke:
● Vekslende linjefarger;
● Overskriftsbilde;
● Bilde av kjelleren;
● Bunntekst bakgrunnsfarge;
● Bunntekstfarge;
● Bunntekstfont;
● Horisontal posisjon i kjelleren;
● Passordmodus.
● Det betingede utseendet som er spesifisert for et administrert skjema støttes ikke.
● Når du bestiller en hierarkisk tabell i stigende rekkefølge etter et felt av typen Link, plasseres alltid poster som inneholder en tom lenke først.

Plattform 1C:Enterprise 8.2 kan arbeide med mange poster i en databasetabell på en dynamisk måte, det vil si lese data i porsjoner. Tidligere i artikler så vi på mekanismen til dynamiske lister og metoder for å optimalisere arbeidet med dem.

I dag skal vi løse et ikke-standard problem for dynamiske lister. Vi må beregne totalsummen ved å bruke dokumentattributtet "Amount" og vise det i bunnteksten på listen. På samme måte beregner du gjennomsnittsverdien for "Rating"-feltet og viser den også i bunnteksten på den dynamiske listen. Beregningen av de totale feltene må ta hensyn til valget som er satt av brukeren i dokumentlisteinnstillingene.

Hele vanskeligheten ligger i det faktum at en dynamisk liste ikke mottar alle oppføringer på en gang, men mottar dem i porsjoner. Følgelig kan vi ikke umiddelbart få et sammendrag av alle dokumenter som tilsvarer det gjeldende utvalget. Hvordan beregne totalen?

Gjennomføring

Og så, la oss gå videre til å løse problemet. La oss starte med å endre skjemaet, så vil vi beskrive algoritmen for å få de endelige verdiene.

Form og grensesnitt

La oss først lage et dokumentskjema for å vise de resulterende feltene. For å gjøre dette vil vi legge til to strengdetaljer av skjemaet "Vurdering" og "Beløp".

De totale verdiene for dokumentene vil bli registrert i disse detaljene.

For å vise verdiene til detaljer i bunnteksten til en dynamisk liste, må du aktivere det tilsvarende alternativet for det tilknyttede elementet i listeskjemaet (se følgende skjermbilde).

Nå må du bestemme hvilken hendelse resultatene i listebunnteksten skal oppdateres. For enkel utvikling, la oss legge til kommandoen "Oppdater" og det tilsvarende skjemaelementet til kommandopanelet. Når denne kommandoen utføres, vil totalsummene bli oppdatert.

I testkonfigurasjonen, som du kan laste ned fra lenken på slutten av artikkelen, har jeg også lagt til en oppsummerende oppdateringshendelse ved opptak av et dokument. I dette tilfellet brukes skjemavarslingsmekanismen. Vi vil ikke gå nærmere inn på dette.

Algoritme

Den mest problematiske delen gjenstår - du må få de totale verdiene. La oss fortsette som følger: vi vil opprette en forespørsel til databasen for å få verdiene til de endelige feltene i samsvar med utvalget satt i den dynamiske listen. Det er verdt å vurdere at utvalget kan ha en kompleks tilstand fra grupper.

Merk: innstillingene for dynamiske lister (se skjermbilde ovenfor) er basert på mekanismene til datasammensetningssystemet (DCS). Følgelig kan du jobbe med dem på en lignende måte (programmessig legge til, endre, lese, etc.).

Stadiene for å danne en forespørsel for å oppnå resultater er som følger:

1. Vi mottar den første forespørselen om den dynamiske listen.

Som vi kan se, velger forespørselen alle dokumentdetaljer. For å legge til litt mer kompleksitet, la jeg til mitt eget "Rating Level"-felt, generert av "SELECT"-konstruksjonen.

2. Vi danner teksten til forespørselsvilkårene (delen "HVOR") og erstatter den med den opprinnelige forespørselen.

Vi må legge til betingelser i den mottatte kildeforespørselsteksten i samsvar med det konfigurerte dynamiske listevalget.

Prosedyren, avhengig av typen av godkjent utvalgselement (gruppe eller utvalgselement), genererer den tilsvarende betingelsesteksten. Alle forhold i en gruppe er omgitt av parentes, og de som inngår i gruppen er også omgitt av parentes. Betingelsene mellom uttrykk avhenger av den overordnede gruppen (en "AND"-betingelse plasseres mellom de øverste elementene i hierarkiet).

Hvis et element har et bruksflaggsett («Usage»-egenskapen), blir elementet behandlet. Den genererte teksten avhenger også av sammenligningsbetingelsen (Lik, ikke lik, i en liste osv.). Avhengigheten av den genererte betingelsesteksten av typen sammenligning kan sees i følgende funksjon.

En annen interessant funksjon, etter min mening, er "GetFieldTextByView". Det er nødvendig for å erstatte felt som er dannet av spørringsspråkuttrykk i spørringsbetingelsene. Ovenfor la jeg til "Rating Level"-feltet i den opprinnelige forespørselen. Hvis brukeren bruker det i utvalg, må hele uttrykket erstattes i spørringsbetingelsen. Denne funksjonen henter feltteksten fra forespørselen basert på representasjonen. For slike komplekse felt vil den returnere hele teksten i uttrykket.

For flere detaljer om algoritmen, se testkonfigurasjonen vedlagt artikkelen. Nedenfor er et skjermbilde av utvalgsinnstillingene og forespørselsbetingelsene som er generert for dem.

Den genererte betingelsesteksten legges til den opprinnelige dynamiske listeforespørselen. Resultatet av spørringen plasseres i en midlertidig tabell.

3. Vi plasserer den første spørringen i en midlertidig tabell og utfører gruppering etter oppsummeringsfelt med de nødvendige aggregerte funksjonene.

La meg minne deg på at vi må få gjennomsnittsverdien for «Vurdering»-feltet og totalbeløpet for «Beløp»-feltet. Vi har allerede generert en forespørsel som tar hensyn til valgene; alt som gjenstår er å beregne de totale verdiene. Dette gjøres med følgende forespørsel:

Etter å ha utført forespørselen, behandler vi resultatet, returnerer det til klienten og skriver det inn i skjemadetaljene som vi opprettet tidligere. Til syvende og sist fikk vi resultatene vist i bunnteksten på den dynamiske listen (se det første skjermbildet i artikkelen).

Optimalitet av løsningen

Generelt kan denne tilnærmingen ha en negativ innvirkning på ytelsen. For eksempel, hvis programmet beregner totalen uten et sett utvalg i en dynamisk liste, kan antallet valgte poster være enormt (for eksempel over flere år). Som et resultat kan hver oppdatering av resultatene vare i ti (!!!) sekunder. Derfor er det fornuftig å beregne resultatene bare hvis utvalget er etablert. Jeg setter disse betingelsene i en testkonfigurasjon.

I tillegg kan vi bare beregne totalsummene og forespørselen på serversiden. Derfor må du nærme deg serveren på alvor, siden prosedyren for å oppdatere totalsummene kan utføres veldig ofte. Se for deg en kassakvitteringsjournal i en bransjeorganisasjon, hvor det kan legges inn opptil 5 kvitteringer per minutt, og opptil 300 kvitteringer per time. Hver gang et dokument skrives, vil totalsummene oppdateres. Derfor vil det være rimelig å redusere den overførte trafikken ved å bruke prosedyrer utenfor kontekst.

Følgende skjermbilde viser programkoden for å kalle en serverfunksjon utenfor kontekst som returnerer totaler.

Den første parameteren sender det dynamiske listevalget, den andre er en struktur av typen "SelectionFieldNameSelectionFieldValueType". Vær oppmerksom på at den første parameteren i funksjonen oppnås som sin egen verdi. Jeg kan ikke si nøyaktig hvorfor, men hvis du sender valget som en lenke, gir plattformen en feilmelding om at valget ikke kan endres. Feilen ble bare omgått på denne måten.->

Merk: bruk av prosedyrer utenfor kontekst lar deg redusere størrelsen på overført trafikk med flere ganger, siden skjemadata ikke overføres til serveren, i motsetning til kontekstsensitive serverprosedyrer ("&OnServer"-direktivet).

Konklusjon

Avslutningsvis vil jeg si at denne tilnærmingen til å beregne totaler i en dynamisk liste er feil fra et utviklingsmetodikksynspunkt. Det vil være riktig å få summen etter registre. For eksempel, i sjekkjournalen, igjen, kan vi få pengebeløpet i gjeldende kasseapparat enten fra dokumenter eller fra det tilsvarende akkumuleringsregisteret.

I tillegg vil bruk av akkumuleringsregistre tillate deg å beregne totaler uten å ta hensyn til valg, siden systemet fungerer optimalt med allerede beregnede totaler for tidligere måneder.

Likevel foregår metoden beskrevet i artikkelen ved løsning av problemer.

Filer for nedlasting:

I prosessen med å fullføre konfigurasjoner, møter hver 1C-programmerer dynamiske lister.
En dynamisk liste er et grensesnittobjekt som brukes til å vise ulike lister over databaseobjekter eller ikke-objektdata - registeroppføringer.
For eksempel brukes en dynamisk liste til å vise en liste over elementer:

For å demonstrere egenskapene til en dynamisk liste, la oss lage ekstern behandling og legge til hovedskjemaet. La oss legge til et nytt attributt til skjemaet med typen "Dynamisk liste". La oss gå inn på egenskapene og se hva som er der.
Vi er interessert i egenskapen "Egendefinert forespørsel". Aktivering av den vil vise oss alle egenskapene til en dynamisk liste. Vi vil kunne skrive en forespørsel ved å bruke nesten alle funksjonene til 1C: Enterprise-systemspørringsspråket. Merk av i boksen og klikk på "Åpne"-koblingen:

Som standard vil listen vår vise en liste over varer med totalsaldo for alle varehus. For å implementere en slik liste, legg til følgende spørring:


Som hovedtabell vil vi velge "Directory.Nomenclature", dette vil tillate oss å jobbe med en dynamisk liste, som med en liste over nomenklatur - legg til, endre, merk katalogelementer for sletting. Installering av hovedtabellen gjør det også mulig å lese data dynamisk - dette betyr at valget vil bli gjort i porsjoner etter behov.
Deretter må vi lage skjemaelementer for listen vår:

Hvis vi prøver å kjøre behandlingen vår i dette skjemaet, får vi en feilmelding:


For å eliminere det, må du angi en verdi for parameteren "Periode". For å gjøre dette kan du bruke "SetParameterValue"-metoden i "Parameters"-samlingen i den dynamiske listen. Metoden tar to parametere:
. "Parameter" - Type: String; DataCompositionParameter. Navnet på parameteren eller datasammensetningsparameteren hvis verdi du vil angi;
. "Verdi" - Type: Vilkårlig. Verdien som skal angis.
Kan kalles i "OnCreateOnServer"-behandleren av skjemaet:

Har du spørsmål eller trenger hjelp fra en konsulent?


Vi vil gi brukeren mulighet til å endre perioden for mottak av saldo. For å gjøre dette, legg til attributtet og skjemaelementet "Dato" knyttet til det:


I «OnChange»-behandleren til «Date»-skjemaelementet vil vi kalle «SetParameterValue»-metoden, og overføre verdien til det tilknyttede attributtet som verdien. På lignende måte, la oss endre "Når du oppretter på server"-prosedyren i skjemaet. Siden metoden er tilgjengelig på klienten, er det ikke nødvendig å ringe serveren:


Nå når datoen endres, blir saldoene automatisk oppdatert:




La oss anta at brukere ønsker å se enten gjeldende saldoer eller planlagte kvitteringer. La oss vurdere et av implementeringsalternativene. La oss legge til et skjemaattributt for boolsk type og en tilhørende bryter:


Når du endrer verdien på bryteren, vil vi endre teksten i forespørselen. For å gjøre dette, bruker vi hendelsesbehandleren "Ved endring" for skjemaelementet "Vis mengde ved mottak". Vi må endre "QueryText"-egenskapen til den dynamiske listen avhengig av verdien til attributtet. Siden denne egenskapen ikke er tilgjengelig på klienten, må en serverprosedyre kalles:


Resultatet av endringene: