Standardni parametar &Razdoblje i problemi u korištenju. Standardni parametar & Period i problemi u korištenju parametara virtualnih okretaja stola od 1 s

Prilikom organiziranja uzoraka u stvarnim problemima, u velikoj većini slučajeva odabir podataka organiziran je prema određenim kriterijima.

U slučaju kada se odabir vrši iz stvarne tablice, nema poteškoća. Podaci se obrađuju potpuno trivijalno:

U slučaju kada je izvor u zahtjevu virtualni stol, situacija postaje nešto kompliciranija.


Upitni jezik vam omogućuje da nametnete uvjet za odabir iz virtualnih tablica na dva načina: u klauzuli WHERE i korištenjem parametara virtualne tablice. Obje metode će dovesti do istog rezultata (s iznimkom nekih specifičnih slučajeva), ali su, unatoč tome, daleko od ekvivalenta.

Već znamo da se virtualne tablice nazivaju virtualnim jer se zapravo ne nalaze u bazi podataka. Formiraju se tek u trenutku kada im se uputi zahtjev. Unatoč tome, nama (odnosno onima koji pišu upit) zgodno je virtualne tablice smatrati stvarnim. Što će se dogoditi u sustavu 1C Enterprise 8 kada upit koji smo sastavili i dalje pristupa virtualnoj tablici?

U prvom koraku sustav će izgraditi virtualnu tablicu. U drugom koraku, zapisi će biti odabrani iz rezultirajuće tablice koji zadovoljavaju uvjet naveden u klauzuli WHERE:
Jasno je vidljivo da u finalni uzorak neće biti uključeni svi zapisi iz virtualne tablice (a samim tim i iz baze podataka), već samo oni koji zadovoljavaju zadano stanje. A preostali zapisi jednostavno će biti isključeni iz rezultata.

Dakle, sustav neće raditi samo beskoristan posao, već dvostruko beskoristan posao! Najprije će se resursi potrošiti na izradu virtualne tablice na temelju nepotrebnih podataka (na slici su označeni kao “područja podataka A i B”), a zatim će se raditi na filtriranju tih podataka iz konačnog rezultata.

Je li moguće odmah, u fazi konstruiranja virtualne tablice, prestati koristiti nepotrebne podatke? Ispostavilo se da je to moguće. To je upravo ono za što su dizajnirani parametri virtualne tablice:

Parametriranjem virtualne tablice odmah ograničavamo količinu podataka koji će biti obrađeni upitom.

Koja je razlika između vrijednosti parametra virtualne tablice "Metoda dodavanja"?
Kada je Metoda zbrajanja postavljena na "kretanja", vraćaju se samo ona razdoblja u kojima je bilo kretanja. Kada se postave "Kretanja i granice razdoblja", tada će se gornjim kretanjima dodati 2 zapisa: kretanja na početku i kraju razdoblja navedenog u parametrima VT. Polje "Matičar" bit će prazno za ova 2 zapisa.

Informacije preuzete sa stranice

Registri akumulacije u sustavu 1C:Enterprise dijele se na dvije vrste: akumulacijski registri ostaci i akumulacijskim registrima broj okretaja u minuti.

Vrsta registra odabire se prilikom kreiranja u konfiguratoru

Kao što naziv govori, jedni su namijenjeni dobivanju stanja na određeni datum, a drugi su namijenjeni dobivanju prometa za odabrano razdoblje. Ovisno o vrsti akumulacijskog registra, platforma 1C:Enterprise generira različite skupove virtualnih tablica. U ovom ćemo članku pogledati rad s virtualnim tablicama akumulacijskih registara. Da bismo to učinili, napravit ćemo registar za akumuliranje stanja - Proizvodi Ostaci i registar akumulacije okretaja - Promet proizvoda.

Sada pogledajmo koje virtualne tablice platforma nudi za svaki od ovih registara.

Registar akumulacije okretaja

Radi jasnoće, otvorimo i vidimo koje su tablice dostupne za registar Promet proizvoda. Ovo je tablica samog registra - Promet proizvoda, koja fizički postoji u bazi podataka, i jedna virtualna tablica - ProizvodiPromet.Promet

Sa standardnom tablicom sve je jasno. Pogledajmo pobliže onaj virtualni.

Virtualni stol Promet

Ova tablica vam omogućuje da dobijete promet resursa u smislu dimenzija. U našem slučaju imamo dvije dimenzije: Skladište I Proizvod. I jedan izvor - Količina

Neka naš registar ima sljedeće unose

Vratimo se dizajneru upita i započnimo jednostavnim odabirom iz tablice ProizvodiPromet.Promet sva polja

U skladu s tim, zahtjev će izgledati ovako:

SELECT ProizvodiPrometPromet.Skladište, ProizvodiPrometPromet.Proizvod, ProizvodiPrometPromet.KoličinaPromet FROM RegistarAkumulacija.ProizvodiPromet.Promet(,) AS ProizvodiPrometPromet

Rezultat upita izgleda ovako:

Odnosno, dobili smo promet u robi i skladištu za cijelo vrijeme. Pretpostavimo da nas skladišta ne zanimaju i da želimo ostvariti promet samo u smislu robe.

Da bismo to učinili, isključujemo dimenziju iz zahtjeva Skladište

SELECT ProductsTurnoverTurnover.Product, ProductTurnoverTurnover.QuantityTurnover FROM RegisterAccumulation.ProductsTurnover.Turnover(,) AS ProizvodiTurnoverTurnover

i kao rezultat ostat ćemo samo dvije linije

Ali u pravilu nema potrebe dobivati ​​promet za cijelo vrijeme postojanja registra. Uglavnom, potrebni su za određeno razdoblje: mjesec, kvartal, godinu itd. Osim toga, obično su potrebni odabiri po dimenzijama (Proizvod, Skladište). To se postiže korištenjem parametri virtualne tablice. Praktično je ispuniti parametre iz konstruktora. Po gumbu Mogućnosti virtualnog stola Otvara se dijaloški okvir u koji možemo unijeti sve što nam je potrebno:

Nakon toga, naš originalni zahtjev će imati sljedeći oblik

SELECT RobaPrometPromet.Skladište, RobaPrometPromet.Proizvod, RobaPrometPromet.KoličinaPromet FROM RegistarAkumulacija.RobaPromet.Promet(&Početak razdoblja, &Kraj razdoblja, Skladište = &Skladište) AS RobaPrometPromet

Kao što vidimo, razlika je u tome što se u zagradi iza naziva virtualne tablice nalaze parametri koje je potrebno ispuniti prije izvršenja upita.

Oni koji tek počinju raditi s virtualnim tablicama često su u iskušenju da odabir postave na uobičajeni način umjesto pomoću parametara:

FROM RegisterAccumulations.ProductsTurnover.Turnover(,) HOW ProizvodiTurnoverTurnover WHERE ProizvodiTurnoverTurnover.Warehouse = &Warehouse

Prilikom ispunjavanja parametara koji su nam promakli Periodičnost. Otkrijmo popis i iz mase moguće opcije izaberimo Mjesec. Sve ostale parametre ćemo ukloniti kako ne bi došlo do zabune.

Nakon toga primjećujemo da se polje pojavljuje u poljima tablice Razdoblje.

Dodavanjem u odabrana polja dobivamo sljedeći tekst zahtjeva:

SELECT ProizvodiPrometPromet.Razdoblje, ProizvodiPrometPromet.Skladište, ProizvodiPrometPromet.Proizvod, ProizvodiPrometPromet.KoličinaPromet FROM RegistarAkumulacija.ProizvodiPromet.Promet(, Mjesec,) AS ProizvodiPrometPromet

Izvršavamo zahtjev:

Tako unutar odabranog vremenskog intervala okretaje možemo podijeliti na manje intervale sukladno odabranoj frekvenciji.

Registar akumulacije stanja

Baš kao i s obrnutim registrom, pogledajmo u dizajneru upita koje su virtualne tablice dostupne za registar akumulacije stanja

Kao što vidite, tri virtualne tablice dostupne su za registar akumulacije stanja: Revolucije, Ostaci hrane, Ostaci i obrti. Razmotrimo svaki od njih zasebno.

Virtualni stol Promet

Unatoč tome što je tip registra Ostaci hrane, ipak možemo ostvariti promet od njega. Osim toga, ovdje imamo dva dodatna izvora: Dolazak I Potrošnja

Podsjećam da se prilikom upisa u bilančni registar iskazuje vrsta akumulacijskog kretanja (prihodi ili rashodi), dok se za prometni registar ne iskazuje vrsta kretanja. Stoga ovdje imamo dodatni bonus u obliku mogućnosti primanja ne samo ukupnog prometa za razdoblje, već i prihoda i troškova zasebno. No, naravno, ako metapodaci sadrže obrnuti registar sa sličnim skupom mjerenja, tada ga je bolje koristiti za dobivanje prometa. Općenito, rad s ovom virtualnom tablicom sličan je radu s virtualnom tablicom Revolucije pregovarački registar o kojem je gore bilo riječi.

Stanja virtualne tablice

Ova se tablica koristi za dobivanje stanja resursa po dimenzijama. U parametrima tablice možemo odrediti datum za koji primamo stanja i postaviti odabire:

Pogledajmo mali primjer. Imamo sljedeće unose u registar:

Odaberimo sva dostupna polja i postavimo kraj lipnja kao datum primanja stanja. Nećemo birati na temelju mjera. Tada će tekst zahtjeva izgledati ovako:

SELECT ProductsRemainingsRemainings.Warehouse, ProductsRemainingsRemainings.Product, ProductsRemainingsRemainings.QuantityRemaining FROM RegisterAccumulations.ProductsRemainings.Remainings(&DateRemainings,) AS ProductsRemainingRemainings

I nakon što ga izvršimo dobivamo ovaj rezultat

Stanja i promet virtualnog stola

Ova tablica kombinira dva prethodno razmotrena i omogućuje vam dobivanje prometa za odabrano vremensko razdoblje, kao i stanja na početku i kraju razdoblja. Također možete postaviti odabir.

Korištenje ove tablice može biti opravdano kada u jednom izvješću trebate istovremeno dobiti i promet i stanja na početku i na kraju razdoblja. U drugim slučajevima ne biste trebali zlorabiti njegovu upotrebu.

Prilikom organiziranja uzoraka u stvarnim problemima, u velikoj većini slučajeva odabir podataka organiziran je prema određenim kriterijima.

U slučaju kada se odabir vrši iz stvarne tablice, nema poteškoća. Podaci se obrađuju potpuno trivijalno:

U slučaju kada je izvor u upitu virtualna tablica, situacija postaje nešto kompliciranija.

Upitni jezik vam omogućuje da nametnete uvjet za odabir iz virtualnih tablica na dva načina: u klauzuli WHERE i korištenjem parametara virtualne tablice. Obje metode će dovesti do istog rezultata (s iznimkom nekih specifičnih slučajeva), ali su, unatoč tome, daleko od ekvivalenta.

Već znamo da se virtualne tablice nazivaju virtualnim jer se zapravo ne nalaze u bazi podataka. Formiraju se tek u trenutku kada im se uputi zahtjev. Unatoč tome, nama (odnosno onima koji pišu upit) zgodno je virtualne tablice smatrati stvarnim. Što će se dogoditi u sustavu 1C Enterprise 8 kada upit koji smo sastavili i dalje pristupa virtualnoj tablici?

U prvom koraku sustav će izgraditi virtualnu tablicu. U drugom koraku, zapisi će biti odabrani iz rezultirajuće tablice koji zadovoljavaju uvjet naveden u klauzuli WHERE:


Jasno je vidljivo da konačni uzorak neće uključivati ​​sve zapise iz virtualne tablice (a samim tim i iz baze podataka), već samo one koji zadovoljavaju zadani uvjet. A preostali zapisi jednostavno će biti isključeni iz rezultata.

Dakle, sustav neće raditi samo beskoristan posao, već dvostruko beskoristan posao! Najprije će se resursi potrošiti na izradu virtualne tablice na temelju nepotrebnih podataka (na slici su označeni kao “područja podataka A i B”), a zatim će se raditi na filtriranju tih podataka iz konačnog rezultata.

Je li moguće odmah, u fazi konstruiranja virtualne tablice, prestati koristiti nepotrebne podatke? Ispostavilo se da je to moguće. To je upravo ono za što su dizajnirani parametri virtualne tablice:


Parametriranjem virtualne tablice odmah ograničavamo količinu podataka koji će biti obrađeni upitom.

Koja je razlika između vrijednosti parametra virtualne tablice "Metoda dodavanja"?
Kada je Metoda zbrajanja postavljena na "kretanja", vraćaju se samo ona razdoblja u kojima je bilo kretanja. Kada se postave "Kretanja i granice razdoblja", tada će se gornjim kretanjima dodati 2 zapisa: kretanja na početku i kraju razdoblja navedenog u parametrima VT. Polje "Matičar" bit će prazno za ova 2 zapisa.

U članku je opisana fizička implementacija virtualne tablice konfiguracijskih stanja koja radi u klijent-poslužiteljskom načinu rada na primjeru korištenja MS SQL Server DBMS-a.

Primjenjivost

U članku se govori o platformi 1C:Enterprise verzije 8.3.5.1383. U trenutna verzija platforma, moguće su neke izmjene u tekstu opisanom u materijalu, T-SQL upiti, koji se izvršava na strani DBMS poslužitelja.

Uređaj virtualne tablice stanja

Razmotrimo u kakvu se vrstu DBMS upita upit transformira korištenjem virtualne tablice akumulacijskih stanja registara. Na primjer, razmatrat će se sljedeći tekst zahtjeva:

BIRAJTE
CommodityInventoryRemains.Product,
Robni Inventar Ostatak. Skladište,
CommodityInventoryRemaining.QuantityRemaining
IZ
Registar Akumulacije.Zalihe.Ostaci(&Datum, Skladište = &Skladište) KAKO
Robne ZaliheOstaci

Prvo, koristeći metodu globalnog konteksta GetDatabaseStorageStructure() dobivamo popis tablica baze podataka u kojima su pohranjeni podaci akumulacijskog registra “Robne zalihe”:

Sastav polja u glavnoj tablici akumulacijskog registra i tablici ukupnih iznosa dat je u nastavku:

Pohrana ukupnih iznosa za ovaj registar konfigurirana je u načinu rada "1C:Enterprise 8" na sljedeći način:

Ispunimo parametre u predmetnom zahtjevu na sljedeći način:


Platforma pretvara tekst zahtjeva u sljedeći zahtjev koji će se izvršiti na DBMS poslužitelju:

ODABERI
Q_000_T_001.Fld82,
Q_000_T_001.Fld83,
Q_000_T_001.Fld84Balance
IZ
(SELECT Fld82,
Fld83,

IZ
(SELECT Fld82,
Fld83,
SUM (Fld84 ) KAO Fld84Balance
IZ AccumRgT85
WHERE Period = DATETIME (3999, 11, 1)
I ((Fld83 = ))
AND(Fld84<>0 ) I (Fld84<> 0 )
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<> 0
UNIJA SVE
SELECT Fld82,
Fld83,
SUM (CASE WHEN RecordKind = 0 THEN – Fld84 ELSE Fld84 END ) AS Fld84Balance
IZ AccumRg81
WHERE Razdoblje >= DATETIME (2012, 9, 1)
I Točka< DATETIME (3999 , 11 , 1 )
I Aktivan
I ((Fld83 = 9:))
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<>0) T
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<>0 ) Q_000_T_001

Razmotrimo detaljnije primljeni zahtjev.

Prvo, prvi upit u spajanju odabire podatke iz rezultirajuće tablice AccumRgT85. Ukupni iznosi se dobivaju na datum pohrane trenutnih ukupnih iznosa (01.11.3999), dodatni uvjet se primjenjuje na polje Skladište (budući da je takav uvjet korišten u parametrima virtualne tablice). Dodatno se provodi provjera kako bi se osiguralo da rezultat ne sadrži retke s nula ostataka.

Imajte na umu da se grupiranje vrši prema dimenzijama odabranim u tekstu zahtjeva. Zbog toga nije potrebno dodatno grupirati po dimenzijama u tekstu u upitnom jeziku 1C:Enterprise.

Drugi upit za spajanje koristi tablicu kretanja registra AccumRg81. Ovisno o vrsti kretanja (ako je RecordKind 0, onda je to prihod, inače je rashod), u izraz se umeće znak. Platforma odabire podatke za razdoblje od datuma navedenog kao parametar virtualne tablice do datuma pohrane trenutnih ukupnih iznosa (11/01/3999).

Osim toga, odabrani su samo aktivni zapisi; polje Skladište mora biti jednako navedenoj vrijednosti. Kao i kod prvog upita za pridruživanje, ovo također grupira prema odabranim dimenzijama i odbacuje zapise s nula vrijednosti resursa.

Ako se koristi MS SQL Server DBMS i pomak datuma je postavljen na 2000 za bazu podataka, tada će svi datumi biti pohranjeni s navedenim pomakom, tj. umjesto 01.11.3999 vidjet ćete 01.11.5999.

Ako onemogućite trenutne ukupne iznose za akumulacijski registar, platforma će prvo primiti najnovije ukupne iznose izračunate na datum raniji od navedenog u parametru Period virtualne tablice.

Zatim će se, slično, ti podaci nadopuniti iz tablice kretanja, ali samo za razdoblje od datuma zadnjih rezultata do razdoblja virtualne tablice.

ODABERI
Q_000_T_001.Fld82,
Q_000_T_001.Fld83,
Q_000_T_001.Fld84Balance
IZ
(SELECT Fld82,
Fld83,
SUM (Fld84Balance ) KAO Fld84Balance
IZ
(SELECT Fld82,
Fld83,
SUM (Fld84 ) KAO Fld84Balance
IZ AccumRgT85
WHERE Period = DATETIME (2012, 4, 1)
I ((Fld83 = 9:))
AND(Fld84<> 0 )
AND(Fld84<> 0 )
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<> 0
UNIJA SVE
SELECT Fld82,
Fld83,
SUM (CASE WHEN RecordKind = 0 THEN Fld84 ELSE – Fld84 END ) AS Fld84Balance
IZ AccumRg81
WHERE Razdoblje >= DATETIME (2012, 4, 1)
I Točka< DATETIME (2012 , 9 , 1 )
I Aktivan
I ((Fld83 = 9:))
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<>0) T
GROUP BY Fld82 , Fld83
IMAJUĆI Fld84Balance<>0 ) Q_000_T_001

Obratite pažnju na sljedeći uvjet u tijelu zahtjeva.