Pogreška u izračunu stanja u sustavu pohrane i njezina softverska korekcija na primjeru univerzalnog izvješća. Neispravan obračun stanja kod korištenja SKD 1S SKD početna i završna stanja

Još jedna uobičajena pogreška pri izradi izvješća o sustavima kontrole pristupa za 1C poduzeće je da su početna i završna stanja u virtualnim tablicama akumulacijskih registara pogrešno izračunata. Na primjer, napravimo jednostavno izvješće koje će prikazati stanja i kretanja u registru GoodsInWarehouses. Njegov zahtjev će izgledati ovako:

Također ćemo stvoriti jednostavne varijante postavki:

Kao rezultat dobivamo sljedeće izvješće:

Imate pitanje ili trebate pomoć konzultanta?

Jer Nigdje nismo naveli početak i kraj razdoblja, izvješće bi trebalo prikazati podatke od početka vođenja baze podataka. Ali u našem skladištu i grupama artikala postoje početna stanja različita od nule. Lako je razumjeti da su podaci prikazani netočno, jer... Na početku održavanja baze podataka ne bi trebalo biti nikakvih stanja. Iako je sam zahtjev ispravan.

Činjenica je da ACS ima vlastiti mehanizam za izračun stanja. Za njegov ispravan rad potrebno je jednoznačno odrediti položaj snimača na vremenskoj osi. U ovom slučaju, samo je veza prisutna u odabiru, tako da sustav izgleda to ne može učiniti. Kako biste izbjegli ovakvo ponašanje sustava kontrole pristupa, morate odabrati polje PeriodSecond u zahtjevu. U tom će slučaju sustav ispravno izračunati stanja:

Zapamtite da polja s ulogom "Točka" imaju potvrdni okvir "Dodatno". A ako se iz nekog razloga ukloni iz polja PeriodSecond, izvješće će se vratiti na netočnu verziju. Za ispravan izračun stanja morate imati označeni potvrdni okvir "Dodatno" u ulozi ili prisutnost polja u odabranim poljima izvješća na razini varijante.

Ne znam koliko se već ljudi susrelo s greškom izračuna početnih i završnih stanja po grupiranjima. Osobno sam imao “sreću”, više puta. Razlog, kako sam uspio doznati, leži u pogrešnim postavkama podatkovnih polja ACS-a, čije važnosti mnogi početnici (i manje) programeri još nisu u potpunosti svjesni.

Kada se ACS skup podataka kreira automatski na temelju upita, problemi obično ne nastaju jer sama platforma ispravno ispunjava postavke polja na temelju teksta zahtjeva. Ali postoje situacije kada se postavke podatkovnog polja ne popunjavaju automatski (npr. koristite vanjski izvor podataka), a izvorni podaci sadrže kretanja sa stanjima i prometima.

Ako se prije niste susreli s ovim problemom, da biste bolje razumjeli njegovu bit, predlažem da ga sami reproducirate pomoću univerzalnog izvješća (temeljenog na metapodacima). Pokrećemo izvješće, odabiremo bilo koji neprazni akumulacijski registar sa stanjima i prometom, u postavkama izvješća aktiviramo kućicu „Detaljna evidencija“ (), označavamo neka grupiranja i dodamo Zapisnik u izlazna polja. Voila - početna i završna stanja zbrajaju se za svako grupiranje. Rezultat je izvješće s apsolutno netočnim brojevima, koje nije moguće prikazati korisnicima.

Za rješavanje ovog problema potrebno je pravilno ispuniti postavke polja ACS skupa podataka - posebno polje "Uloga", koje je od ključne važnosti.

RJEŠENJE interaktivno ( nije prikladno za univerzalno izvješće):

Otvorite dijagram izgleda podataka za svoje izvješće i pogledajte postavke polja skupa podataka.

Za polja početnog i konačnog stanja za svaki resurs morate ispuniti ulogu: odaberite grupu uloga “Ostatak” iu njoj odredite vrijednost “Početno stanje” odnosno “Konačno stanje”. Dakle ( ) to se radi u ACS konstruktoru.

Slično tome, morate dodijeliti ulogu "Dimenzija" svim dimenzijama u vašem skupu podataka.

Ali to nije dovoljno da bi izvješća radila ispravno. Da biste ispravno izračunali rezidualna polja, morate znati razdoblje svakog kretanja kako biste ih postavili u točan kronološki red. Ako vaš izvorni izvor podataka nema polje s točkom, morate ga tamo dodati. Ako polje razdoblja već postoji u skupu podataka, ono mora biti specificirano s ulogom “Period” i odgovarajućim brojem razdoblja (više o numeriranju razdoblja možete pročitati u pomoći).

Ovakve postavke podatkovnih polja ACS-a u većini slučajeva omogućuju postizanje ispravnog izračunavanja stanja grupiranjem kada sa zadanim postavkama netočno su izračunati.

Softversko RJEŠENJE (na primjeru izvješća o univerzalnim metapodacima):

Sada pogledajmo kako popraviti istu pogrešku u Universal Metadata Report. Univerzalno izvješće razlikuje se od većine drugih izvješća po tome što je shema rasporeda podataka tamo generirana potpuno programski, tako da također morate programski konfigurirati uloge za podatkovna polja ACS-a.

Za uloge početna i završna stanja za svaki resurs Najlakši način je ne izmišljati kotač (sve je već napisano prije nas) i koristiti standardnu ​​proceduru Ispunite DataSetFieldRemainder() iz opći modul StandardReports. Tamo prosljeđujete polje skupa podataka i naziv resursa kao parametre, a kao rezultat, polje ostatka s ispravno ispunjenom ulogom stvara se u skupu podataka.

Slično, kada stvarate polja skupa podataka za dimenzije, morate im dodijeliti ulogu Dimenzija. Kod će biti otprilike ovaj:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = True;

Gore opisane manipulacije s poljima resursa i dimenzija su potrebne, ali ne i dovoljne za rješavanje problema - glavni problem univerzalnog izvješća je nedostatak numeriranja razdoblja. Polja razdoblja prisutna su u skupu podataka, ali njihove uloge nisu popunjene.

Polja razdoblja se u izvještaj dodaju procedurom općeg modula StandardReports.AddPeriodFieldsToDataSet(), koja se poziva iz procedure objektnog modula AddDataSetFields(). Nažalost, ovaj postupak ne dodjeljuje brojeve razdoblja.

Osim toga, polja "Broj reda" i "Matičar" nisu programski dodana nigdje u izvješće. Činilo mi se čudno, jer... prisutni su u konačnom skupu podataka.

Kako je ispalo, polja "Broj reda" i "Matičar"(Snimač) automatski dodaje sama platforma kada se inicijalizira alat za izradu postavki. Štoviše, platforma ne popunjava uloge za polja koja kreira, te ih nije moguće popuniti programski, što stvara probleme pri daljnjem radu s njima. Ali ako ta polja izradite "ručno" i programski im dodijelite ispravne uloge, tada ih platforma više ne pokušava ponovno stvoriti.

U nastavku nudim recept koji mi je pomogao gotovo u potpunosti riješiti ovaj problem platforme i Universal Metadata Report:

Evo ovog isječka koda objektnog modula:

// Dodavanje polja razdoblja If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); završi ako; treba zamijeniti sa sljedećim: // Dodaj polja razdoblja If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Popuniti servisna polja i ručno unijeti periode, jer platforma ih ne ispunjava Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Polje = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrar", "Registrar"); Field.Role.PeriodNumber = 2; sč = 3; Za svaki FieldPeriod s popisa razdoblja Cycle FieldPeriod.Value.Role.PeriodNumber = count; If count > 3 Then FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; završi ako; sch = sch+1; EndCycle; završi ako;

Uspio sam pronaći jedno ograničenje povezano s ovim rješenjem. Za ispravan izračun poč. i kon. stanja, potrebno je da prilikom korištenja bilo kojeg detalja registraturskog dokumenta u izvješću mora biti odabran i sam matičar. Inače, univerzalno izvješće nakon takvih izmjena više ne uzrokuje alergije među korisnicima.

UPDATE: Rečeno mi je u komentarima da je članak na ovu temu svojedobno bio objavljen na ITS disku. Nažalost, ovaj članak je prošao mimo mene, ali mi je mogao samo djelomično pomoći u rješavanju problema s univerzalnim izvješćem. Jao, platforma ima problema s uslugom ACS polja, kao što je "Snimač", također tamo nisu opisani.

U svakom slučaju, nadam se da će moj članak pomoći svima koji imaju slične probleme. Proveo sam dosta vremena tražeći ovo rješenje...

Dobar dan, dragi čitatelji bloga! Prošli put smo se već dotakli teme koja je govorila o korištenju funkcije. A danas, u prvom iz ove serije članaka, saznat ćemo Za što se koriste uloge polja za sastav podataka?, te također razmotrite primjere popunjavanja ovih uloga.

Uloga ACS polja ukazuje što je ovo polje. Svaka uloga polja može sadržavati vlastito svojstvo. Na primjer, ima numerička vrijednost i sadrži broj razdoblja ako je polje točka. Ako je vrijednost svojstva “Period” 0 (nula), to znači da ovo polje nije točka. Ili svojstvo "Dimenzija" - sadrži naznaku da je polje dimenzija. Ako je polje dimenzija, tada se ove informacije koriste pri izračunavanju ukupnih iznosa za polja stanja.

Za svako polje u shemi sastava podataka možete navesti ulogu. Uloge utjecati na ispravnost proračuna bilance. Konkretno, početno i konačno stanje prema nekoj tablici. Ako je u upitu odabrana virtualna tablica “Stanja i prometi”, tada se početna i završna stanja izračunavaju složenim algoritmom, posebice ako koristimo dodatne spreadove po razdobljima.

Ali ako u upitima sve ovo radi ispravno, na temelju skupa izlaznih polja, onda su u sastavu podataka stvari nešto gore. Uostalom, ne znamo koja će polja korisnik zapravo odabrati. Sve će ovisiti o postavkama njegove verzije izvješća, koje može promijeniti u bilo kojem trenutku. Stoga sustav za komponiranje podataka ima vlastiti mehanizam za izračun početnih i završnih stanja za određeni skup podataka, a uloge se za to koriste u skladu s tim. Otvorimo ga i vidimo da možete postaviti uloge za svako polje.

Dodajmo skup podataka upita. Da bismo to učinili, moramo aktivirati korijenski element "Query Builder". Prijeđimo na virtualnu tablicu “Stanja i obrti” akumulacijskog registra. Što vidimo?

Kao što možete vidjeti na gornjoj ilustraciji, vidimo da je za neka polja uloga popunjena. To se dogodilo jer imamo postavljenu zastavu AutoComplete. Ali to nije uvijek moguće, pa ponekad ulogu morate unijeti ručno. Pogledajmo nekoliko primjera.

Pretpostavimo da u upitu koji koristimo, na primjer, koristimo operator upitnog jezika “SELECT”. Opišimo sljedeće stanje:

SELECTION WHEN Product RemainingRemainingsAndTurnover.Nomenclature = Value(Directory.Nomenclature.EmptyLink) THEN Value(Directory.Nomenclature.Shampoo) ELSE Product RemainingRemainingAndTurnover.Nomenclature END

Ovaj unos znači da ako stavka odgovara praznoj vezi (odnosimo se na imenik vrijednosti funkcije “Nomenklatura”, prazna veza), tada će se vratiti vrijednost unaprijed definiranog elementa. Pretpostavimo da u našoj konfiguraciji postoji takav predefinirani element i zove se "Šampon". U suprotnom, vraćamo vrijednost samog artikla. Dobivamo sljedeće:

Kao što vidite, uloga nije popunjena za polje "Nomenklatura". Ali kao što možete vidjeti na slici, u stvarnosti nemamo unesenu ulogu za polje "Field1" i u ovom slučaju ostatak neće biti ispravno izračunat.

Postoje i drugi primjeri gdje se uloga ne može dodijeliti neovisno. Na primjer, ovo je upotreba , to jest, određena tablica vrijednosti se isporučuje kao ulaz, recimo, učitava se iz druge baze podataka, a stanja se moraju izračunati iz nje. U ovom slučaju moramo sami dodijeliti uloge. Pogledat ćemo kako se to radi u.

Na kraju članka želim vam preporučiti besplatnu od Anatolija Sotnikova. Ovo je tečaj iskusnog programera. Posebno će vam pokazati kako izraditi izvješća u sustavu kontrole pristupa. Samo treba pažljivo slušati i zapamtiti! Dobit ćete odgovore na sljedeća pitanja:
  • Kako izraditi jednostavno izvješće s popisom?
  • Čemu služe stupci Polje, Put i Naslov na kartici "Polja"?
  • Koja su ograničenja za polja izgleda?
  • Kako ispravno konfigurirati uloge?
  • Koje su uloge za polja izgleda?
  • Gdje mogu pronaći karticu sastava podataka u upitu?
  • Kako konfigurirati parametre u sustavu kontrole pristupa?
  • Postaje još zanimljivije...
Možda ne biste trebali sami pokušati surfati internetom u potrazi za potrebnim informacijama? Štoviše, sve je spremno za korištenje. Samo počnite! Sve pojedinosti o tome što se nalazi u besplatnim video lekcijama

Ne znam koliko se već ljudi susrelo s greškom izračuna početnih i završnih stanja po grupiranjima. Osobno sam imao “sreću”, više puta. Razlog, kako sam uspio doznati, leži u pogrešnim postavkama podatkovnih polja ACS-a, čije važnosti mnogi početnici (i manje) programeri još nisu u potpunosti svjesni.

Kada se ACS skup podataka kreira automatski na temelju upita, problemi obično ne nastaju jer sama platforma ispravno ispunjava postavke polja na temelju teksta zahtjeva. Ali postoje situacije kada se postavke podatkovnog polja ne popunjavaju automatski (npr. koristite vanjski izvor podataka), a izvorni podaci sadrže kretanja sa stanjima i prometima.

Ako se prije niste susreli s ovim problemom, da biste bolje razumjeli njegovu bit, predlažem da ga sami reproducirate pomoću univerzalnog izvješća (temeljenog na metapodacima). Pokrećemo izvješće, odabiremo bilo koji neprazni akumulacijski registar sa stanjima i prometom, u postavkama izvješća aktiviramo kućicu „Detaljna evidencija“ (), označavamo neka grupiranja i dodamo Zapisnik u izlazna polja. Voila - početna i završna stanja zbrajaju se za svako grupiranje. Rezultat je izvješće s apsolutno netočnim brojevima, koje nije moguće prikazati korisnicima.

Za rješavanje ovog problema potrebno je pravilno ispuniti postavke polja ACS skupa podataka - posebno polje "Uloga", koje je od ključne važnosti.

RJEŠENJE interaktivno ( nije prikladno za univerzalno izvješće):

Otvorite dijagram izgleda podataka za svoje izvješće i pogledajte postavke polja skupa podataka.

Za polja početnog i konačnog stanja za svaki resurs morate ispuniti ulogu: odaberite grupu uloga “Ostatak” iu njoj odredite vrijednost “Početno stanje” odnosno “Konačno stanje”. Dakle ( ) to se radi u ACS konstruktoru.

Slično tome, morate dodijeliti ulogu "Dimenzija" svim dimenzijama u vašem skupu podataka.

Ali to nije dovoljno da bi izvješća radila ispravno. Da biste ispravno izračunali rezidualna polja, morate znati razdoblje svakog kretanja kako biste ih postavili u točan kronološki red. Ako vaš izvorni izvor podataka nema polje s točkom, morate ga tamo dodati. Ako polje razdoblja već postoji u skupu podataka, ono mora biti specificirano s ulogom “Period” i odgovarajućim brojem razdoblja (više o numeriranju razdoblja možete pročitati u pomoći).

Ovakve postavke podatkovnih polja ACS-a u većini slučajeva omogućuju postizanje ispravnog izračunavanja stanja grupiranjem kada sa zadanim postavkama netočno su izračunati.

Softversko RJEŠENJE (na primjeru izvješća o univerzalnim metapodacima):

Sada pogledajmo kako popraviti istu pogrešku u Universal Metadata Report. Univerzalno izvješće razlikuje se od većine drugih izvješća po tome što je shema rasporeda podataka tamo generirana potpuno programski, tako da također morate programski konfigurirati uloge za podatkovna polja ACS-a.

Za uloge početna i završna stanja za svaki resurs Najlakši način je ne izmišljati kotač (sve je već napisano prije nas) i koristiti standardnu ​​proceduru Ispunite DataSetFieldRemainder() iz opći modul StandardReports. Tamo prosljeđujete polje skupa podataka i naziv resursa kao parametre, a kao rezultat, polje ostatka s ispravno ispunjenom ulogom stvara se u skupu podataka.

Slično, kada stvarate polja skupa podataka za dimenzije, morate im dodijeliti ulogu Dimenzija. Kod će biti otprilike ovaj:

NewDimension = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, Dimension.Name, Dimension.Synonym); NewDimension.Role.Dimension = True;

Gore opisane manipulacije s poljima resursa i dimenzija su potrebne, ali ne i dovoljne za rješavanje problema - glavni problem univerzalnog izvješća je nedostatak numeriranja razdoblja. Polja razdoblja prisutna su u skupu podataka, ali njihove uloge nisu popunjene.

Polja razdoblja se u izvještaj dodaju procedurom općeg modula StandardReports.AddPeriodFieldsToDataSet(), koja se poziva iz procedure objektnog modula AddDataSetFields(). Nažalost, ovaj postupak ne dodjeljuje brojeve razdoblja.

Osim toga, polja "Broj reda" i "Matičar" nisu programski dodana nigdje u izvješće. Činilo mi se čudno, jer... prisutni su u konačnom skupu podataka.

Kako je ispalo, polja "Broj reda" i "Matičar"(Snimač) automatski dodaje sama platforma kada se inicijalizira alat za izradu postavki. Štoviše, platforma ne popunjava uloge za polja koja kreira, te ih nije moguće popuniti programski, što stvara probleme pri daljnjem radu s njima. Ali ako ta polja izradite "ručno" i programski im dodijelite ispravne uloge, tada ih platforma više ne pokušava ponovno stvoriti.

U nastavku nudim recept koji mi je pomogao gotovo u potpunosti riješiti ovaj problem platforme i Universal Metadata Report:

Evo ovog isječka koda objektnog modula:

// Dodavanje polja razdoblja If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); završi ako; treba zamijeniti sa sljedećim: // Dodaj polja razdoblja If TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TypicalReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Popuniti servisna polja i ručno unijeti periode, jer platforma ih ne ispunjava Field = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Polje = TypicalReports.AddDataSetField(DataCompositionSchema.DataSets, "Registrar", "Registrar"); Field.Role.PeriodNumber = 2; sč = 3; Za svaki FieldPeriod s popisa razdoblja Cycle FieldPeriod.Value.Role.PeriodNumber = count; If count > 3 Then FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; završi ako; sch = sch+1; EndCycle; završi ako;

Uspio sam pronaći jedno ograničenje povezano s ovim rješenjem. Za ispravan izračun poč. i kon. stanja, potrebno je da prilikom korištenja bilo kojeg detalja registraturskog dokumenta u izvješću mora biti odabran i sam matičar. Inače, univerzalno izvješće nakon takvih izmjena više ne uzrokuje alergije među korisnicima.

UPDATE: Rečeno mi je u komentarima da je članak na ovu temu svojedobno bio objavljen na ITS disku. Nažalost, ovaj članak je prošao mimo mene, ali mi je mogao samo djelomično pomoći u rješavanju problema s univerzalnim izvješćem. Nažalost, problemi platforme s ACS servisnim poljima, kao što je "Recorder", također nisu opisani tamo.

U svakom slučaju, nadam se da će moj članak pomoći svima koji imaju slične probleme. Proveo sam dosta vremena tražeći ovo rješenje...

41
Nedavno sam napravio izvješće s neodređenim brojem stupaca. Nisam htio petljati s kodom, pa sam odlučio to učiniti na sustavu kontrole pristupa. Tu nije bilo problema, bilo je potrebno razvući rezultat na proizvoljan layout (vlastito zaglavlje +... 27
Iako studenti CDS-a naiđu na ovo prvi ili drugi dan, to bi trebalo biti u odjeljku FAQ. Jednostavan primjer programskog ispisa izvješća o izgledu, korištenjem zadanih postavki. //Preuzmi dijagram od... 18
Kod generiranja izvještaja na sustavu kontrole pristupa standardno su sve grupacije proširene, ali ponekad je potrebno odmah nakon generiranja prikazati izvještaj sa sažetim grupacijama! Ovaj kod u modulu izvješća omogućuje vam sažimanje... 10
Na ovoj kartici možete odrediti koje veze se uspostavljaju između dva ili više skupova podataka, prema kojim parametrima i uvjetima..png 1. “Izvor veze” - označava prvi skup podataka, od... 9
Ono što je potrebno kod izrade izvještaja je da se za korisnika s ograničenim pravima, izvještaj generira potpuno bez provjere prava! Osobito ako je RLS konfiguriran. Postoji nekoliko načina za to: 1. Instalirajte...