En funktion för att få en ögonblicksbild av de senaste posterna i informationsregistret. Funktion för att få en del av de senaste posterna i informationsregistret Del av den senaste från informationsregistret 1c dokument

/
Genomförande av databehandling

Upplösning av summor för periodiska informationsregister

Tillämpningsomfång: hanterad applikation, mobil app, en vanlig applikation.

1.1. För periodiska informationsregister rekommenderas det att tillåta totaler om alla följande villkor är uppfyllda:

  • en stor mängd data förväntas i registret (det är till exempel motiverat för ett register med artikelpriser; men det är inte vettigt för ett register med växelkurser);
  • konfigurationen tillhandahåller frekvensfrågor till delar av den senare vid den aktuella tidpunkten och/eller till delar av den förra för att erhålla aktuella data (dvs. när perioden inte är specificerad i parametrarna för virtuella tabeller Slice of the First Och Slice of the Last);
  • medan de återstående villkoren för virtuella tabeller Slice of the First Och Slice of the Lastär endast inställda på mätvärden (och separatorer i läget Självständigt och gemensamt);
  • registerdataåtkomstbegränsningar använder endast dimensioner (och avgränsare som är i läge Självständigt och gemensamt).

För en fullständig lista över alla villkor när frågor använder informationsregistersummor, sedokumentation för 1C:Enterprise-plattformen.

Till exempel om konfigurationen inkluderar ofta körda frågor till registret PriserNomenklaturer för att få aktuella artikelpriser:

Välj föremål. Artikel AS Artikel, Prisnomenklatur. Pris AS Pris, . . . FRÅN katalog. Nomenklatur AS Nomenklatur LEFT CONNECTION Register of Information. PriserNomenklaturer. SliceLast(, PriceView = &Typ av priser) HUR PriserNomenklaturer Programvarupriser Nomenklatur. Nomenklatur = Nomenklatur. Länk . . .

sedan, med förbehåll för alla andra villkor som anges ovan, fastställande av egendomen Tillåt totaler: en del av de senaste kommer avsevärt att påskynda exekveringen av sådana frågor, på grund av att valet kommer att utföras direkt från ytterligare tabeller, som endast lagrar de sista värdena (för att klippa de sista) och de första värdena (för att klippa av första).

1.2. Dessutom bör du överväga alternativa alternativ att revidera förfrågningar till registret så att dessa villkor uppfylls.

Till exempel om i vissa fall uppgifterna i registret PriserNomenklaturer registreras på ett framtida datum, och vid val av varor till detta register exekveras alltid en förfrågan för det aktuella datumet (datumet anges uttryckligen i den virtuella tabellparametern Slice of the Last), kommer resultaten inte att påskynda exekveringen av sådana frågor. Eftersom totalsummorna endast byggs för de första och sista posterna i registret.

Men om du, när du öppnar produktvalsformuläret, analyserar om det finns registrarer med ett framtida datum, och om det inte finns några, kör du en annan fråga för en del av den senare utan att ställa in datumet, då kommer en sådan fråga att fungera snabbare .

2. I alla andra fall bör summor inte tillåtas för periodiska informationsregister. Först av allt, om

  • oftast (alltid) görs frågor till de virtuella tabellerna i det första/sista periodiska registret med information för en viss period (till exempel för datumet för dokumentet).
  • under förhållanden för virtuella tabeller Slice of the First Och Slice of the Last Oftast (alltid) används underfrågor och kopplingar (anrop "genom en punkt" till fälten i relaterade tabeller). Till exempel, i det här fallet:

3. Det finns inget behov av att tillhandahålla en separat mekanism för omräkning av totaler i konfigurationen, eftersom uppdateringen av totaltabellerna utförs automatiskt varje gång en uppsättning poster skrivs till registret.

: Slice of the First Och Slice of the Last Låt oss överväga att arbeta med dessa virtuella tabeller med 1C. Används mycket oftare Slice of the Last, så låt oss börja med det.

En del av den senaste låter dig få den sista posten i informationsregistret för ett angivet datum i samband med mätningar. För den sista (första) segmenttabellen är det möjligt att ange två parametrar inom parentes, separerade med kommatecken. Den första parametern innehåller datumet då skivan görs (om parametern inte är specificerad görs skivan på det aktuella datumet). Den andra parametern är ett villkor i 1C frågespråk och låter dig ställa in olika val. Som regel används mått i dessa urval. Allt detta låter ganska vagt, så det är omöjligt att göra utan ett exempel.
Så låt oss ha ett periodiskt register över information Pris som lagrar priser efter produkt och leverantör. Registrets frekvens är dag.

Registret innehåller följande poster

Till att börja med kommer vi att få en del av den senare utan att använda parametrar genom att utföra följande begäran:

VÄLJ PriceSliceLast.Period AS Period, PriceSliceLast.Product AS Product, PriceSliceLast.Supplier AS Supplier, PriceSliceLast.Amount AS Amount FROM Register Information.Price.SliceLast AS PriceSliceLast

Eftersom parametrarna inte är specificerade utförs skivan på det aktuella datumet - 2017-02-01. Som ett resultat får vi följande tabell

Här ser vi att kombinationen av dimensioner Produkt + Leverantör är unik, d.v.s. För varje kombination av registermätningar togs posten med maxdatum, och registreringsdatumet är mindre än eller lika med det aktuella datumet.

Låt oss säga att vi måste göra samma sak, men vi vill få poster med ett datum som är mindre än eller lika med 2017-01-15. För att göra detta måste du ändra raden med den senaste segmenttabellen i begäran enligt följande

FRÅN RegisterInformation.Price.SliceLast(&CutDate,) AS PriceSliceLast

Innan du utför begäran måste du naturligtvis skicka en parameter till den &CutDate. Nu kommer frågeresultatet att se ut så här

Och slutligen, föreställ dig att vi behöver få en ögonblicksbild av de senaste för samma datum med villkoret att vi har varorna Penna och leverantören Pappersvaror. För att göra detta, ange den andra parametern i begäran

FRÅN RegisterInformation.Price.Last Cut(&CutDate, Product = &Product AND Supplier = &Supplier) AS PriceLast Cut

Som ett resultat får vi bara ett rekord

För att undvika att gå vilse inom alla dessa parenteser och kommatecken är det bättre att använda en frågebyggare. Jag ska visa dig använda den sista begäran som exempel.

Efter att ha valt en tabell med en del av de senaste i frågedesignern måste du klicka på knappen Virtuella bordsalternativ och skriv i fönstret som öppnas

Det är inte svårt att gissa att för den första skivan är driftprincipen densamma, förutom att den första posten efter klippdatumet väljs.

I testkonfiguration Vi har ett periodiskt informationsregister "PriceNomenclature" med följande källdata:

Figuren visar också strukturen för registermetadata. Som vi kan se innehåller registret dimensionen "Produkt" med referenstypen "Produkter", såväl som den numeriska resursen "Pris" och attributet "OldPrice".

Låt oss säga att vi i en rapport behöver få en del av de senaste posterna för produkter och deras priser med villkoret att det gamla priset är mindre än eller lika med 50.

Två förfrågningsalternativ

Jag ska genast säga att vi kommer att överväga de korrekta och felaktiga alternativen. Låt oss börja med det senare. Detta är ett misstag som nybörjarprogrammerare ofta gör. Och så, följande fråga skrevs för rapporten:

Request = Ny begäran; Begäran. Text = " VÄLJ | | | | | FRÅN | Register över information. PriserNomenklaturer. Del av det senaste HUR PriserNomenklatur Del av det senaste|VAR | PriserNomenklaturSliceSenaste. Gammalt pris< = 50 " ;

Var uppmärksam på tillståndet i avsnittet "VAR". Detta är det största misstaget! Den här frågan kommer inte att returnera en enda post, och här är anledningen: när du använder virtuella tabeller, i vårt fall "Last Slice", hämtas data först från databasen enligt villkoren som beskrivs i virtuellt bord, och sedan utförs de åtgärder som beskrivs i förfrågningstexten (grupperingar, villkor i avsnittet "WHERE", sortering, etc.).

Därför, i vårt exempel, returnerar begäran inget resultat. Först får han en bit av den senare, och först sedan ställer han in villkoret på attributet "Old Price". Så här ser det ut i diagrammet:

För att lösa problemet korrekt måste villkoret för "Old Price"-attributet överföras till villkoren för den virtuella tabellen. Så här kommer den korrekta förfrågningstexten att se ut:

Request = Ny begäran; Begäran. Text = " VÄLJ PriserNomenklaturSliceSenaste. Period, PriserNomenklaturSliceSenaste. Produkt, PriserNomenklaturSliceSenaste. Pris, PriserNomenklaturSliceSenaste. Gammalt pris FRÅN Register över information. PriserNomenklaturer. SliceLast(, OldPrice< = 50 ) HUR PRISERNomenklaturSliceSenast"

Nu kommer begäran att få korrekt information, eftersom en del av de senaste priserna kommer att tas emot med hänsyn till villkoret för attributet "OldPrice".

resultat

Det bör förstås att ovanstående gäller alla fall av användning av virtuella tabeller i frågor (för ackumuleringsregister, redovisningsregister, uppgifter etc.).

Detta innebär också huvudregeln för att använda virtuella tabeller: "när du använder en virtuell tabell, se till att ställa in urvalsparametrarna direkt i den virtuella tabellen, annars kommer frågan att ta emot onödiga data, som sedan kommer att användas för urval."

Ibland behöver man använda en fråga för att få data för flera datum samtidigt från ett periodiskt informationsregister. Ett typiskt exempel är att arbeta med växelkurser. Låt oss överväga en algoritm för att lösa detta problem med hjälp av ett exempel.

Formulering av problemet

Ett dokument "Försäljning av varor och tjänster" har skapats i databasen, i vars rubrik finns attributet "Valuta". Begäran kräver att varje dokument erhåller den aktuella växelkursen från rubriken på dokumentets datum. Valutakurser lagras i det periodiska informationsregistret "Valutakurser".
En direkt lösning på detta problem kan vara en fråga i en slinga: att hämta alla dokument med deras datum och valutor och, i provet, komma åt den virtuella tabellen med en del av det senaste registret "Valutakurser". Men eftersom en begäran i en loop är "dålig", låt oss försöka implementera uppgiften med en begäran.

Lösning

För att lösa problemet kommer vi att använda det faktum att tabellerna i frågan kan anslutas inte bara för jämlikhet mellan områden.

VÄLJ Försäljning av varor och tjänster. Länk, Försäljning av varor och tjänster. Valuta, MAXIMUM (Valutakurser. Period) SOM Period PLATS I TPerioder Inställningar Priser FRÅN Dokument. Försäljning av varor och tjänster HUR Försäljning av varor och tjänster VÄNSTER ANSLUTNING Informationsregister Valutakurser AS Valutakurser PÅ Försäljning av varor tjänstemän.Valuta = Valutakurser.Valuta och försäljning av varorTjänster.Datum >= Valutakurser.Period GROUP Programvara Försäljning av varor och tjänster Länk, försäljning av varor och tjänster Valuta; ////////////////////////////////////////////// ////////////////////////// SELECT VTPeriodsSetting Rates.Link, VTPeriodsSetting Rates.Currency, RatesCurrency.Rate FROM VTPeriodsSetting Rates AS VTPeriodsSetting Rates.Link, VTPeriodsSetting Rates.Currency, RatesCurrency.Rate FROM VTPeriodsSetting Rates AS VTPeriodsSetting Rates. Valutakurser AS Valutakurser PÅ VTPeriodsRate Settings.Period = Valutakurser.Period OCH VTPeriodsRate Settings.Currency = Valutakurser.Valuta

Förfarande för begäran:

  1. Erhålla perioden för inställning av växelkursen för varje dokument. Dokumenten är kopplade till den FYSISKA tabellen "Valutakurser". Här bör du vara uppmärksam på anslutningsvillkoren. Valutorna ska vara lika, och dokumentdatumet >= perioden för informationsregistret.
    Som ett resultat av en sådan anslutning, för varje dokument, kommer en uppsättning rader att erhållas som uppfyller villkoret: alla register över växelkurser för dokumentets valuta, upprättade senast vid dokumentets datum.
    Det sista steget är att gruppera raderna för att erhålla den maximala prisperioden. Som ett resultat kommer den nödvändiga perioden för att ställa in växelkursen för den önskade valutan för varje dokument att erhållas (det maximala datumet för inställning av växelkursen, men inte mer än datumet för dokumentet). Resultatet placeras i den tillfälliga tabellen VTPeriodsSettingRates.
  2. Att få en kurs. Den temporära tabellen VTPeriodsSetting Rates är kopplad till den FYSISKA tabellen "Currency Rates". Anslutningen sker i enlighet med dokumentets valuta och kursinställningsperioden som definieras i den andra temporära tabellen.