1c virtuelna tabela stanja i prometa. Kartica Grupa upita

Odlučio sam dati svoj doprinos i opisati one karakteristike jezika o kojima nije bilo riječi u gornjim člancima. Članak je namijenjen programerima početnicima.

1. “IZ” dizajn.

Za dobivanje podataka iz baze podataka uopće nije potrebno koristiti konstrukciju “FROM”.
Primjer: Moramo odabrati sve podatke o bankama iz imenika banaka.
Zahtjev:

SELECT Directory.Banks.*

Bira sva polja iz imenika Banke. I sličan je zahtjevu:

SELECT Banks.* FROM Directory.Banks AS Banks

2. Naručivanje podataka po referentnom polju

Kada trebamo organizirati podatke upita po primitivnim tipovima: "String", "Broj", "Datum" itd., onda se sve rješava korištenjem "ORDER BY" konstrukcije ako trebate poredati podatke po referentnom polju? Referentno polje je veza, jedinstveni identifikator, tj. Grubo govoreći, neki proizvoljni skup znakova i uobičajeni poredak mogu proizvesti rezultat koji nije sasvim očekivan. Za naručivanje referentnih polja koristi se konstrukcija "AUTO ORDER". Da biste to učinili, prvo morate poredati podatke direktno po referentnom tipu koristeći konstrukciju "ORDER BY", a zatim konstrukciju "AUTO ORDER".

U ovom slučaju, za dokumente će se poredati po redosledu "Datum->Broj", za referentne knjige u "Glavnom prikazu". Ako se poredak ne odvija po referentnim poljima, onda se ne preporučuje upotreba konstrukcije "AUTO ORDER".

U nekim slučajevima, "AUTO ORDER" konstrukcija može usporiti proces odabira. Slično, možete prepisati bez automatskog naručivanja dokumenata:

3. Dobivanje tekstualne reprezentacije referentnog tipa. Dizajn "PREZENTACIJA".

Kada trebate prikazati polje referentnog tipa, na primjer, polje "Banka", koje je veza na element direktorija "Banke", morate razumjeti da se prilikom prikazivanja ovog polja postavlja podupit za " Banke" imenik će se automatski izvršiti kako bi se dobio pregled imenika. Ovo će usporiti izlaz podataka. Da biste to izbjegli, potrebno je u zahtjevu koristiti konstrukciju “PRESENTATION” kako biste odmah dobili reprezentaciju objekta i zatim ga prikazali za pregled.

U sistemu sastavljanja podataka ovaj mehanizam se koristi podrazumevano, ali kada kreirate rasporede u ćelijama, trebalo bi da navedete reprezentaciju referentnog polja i, na primer, postavite samu vezu u transkript.

4. Uslov za uzorkovanje podataka prema šablonu.

Na primjer, potrebno je nabaviti mobilne telefone zaposlenih na obrascu (8 -123- 456-78-912). Da biste to učinili, potrebno je u zahtjevu postaviti sljedeći uslov:

SELECT Employee.Name, Employee.Phone AS Phone IZ Imenika.Employees AS Employees GDJE Telefon LIKE "_-___-___-__-__"

Znak "_" je službeni znak i zamjenjuje bilo koji znak.

5. Istovremena upotreba zbroja i grupiranja.


Zbroji se često koriste zajedno sa grupisanjima; u ovom slučaju, agregatne funkcije možda neće biti navedene u zbrojima.

SELECT Pružanje usluga.Organizacija AS Organizacija, Pružanje usluga.Nomenklatura AS Nomenklatura, SUM(Pružanje usluga.Iznos dokumenta) AS Zbir dokumenta IZ dokumenta.Pružanje usluga AS Pružanje usluga GRUPA PO Pružanje usluga.Organizacija, Pružanje usluga.Nomenklatura REZULTATI PO OPĆENIM, Organizacija, Nomen klatura

U ovom slučaju, upit će vratiti gotovo isto kao i sljedeći upit:

SELECT Pružanje usluga.Organizacija AS Organizacija, Pružanje usluga.Nomenklatura AS Nomenklatura, Pružanje usluga.Iznos dokumenta KAO Količina dokumenta IZ dokumenta.Pružanje usluga KAO Pružanje usluga REZULTATI IZNOS (Količina dokumenta) PO OPĆENIM, Organizacija, Nomenklatura

Samo prvi upit će sažimati zapise sa istom nomenklaturom.

6. Dereferenciranje polja.

Pozivanje na polja kroz tačku naziva se operacija dereferenciranja referentnog polja. Na primjer Plaćanje.Organizacija.Upravna jedinica. U ovom slučaju, u referentnom polju "Organizacija" dokumenta "Plaćanje" se odnosi na drugu tabelu "Organizacije", u kojoj će se dobiti vrijednost atributa "Upravna jedinica". Važno je shvatiti da kada se pristupi poljima kroz tačku, platforma implicitno kreira potupit i pridružuje ove tabele.

Zahtjev:

Može se predstaviti kao:

SELECT Payment.Link, Payment.Organization, Payment.Organization, Organizations. Administrativna jedinica IZ dokumenta.Plaćanje KAO Plaćanje LEFT JOIN Directory.Organizacije AS Softver Organizacije Plaćanje.Organizacija = Organizacije.Link

Kada dereferencira referentna polja kompozitnog tipa, okvir pokušava kreirati implicitne spojeve sa svim tablicama koje su dio tipa tog polja. U tom slučaju upit neće biti optimalan.Ako se jasno zna o kakvom se tipu polja radi, potrebno je takva polja ograničiti po tipu konstrukcijom EXPRESS().

Na primjer, postoji registar akumulacije “Neraspoređena plaćanja”, gdje nekoliko dokumenata može djelovati kao registrator. U ovom slučaju, pogrešno je dobiti vrijednosti podataka registratora na ovaj način:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

trebali biste ograničiti tip kompozitnog polja na logger:

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Datum, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. Izgradnja "GDJE"

Sa lijevim spajanjem dvije tablice, kada na desnu tablicu nametnete uslov “WHERE”, dobićemo rezultat sličan rezultatu sa unutrašnjim spajanjem tabela.

Primjer. Potrebno je izabrati sve klijente iz Imenika klijenata i za one klijente koji imaju dokument o plaćanju sa vrijednošću atributa "Organizacija" = &Organizacija, prikazati dokument "Uplata", za one koji nemaju ne prikazivati ​​ga.

Rezultat upita će vratiti zapise samo za one klijente koji su imali plaćanje po organizaciji u parametru, a filtrirat će ostale klijente. Dakle, prvo morate primiti sve uplate za „tavu i takvu“ organizaciju u privremenu tabelu, a zatim je povezati sa direktorijumom „Klijenti“ koristeći lijevo spajanje.

SELECT Payment.Link AS Payment, Payment.Dioničar KAO Klijent MESTO za plaćanja IZ dokumenta.Plaćanje KAO plaćanje GDJE Plaćanje.Filijala = &Filijala; /////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") KAO Plaćanje IZ imenika .Clients AS Klijenti LIJEVA KONEKCIJA topayments KAO topayments SOFTVER Clients.Link = topayments.Client

Ovo stanje možete zaobići na drugi način. Neophodno je nametnuti uslov "WHERE" direktno na odnos između dve tabele. primjer:

SELECT Clients.Link, Payment.Link IZ Directory.US_Subscribers AS US_Subscribers LIJEVA VEZA Dokument.Plaćanje KAO softver za plaćanje (Clients.Link = Payment.Client AND Payment.Client.Name KAO "Paketić šećera") GRUPA PO Klijentima.Link. Veza

8. Spajanja sa ugniježđenim i virtualnim tablicama

Ugniježđeni upitičesto potrebno za dohvat podataka na osnovu nekog stanja. Ako ih zatim koristite u kombinaciji s drugim tabelama, to može kritično usporiti izvršenje upita.

Na primjer, za neke klijente moramo dobiti iznos stanja na tekući datum.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (ODABIR Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery LEFT JOIN LEFT JOIN Register NeBYPallocacumulted. quest.Link = UnallocatedPaymentsBalances. Kupac

Prilikom izvršavanja takvog upita, optimizator DBMS-a može napraviti greške pri odabiru plana, što će dovesti do neoptimalnog izvršenja upita. Prilikom spajanja dve tabele, DBMS optimizator bira algoritam za spajanje tabela na osnovu broja zapisa u obe tabele. Ako postoji ugniježđeni upit, izuzetno je teško odrediti broj zapisa koje će ugniježđeni upit vratiti. Stoga biste uvijek trebali koristiti privremene tablice umjesto ugniježđenih upita. Dakle, prepišimo zahtjev.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients GDJE
Clients.Link B (&Clients) ; /////////////////////////////////////////////// // ////////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.AmountRemaining, FROM tClients AS tClients LEFT JOIN RegisterAccumulations.UnallocatedPayments.Balances (, ClientPayments.Balances (, Clients) IN (ODABIR tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

U ovom slučaju, optimizator će moći odrediti koliko zapisa koristi privremena tablica tClients i moći će odabrati optimalni algoritam za spajanje tabela.

Virtuelni stolovi , omogućavaju vam da dobijete praktično gotove podatke za većinu primijenjenih zadataka (Slice of First, Slice of the Last, Ostaci, Promet, Ostaci i Obrtovi) Ključna riječ je virtuelna. Ove tabele nisu fizičke, već ih sistem sastavlja u hodu, tj. Prilikom primanja podataka iz virtuelnih tabela, sistem prikuplja podatke iz konačnih registarskih tabela, sastavlja, grupiše i izdaje ih korisniku.

One. Kada se povezujete na virtuelnu tabelu, uspostavlja se veza sa podupitom. U ovom slučaju, optimizator DBMS-a također može odabrati neoptimalan plan povezivanja. Ako upit nije generiran dovoljno brzo i upit koristi spojeve u virtualnim tablicama, tada se preporučuje premjestiti pristup virtualnim tablicama na privremenu tablicu, a zatim napraviti spajanje između dvije privremene tablice. Prepišimo prethodni zahtjev.

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEKS PO LINKU GDJE
Clients.Link B (&Clients) ; /////////////////////////////////////////////// // /////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client MESTO stanja IZ RegisterAccumulations.UnallocatedPayments.Balances(, Klijent B ( SELECT tClients Link FROM tClients)) AS UnallocatedPaymentsBalances; /////////////////////////////////////////////// // /////////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining KAO Preostali iznos od tClients KAO tClients LEFT JOIN toRemainders AS Remainders BY tClients.Link = tRemainings.Client

9.Provjera rezultata zahtjeva.

Rezultat upita može biti prazan; da biste provjerili ima li praznih vrijednosti, koristite sljedeću konstrukciju:

ResRequest = Request.Execute(); Ako resQuery.Empty() Onda Return; endIf;

Metoda Prazan() treba koristiti prije metoda Odaberi() ili istovar(), budući da je za preuzimanje zbirke potrebno vrijeme.

Nikome nije otkriće da je izuzetno nepoželjno koristiti upite u petlji. To može kritično utjecati na vrijeme rada određene funkcije. Vrlo je poželjno primiti sve podatke u zahtjevu, a zatim ih obraditi u petlji. Ali ponekad postoje slučajevi kada postane nemoguće premjestiti zahtjev izvan petlje. U tom slučaju, radi optimizacije, kreiranje upita možete premjestiti izvan petlje, au petlji zamijeniti potrebne parametre i izvršiti upit.

Zahtjev = Novi zahtjev; Query.Text = "SELECT | Clients.Link, | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; Za svaki red FROM TableClients Loop Query.SetParameter("Klijent", Klijent); QueryResult = Query.Execute().Select(); EndCycle;

Ovo će spasiti sistem od provjere sintakse zahtjeva u petlji.

11. Konstrukcija "HAVING".

Dizajn koji je prilično rijedak u zahtjevima. Omogućava vam da nametnete uvjete na vrijednosti agregatnih funkcija (SUM, MINIMUM, PROSJEČAN, itd.). Na primjer, trebate odabrati samo one klijente čiji je iznos plaćanja u septembru bio veći od 13.000 rubalja. Ako koristite uslov “GDJE”, prvo ćete morati kreirati privremenu tabelu ili ugniježđeni upit, grupirati zapise tamo prema iznosu plaćanja, a zatim primijeniti uvjet. Konstrukcija “IMATI” će pomoći da se to izbjegne.

ODABIR Plaćanje.Kupac, IZNOS (Iznos.Iznos) KAO IZNOS IZ dokumenta.Plaćanje KAO Plaćanje GDJE MJESEC(Datum.Plaćanja) = 9 GRUPA PO Uplati.Kupac IMA IZNOS (Iznos.Uplata) > 13000

Da biste to uradili u konstruktoru, samo idite na karticu „Uslovi“, dodajte novi uslov i označite polje za potvrdu „Prilagođeno“. Onda samo napiši Iznos (Iznos plaćanja) > 13000


12. NULL vrijednost

Ovdje neću opisivati ​​principe trovrijedne logike u bazi podataka; postoji mnogo članaka na ovu temu. Samo ukratko o tome kako NULL može uticati na rezultat upita. Vrijednost NULL zapravo nije vrijednost, a činjenica da je vrijednost nedefinirana je nepoznata. Stoga, svaka operacija sa NULL vraća NULL, bilo da se radi o sabiranju, oduzimanju, dijeljenju ili poređenju. NULL vrijednost se ne može uporediti sa NULL vrijednošću jer ne znamo šta da uporedimo. One. oba ova poređenja su: NULL = NULL, NULL<>NULL nije Tačno ili Netačno, nepoznato je.

Pogledajmo primjer.

Za one klijente koji nemaju uplate, potrebno je da prikažemo polje “Potpis” sa vrijednošću “Nema plaćanja”. Štaviše, pouzdano znamo da imamo takve klijente. A da bismo odrazili suštinu onoga što sam gore napisao, uradimo to na ovaj način.

SELECT "Bez plaćanja" AS Atribut, NULL AS Dokument PLACE topayments; /////////////////////////////////////////////// // ////////////////////////// ODABIR Clients.Link AS Client, Payment.Link KAKO PLAĆANJE STAVITI tClientPayment IZ Directory.Clients AS Clients LEFT CONNECTION Dokument. Payment AS Payment Software Clients.Link = Payment.Shareholder; /////////////////////////////////////////////// // ////////////////////////// ODABIR tClientPayment.Client IZ tClientPayment KAO tClientPayment INTERNO PRIDRUŽENJE tPayment AS tTopay BY tClientPayment.Payment = tPayment.

Obratite pažnju na drugu privremenu tabelu tClientPayment. Lijevim spojem biram sve klijente i sva plaćanja za te klijente. Za one klijente koji nemaju uplate, polje “Plaćanje” će biti NULL. Slijedeći logiku, u prvoj privremenoj tabeli “tPayments” označio sam 2 polja, jedno od njih NULL, drugi red “Nema plaćanja”. U trećoj tabeli povezujem tabele “tClientPayment” i “tPayment” koristeći polja “Payment” i “Document” internim spajanjem. Znamo da je u prvoj tabeli polje „Dokument“ NULL, au drugoj tabeli su NULL i oni koji nemaju uplate u polju „Uplata“. Šta će nam takva veza vratiti? Ali to neće vratiti ništa. Zato što poređenje NULL = NULL ne daje vrijednost Tačno.

Da bi zahtjev vratio očekivani rezultat, prepišimo ga:

SELECT "Nema plaćanja" AS Atribut, VALUE(Document.Payment.EmptyLink) AS Document PLACE to Payments; /////////////////////////////////////////////// // /////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) KAKO Plaćanje PUT tClientPayment IZ Imenika.Klijenti KAO Klijenti LIJEVA VEZA Dokument.Plaćanje KAO Plaćanje OD Klijenta.Link = Plaćanje.Akcionar; /////////////////////////////////////////////// // ////////////////////////// ODABIR tClientPayment.Client IZ tClientPayment KAO tClientPayment INTERNO PRIDRUŽENJE tPayment AS tTopay BY tClientPayment.Payment = tPayment.

Sada, u drugoj privremenoj tabeli, naznačili smo da ako je polje “Plaćanje” NULL, onda je ovo polje = prazna veza do dokumenta plaćanja. U prvoj tabeli također smo zamijenili NULL praznom referencom. Sada veza uključuje polja koja nisu NULL i zahtjev će vratiti očekivani rezultat.

Svi zahtjevi sadržani u članku odražavaju situacije koje bih želio razmotriti i ništa više. O Možda nisu varljivi ili neoptimalni, glavna stvar je da odražavaju suštinu primjera.

13. Nedokumentovana karakteristika dizajna "IZBOR KADA... ONDA... KRAJ".

U slučaju kada je u zahtjevu potrebno opisati konstrukciju “Uvjeti”, koristimo standardnu ​​sintaksu:

ODABERITE IZBOR KADA Users.Name = "Vasya Pupkin" ONDA "Naš omiljeni zaposlenik" OSTALO "Ne znamo ovo" KRAJ KAO Polje 1 IZ Direktorija.Korisnici KAO Korisnici

Ali šta ako, na primjer, u zahtjevu trebamo dobiti naziv mjeseca? Pisanje ogromne konstrukcije u zahtjevu je ružno i dugotrajno, tako da nam ovaj oblik pisanja iznad može pomoći:

SELECT MESEC(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) KADA 1 ONDA "januar" KADA 2 ONDA "februar" KADA 3 ONDA "mart" KADA 4 ONDA "april" KADA 5 ONDA "6 maj" KADA "KADA" KADA 8 PA "Avgust" KADA 9 PA "septembar" KADA 10 PA "oktobar" KADA 11 PA "novembar" KADA 12 ONDA "decembar" ZAVRŠAVA SE KAO MESEC

Sada dizajn izgleda manje glomazan i lako ga je razumjeti.

14. Paketno izvršavanje upita.


Kako ne biste umnožavali zahtjeve, možete kreirati jedan veliki zahtjev, podijeliti ga u pakete i raditi s njim.
Na primjer, moram dobiti sljedeća polja iz direktorija "Korisnici": "Datum rođenja" i dostupne uloge za svakog korisnika. učitajte ovo u različite tabelarne dijelove obrasca. Naravno, ovo možete učiniti u jednom zahtjevu, tada ćete morati iterirati kroz zapise ili ih sažimati, ili možete učiniti ovo:

SELECT Users.Link AS Puno ime, Korisnici.Datum rođenja, Korisnici.Uloga PUT vtUsers FROM Directory.Users AS Korisnici; /////////////////////////////////////////////// // /////////////////////////// SELECT tueUsers.Puno ime, utoUsers.Datum rođenja OD tueUsers KAO tueUsers GRUPA PO tueUsers.puno ime, tueUsers . Datum rođenja; /////////////////////////////////////////////// // ////////////////////////// SELECT wUsers.Puno ime, wUsers.Uloga OD wUsers KAO wUsers GRUPA PO wUsers.Puno ime, wUsers Datum od Rođenje

tPackage = Request.ExecutePackage();

TP_Datum rođenja = tPackage.Upload();
TP_Roles = tPackage.Unload();

Kao što vidimo, upit se može izvršiti u paketu, a rezultat se može obraditi kao niz. U nekim slučajevima je vrlo zgodno.

15. Uslovi u paketnom zahtjevu

Na primjer, imamo paketni zahtjev, gdje prvo dobijamo polja: “Ime, Datum rođenja, Šifra” iz direktorija “Korisnici” i želimo da dobijemo zapise sa uslovima za ova polja iz direktorija “Pojedinci”.

SELECT Users.Individual.Name AS Ime, Users.Individual.Date of Birth AS Datum rođenja, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Korisnici; /////////////////////////////////////////////// // /////////////////////////// SELECT Individuals Link AS Individual FROM Directory Pojedinci KAO Pojedinci

Možete postaviti uslove kao što su:

WHERE Individuals.Code IN (ODABIR vtUsers.Code FROM vtUsers) I Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) I Individuals.BirthDate IN (ODABIR vtUsers.DateBirth FROM tvUsers)

A možete to učiniti ovako:

WHERE (Pojedinci.Šifra, Pojedinci.Ime, Pojedinci.Datum rođenja) IN (ODABIR tueUsers.Code, utoUsers.Ime, utoUsers.Datum rođenja OD tueUsers)

Štaviše, potrebno je održavati red.

16. Pozivanje graditelja upita za “stanje” u paketnom zahtjevu

Kada je potrebno nametnuti uslov, kao u gornjem primjeru, možete zaboraviti kako se ovo ili ono polje poziva u virtualnoj tablici.
Na primjer, potrebno je nametnuti uslov u polje "Datum rođenja", au virtuelnoj tabeli ovo polje se zove "Datum rođenja dužnika", a ako zaboravite ime, moraćete da izađete iz uređivanja uslova bez sačuvajte i pogledajte naziv polja. Kako biste to izbjegli, možete koristiti sljedeću tehniku.

Potrebno je staviti zagrade iza konstrukcije “B” i ostaviti prazan prostor (razmak) između zagrada, odabrati ovaj prostor i pozvati konstruktor upita. Dizajner će imati pristup svim tabelama skupnog upita. Tehnika radi i na virtualnim registarskim tablicama i na kartici “Uvjeti”. U potonjem slučaju morate označiti polje "P (proizvoljno stanje)" i ući u mod za uređivanje "F4".

Pitanja su se često postavljala u hodu i jednostavno služe da ilustruju „tehnike“ koje sam razmatrao.

Hteo sam da pogledam upotrebu indeksa u upitima, ali ovo je veoma široka tema. Staviću ga u poseban članak ili ga kasnije dodati ovde.

upd1. Tačke 11,12
upd2. Tačke 13,14,15,16

rabljene knjige:
Jezik upita "1C:Enterprise 8" - E.Yu. Khrustaleva
Profesionalni razvoj u sistemu 1C:Enterprise 8."

Prilikom organizovanja uzoraka u realnim problemima, u velikoj većini slučajeva, selekcija podataka je organizovana u skladu sa određenim kriterijumima.

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

U slučaju kada je izvor u upitu virtuelna tabela, situacija postaje nešto komplikovanija.


Jezik upita vam omogućava da nametnete uslov za izbor iz virtuelnih tabela na dva načina: u klauzuli WHERE i korišćenjem parametara virtuelne tabele. Obje metode će dovesti do istog rezultata (sa izuzetkom nekih specifičnih slučajeva), ali su, ipak, daleko od ekvivalenta.

Već znamo da se virtuelne tabele nazivaju virtuelne jer se zapravo ne nalaze u bazi podataka. Oni se formiraju tek u trenutku kada im se uputi zahtjev. Uprkos tome, zgodno je za nas (to jest, one koji pišu upit) da virtualne tabele smatramo stvarnim. Šta će se dogoditi u sistemu 1C Enterprise 8 kada upit koji smo sastavili i dalje pristupa virtuelnoj tabeli?

U prvom koraku, sistem će izgraditi virtuelnu tabelu. U drugom koraku, iz rezultirajuće tabele će biti odabrani zapisi koji zadovoljavaju uslov naveden u klauzuli WHERE:
Jasno se vidi da konačni uzorak neće obuhvatiti sve zapise iz virtuelne tabele (pa samim tim i iz baze), već samo one koji zadovoljavaju zadati uslov. A preostali zapisi će jednostavno biti isključeni iz rezultata.

Dakle, sistem neće raditi samo beskorisni posao, već dvostruko beskorisni posao! Prvo će se resursi potrošiti na pravljenje virtuelne tabele na osnovu nepotrebnih podataka (na slici su označeni kao „područja podataka A i B“), a zatim će se raditi na filtriranju ovih podataka iz konačnog rezultata.

Da li je moguće odmah, u fazi konstruisanja virtuelne tabele, prestati koristiti nepotrebne podatke? Ispostavilo se da je to moguće. Upravo za to su dizajnirani parametri virtualne tablice:

Parametrizovanjem virtuelne tabele, odmah ograničavamo količinu podataka koje će upit obraditi.

Koja je razlika između vrijednosti parametra virtualne tablice "Metoda dodavanja"?
Kada je Metoda dodavanja postavljena na "pokreti", tada će biti vraćeni samo oni periodi u kojima je bilo kretanja. Kada se podesi "Pokreti i granice perioda", tada će se gore navedenim kretanjima dodati 2 zapisa: kretanja na početku i na kraju perioda navedenog u VT parametrima. Polje “Registar” će biti prazno za ova 2 zapisa.

Informacije preuzete sa stranice

Prilikom organizovanja uzoraka u realnim problemima, u velikoj većini slučajeva, selekcija podataka je organizovana u skladu sa određenim kriterijumima.

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

U slučaju kada je izvor u upitu virtuelna tabela, situacija postaje nešto komplikovanija.

Jezik upita vam omogućava da nametnete uslov za izbor iz virtuelnih tabela na dva načina: u klauzuli WHERE i korišćenjem parametara virtuelne tabele. Obje metode će dovesti do istog rezultata (sa izuzetkom nekih specifičnih slučajeva), ali su, ipak, daleko od ekvivalenta.

Već znamo da se virtuelne tabele nazivaju virtuelne jer se zapravo ne nalaze u bazi podataka. Oni se formiraju tek u trenutku kada im se uputi zahtjev. Uprkos tome, zgodno je za nas (to jest, one koji pišu upit) da virtualne tabele smatramo stvarnim. Šta će se dogoditi u sistemu 1C Enterprise 8 kada upit koji smo sastavili i dalje pristupa virtuelnoj tabeli?

U prvom koraku, sistem će izgraditi virtuelnu tabelu. U drugom koraku, iz rezultirajuće tabele će biti odabrani zapisi koji zadovoljavaju uslov naveden u klauzuli WHERE:


Jasno se vidi da konačni uzorak neće obuhvatiti sve zapise iz virtuelne tabele (pa samim tim i iz baze), već samo one koji zadovoljavaju zadati uslov. A preostali zapisi će jednostavno biti isključeni iz rezultata.

Dakle, sistem neće raditi samo beskorisni posao, već dvostruko beskorisni posao! Prvo će se resursi potrošiti na pravljenje virtuelne tabele na osnovu nepotrebnih podataka (na slici su označeni kao „područja podataka A i B“), a zatim će se raditi na filtriranju ovih podataka iz konačnog rezultata.

Da li je moguće odmah, u fazi konstruisanja virtuelne tabele, prestati koristiti nepotrebne podatke? Ispostavilo se da je to moguće. Upravo za to su dizajnirani parametri virtualne tablice:


Parametrizovanjem virtuelne tabele, odmah ograničavamo količinu podataka koje će upit obraditi.

Koja je razlika između vrijednosti parametra virtualne tablice "Metoda dodavanja"?
Kada je Metoda dodavanja postavljena na "pokreti", tada će biti vraćeni samo oni periodi u kojima je bilo kretanja. Kada se podesi "Pokreti i granice perioda", tada će se gore navedenim kretanjima dodati 2 zapisa: kretanja na početku i na kraju perioda navedenog u VT parametrima. Polje “Registar” će biti prazno za ova 2 zapisa.

Pozovimo dijalog za unos parametara virtuelne tabele PriceSliceLast i naznačimo da će period biti prosleđen u parametru ReportDate. Da biste to uradili, izaberite ovu tabelu na listi Tabele i kliknite na dugme Opcije virtuelne tabele. Zatim iz tabela odaberite sljedeća polja:

    SprNomenclature. roditelj,

    PricesSlice of Latest.Price.

Spoj lijevog stola

- Na obeleživaču Veze: u polju Uvjet veze, da vrijednost dimenzije Nomenklature registra informacija mora biti jednaka referenci na element imenika Nomenklature. Također poništite potvrdni okvir Sve za tablicu registra i označite ga za tabelu pretraživanja, postavljajući na taj način tip veze kao lijevu vezu za tabelu pretraživanja:

Rice. 13.15. Odnos između tabela u upitu

- Na obeleživaču Uslovi postavimo uslov za odabir elemenata iz imenika Nomenklature - odabrani elementi moraju odgovarati tipu nomenklature koji je proslijeđen u parametru zahtjeva Vrsta nomenklature:

Rice. 13.16. Uslovi za odabir elemenata

- Na obeleživaču Sindikati/aliasi: navedite pseudonim za polje Roditelj = Grupa usluga i polje Veza = Usluga. - Kliknite OK–

Nakon toga, trebate urediti shemu rasporeda podataka, da biste to učinili na kartici Resursi, kliknite na dugme dodati i odaberite resurs - Cijena

- Na obeleživaču Opcije postavite vrijednost parametra Tip nomenklature - Enumeration.Nomenclature Types.Service. Osim toga, uklonit ćemo ograničenje dostupnosti za parametar ReportDate. U polju Tip ovog parametra postavite sastav datuma - Datum. Za parametar Period, naprotiv, postavljamo ograničenje dostupnosti:

Rice. 13.17. Opcije šeme rasporeda

Postavke

- Idemo na bookmark Postavke: Kreirajmo grupisanje na osnovu polja Service Group, specificirajući tip grupisanja Hijerarhija.

Za grupisanje izvještaja postoje sljedeći tipovi hijerarhije: Bez hijerarhije - samo nehijerarhijski zapisi se prikazuju u grupisanju. Hijerarhija - i nehijerarhijski i hijerarhijski zapisi se prikazuju u grupisanju. Samo hijerarhija - samo hijerarhijski (roditeljski) zapisi se prikazuju u grupisanju. Unutar ove grupe napravićemo još jednu, bez navođenja polja grupe. Na podkartici Odabrana polja: navedite izlazna polja Usluga i Cijena:

Rice. 13.18. Struktura izvještaja i polja

Na podkartici Ostalo podešavanja izvršićemo sledeće korake:

Rice. 13.19. Postavke za prikaz općih zbroja za grupiranje "Servisna grupa".

Rice. 13.20. Postavljanje i prikaz rezultata za globalni izvještaj

Na kraju, uključimo parametar Datum izvještaja u korisnička podešavanja i postavimo njegov način uređivanja na Brzi pristup. Zatvorimo dizajner šeme sastava podataka i u prozoru za uređivanje objekta List of Services idite na karticu Podsistemi. Na listi konfiguracijskih podsistema zabilježite podsisteme za pružanje usluga i računovodstvo.

    U 1C: Enterprise modu

Pokrenimo 1C:Enterprise u načinu za otklanjanje grešaka i prije svega otvorimo periodični registar Cijene. Zatim ćemo testirati izvještaj.

Koristeći ovaj izvještaj kao primjer, proučavali smo kako sistem sastava podataka dobija najnovije vrijednosti iz registra periodičnih informacija i kako se prikazuju grupisanja prema hijerarhiji direktorija.

Ako vam je moja publikacija korisna, ne zaboravite joj dati plus :-)

Ovdje je rubrikator za sve zadatke u kolekciji(stranica koja sadrži linkove na teme foruma za svaki zadatak)
http://chistov.spb.ru/forum/16-969-1

Pa, sada moji razvoji i bilješke koje sam kreirao tokom procesa pripreme.
Pokušaću da se što manje ponavljam sa ova dva gore pomenuta zadnji publikacije.

Pa da počnemo:


Ako ga polažete na daljinu, trebali biste imati dva objekta na radnoj površini na kraju ispita:

1. Konačno učitavanje baze podataka (dt fajl)
2. Objašnjenje

Ne bi trebalo biti ništa drugo, nema međukopija itd.

Obavezno napišite objašnjenje!
U slučaju nejasno formuliranog zadatka, obavezno napišite da ste odabrali upravo takvu i takvu opciju rješenja.
Takođe, na ključnim mjestima u kodu je bolje ostaviti kratke komentare, bez fanatizma, ali gdje ispitivač može imati pitanja, bolje je napisati.

Ali o tome će vam biti rečeno u uputama koje ćete pročitati prije ispita.
Bolje je znati unaprijed)


Upotreba znaka ampersanda u upitima.

Ponekad je brže kucati s dodatne tastature nego mijenjati raspored naprijed-nazad, štedeći vrijeme
& = Alt+38

*************************************************************************************************
Korištenje TimePoint() u upitima

U upitima prema akumulacijskim i računovodstvenim registrima potrebno je koristiti ne datum dokumenta kao parametar virtuelne tabele (perioda), već parametar Moment, koji je u kodu definisan na sledeći način:

Trenutak = ?(Prolazni način = Način knjiženja dokumenta. Operativno, Nedefinirano, Trenutak vremena());

*************************************************************************************************
Prilikom generisanja kretanja dokumenta po registru, na samom početku postupka obrade knjiženja potrebno je obrisati kretanje tekućeg dokumenta po registru.

kod je:

Movement.RegisterName.Write = Tačno; Movements.RegisterName.Clear();

Moguće je da će tokom procesa biti potrebno analizirati zapise iz ovog registra.
Dakle, da prilikom analize trenutnih zapisa (starih, prije promjene dokumenta) definitivno nisu uključeni u uzorak, možete dodati još jedan red u gornja dva reda:

Movement.RegisterName.Write();

Ili, kada analizirate zapise, eksplicitno naznačite granicu koja ne uključuje vremensku tačku trenutnog dokumenta.

Ali svuda sam jednostavno naznačio konstrukciju ove tri linije:

Movement.RegisterName.Write = Tačno; Movements.RegisterName.Clear(); Movement.RegisterName.Write();

*************************************************************************************************
Postoje dva načina za blokiranje podataka, izbor između njih ovisi o korištenoj metodi - stari ili novi:

1) Redovno kontrolisano blokiranje, stari način obrade dokumenata (Objekat blokiranja podataka)

Postavite da li se stanja prvo provjeravaju, a zatim otpisuju.
U slučaju kada trebamo imati neke podatke iz registra za formiranje pokreta.


primjer:

U dokumentu - količina, u registru - količina i iznos (trošak)
Dakle, znamo količinu robe iz dokumenta - koliko otpisujemo, ali trošak - ne.
To možemo saznati samo iz registra, ali kako bismo osigurali da niko ne mijenja registar između trenutka prijema stanja i trenutka evidentiranja kretanja, moramo zaključati registar i prije očitavanja stanja.
Dakle, u ovom slučaju se koristi objekt Data Locking. A kada ga kreirate, ispravnije je naznačiti po kojim dimenzijama blokiramo registar (na primjer, u našem slučaju - samo prema stavci navedenoj u dokumentu) - tako da nema nepotrebnih brava i drugi korisnik može prodati drugu stavka.


1. Postavite zaključavanje pomoću objekta Data Lock
2. Pročitajte ostatak
3. Provjeravamo mogućnost otpisa
4. Kreiramo kretanja, na primjer, otpisujemo robu
5. Nakon knjiženja dokumenta, blokiranje se automatski uklanja (blokada je važeća kao dio transakcije knjiženja i automatski se uklanja od strane sistema). Odnosno, nema potrebe za posebnim otključavanjem objekta.

2) Nova metodologija za obradu dokumenata (pomoću svojstva LockForChange = True)

Koristi se ako nam nisu potrebni podaci iz upisnika za formiranje kretanja, a možemo provjeriti da li smo otišli u minus prilikom otpisa ako nakon evidentiranja pogledamo stanja u registru i vidimo da ima negativnih . U tom slučaju ćemo shvatiti da smo otpisali previše i otkazat ćemo operaciju otpisa.

primjer:
Razmotrimo operaciju prodaje proizvoda.
U dokumentu - količina, u registru - samo količina
Dakle, količinu robe znamo iz dokumenta.
Pokrete formiramo sa količinom koja je navedena u dokumentu i evidentiramo ih. Zatim čitamo registar, gledamo stanja i analiziramo da li ima negativnih. Ako postoji, prikažite grešku i postavite Odbijanje = Tačno.

Odnosno, redosled je ovakav:
1. Za kretanje kroz registar, postavite svojstvo BlockForChange = True
2. Kreiramo pokrete - otpisujemo robu
3. Zabilježite pokrete
4. Pročitajte registar i uvjerite se da nema negativnih stanja. Ako ima, onda su otpisali višak, ako ne, onda je sve u redu.

Dakle, u ovom slučaju nema potrebe da označavamo kojim dimenzijama trebamo blokirati registar.
Jednostavno postavljamo svojstvo BlockForChange na True prije snimanja naših kretanja, formiranja kretanja i snimanja.
Sistem će sam blokirati registar u trenutku snimanja prema potrebnim mjerenjima, analizirajući ono što smo snimili.
Kada se završi, blokiranje će biti uklonjeno.

Ova opcija (druga) je jednostavnija, zove se “nova metodologija za obradu dokumenata” i 1C preporučuje da je koristite ako je moguće i oduzima bodove ako se koristi prva opcija, ali u nekim slučajevima jednostavno se ne može primijeniti, a prva opcija s koristi se Data Locking objekt (vidi gornji primjer).

Također napominjem da bez obzira na odabranu metodu, pokrete je potrebno očistiti prije rada s njima (vidi prethodni savjet)

*************************************************************************************************
Blokiranje podataka (metoda blokiranja br. 1 iz gornjeg opisa)

Kontrolirano zaključavanje je potrebno tamo gdje se podaci čitaju i kreću se na osnovu tih podataka
Najbrži način da dobijete upravljani kod za zaključavanje je da unesete „Zaključavanje podataka“, pozovete Sintaksnog pomoćnika i jednostavno kopirate primjer koda odatle. Zatim ga jednostavno promijenite u naziv vašeg registra i dimenzije.

To izgleda otprilike ovako:

Zaključavanje = NewDataLock; Element zaključavanja = Locking.Add("Registar akumulacije.GoodsInWarehouses"); LockElement.Mode = DataLockMode.Exclusive; BlockingElement.DataSource = PM; Locking Element.UseFromDataSource("Nomenklatura", "Nomenklatura"); Lock.Lock();

*************************************************************************************************
Tabelarni dio dokumenata bolje je nazvati jednostavno "TC"

U 99% dokumenata postoji samo jedan tabelarni dio. Takav jedinstveni naziv za tabelarne dijelove uvelike će pomoći u uštedi vremena, jer:
1) Vrlo kratko - pišite brzo
2) Isto za sve dokumente, ne morate pamtiti kako se zove kada pišete kod

*************************************************************************************************
Rezultat upita treba provjeriti da li je prazan prije preuzimanja ili učitavanja prema tehničkoj specifikaciji.

Općenito, koristio sam uzorkovanje u svim zadacima.

Uzorkovanje je optimalnije za sistem u smislu performansi, jer je „izoštreno“ samo za čitanje podataka (za razliku od TK).

Ali u svakom slučaju, prije metode Select() bolje je provjeriti da li je rezultat upita prazan, to će dodatno smanjiti opterećenje sistema.

Rezultat = Query.Run(); Ako nije Result.Empty() Onda Select = Result.Select(TravelQueryResult.ByGrouping); ... EndIf;

I u slučaju da trebamo dobiti samo jednu vrijednost iz zahtjeva
(na primjer, samo metodom otpisa u skladu sa računovodstvenom politikom utvrđenom za ovu godinu):

Rezultat = Query.Run(); Ako nije Result.Empty() Onda Select = Result.Select(); Selection.Next(); Metoda otpisa troškova = Sample.Cost Write-Off Method; endIf;

*************************************************************************************************
Dokument "Operacija" za računovodstveni zadatak

Za računovodstvene poslove potrebno je izraditi Operativni dokument.

Za njega potpuno onemogućimo knjiženje (u svojstvima “Knjiženje = Zabrani”), naznačimo da vrši kretanja u registru računovodstva i prevučemo kretanja na obrazac.

*************************************************************************************************
Brza obrada dokumenata:

Mora biti uključeno:
U operativnom i računovodstvenom. računovodstvo dokumenata mora biti omogućeno (osim dokumenta „Operacija“, vidi dole).

Mora biti ugašeno:
u obračunskim zadacima nema smisla za platni spisak.

Za dokument "Operacija" knjiženje treba potpuno onemogućiti (u svojstvima dokumenta "Knjiženje = zabrani"),
pošto piše jednostavno upisuje podatke direktno u registar prilikom pisanja.

*************************************************************************************************
Uvjet u zahtjevu obrasca "Ili navedena nomenklatura ili bilo koja, ako nije navedena"

U upitima se susreće sa sljedećim zadatkom: na primjer, trebate odabrati dokumente sa određenom nomenklaturom ili sve dokumente ako nomenklatura nije navedena.
Rešava se sledećim uslovom u samom zahtevu:

Nomenklatura = &Nomenklatura ILI &Nomenklatura = Vrijednost(Directory.Nomenclature.EmptyLink)

Ali bilo bi optimalnije i ispravnije transformirati ovo stanje (hvala yukon):


Zahtjev.Tekst = Zahtjev.Tekst + "WHERE Nomenklatura = &Nomenklatura";

endIf;

Pojavom objektnog modela upita u 8.3.5, bit će moguće sigurnije dodati uvjet:

Ako je ValueFilled (nomenklatura) Onda
Query1.Selection.Add("Item = &Nomenklatura");
Request.SetParameter("Nomenklatura", Nomenklatura);
endIf;

*************************************************************************************************
Spajanje tabela u upite:

Broj ukupnih zapisa ne zavisi od toga da li je polje spojene tabele prikazano, zavisi samo od konfigurisanih relacija.
To jest, polje priložene tabele možda neće biti prikazano.

Ako želite da priložite tabelu bez ikakvih uslova, onda na kartici sa uslovima jednostavno napišite uslov “TRUE”.
U ovom slučaju, tabela će biti tačno spojena.

*************************************************************************************************
Koristeći plan tipova karakteristika (PVC):

1. Koristite kao mehanizam za opisivanje karakteristika objekata.

1.1. Izrađujemo PVC. To će biti Tipovi karakteristika (na primjer, boja, veličina, maks. brzina, itd.). U postavkama odaberite sve moguće vrste karakterističnih vrijednosti i, ako je potrebno, kreirajte objekt iz točke 1.2 i navedite ga u postavkama.

1.2. Za dodatne vrijednosti PVC-a kreiramo podređeni direktorij AdditionalValues ​​of Characteristics (ili jednostavno Vrijednosti karakteristika).
Pohranit će karakteristike ako se ne nalaze u postojećim direktorijima. Možda ga nećemo kreirati ako se sve karakteristike koje su nam potrebne nalaze u postojećim direktorijima, ili te vrijednosti mogu biti predstavljene elementarnim tipovima podataka. U PVC postavkama označavamo da će se ovaj direktorij koristiti u dodatne svrhe. vrijednosti karakteristika.

1.3. Kreiramo registar informacija, koji zapravo povezuje tri objekta:
- Objekt na koji povezujemo mehanizam karakteristika
- Karakteristike tipa (PVC tip)
- Vrijednost karakteristika (tip - karakteristika, ovo je novi tip koji se pojavio u sistemu nakon kreiranja PVC-a
i opisivanje svih mogućih tipova podataka koje karakteristična vrijednost može poprimiti).
U registru informacija navodimo da je Tip karakteristike vlasnik za vrijednost karakteristike (link na parametar odabira), kao i vezu tipa za vrijednost karakteristike, opet iz tipa karakteristike.

Još jedna karakteristika je da za svaki kreirani tip karakteristike možete odrediti tip vrijednosti karakteristike, ako vam nisu potrebni svi mogući tipovi da opišete vrijednost ove karakteristike.

2. Korištenje PVC-a za kreiranje pod-konto mehanizma za računovodstveni registar .

2.1. Izrađujemo PVC TypesSubconto.

2.2. Kreiramo podređeni direktorij ValuesSubConto (kao i kod karakteristika, on će sadržavati podkonto vrijednosti ako ih nema u drugim direktorijima).

2.3. Komunikacija se vrši pomoću kontnog plana.

*************************************************************************************************
Resursi računovodstvenog registra:

Iznos - bilans stanja,
Količina – vanbilansna i povezana sa računovodstvenom karakteristikom Kvantitativno

*************************************************************************************************
Virtuelne tabele računovodstvenih registara:

Promet: promet na jednom računu
PrometDtKt: promet između bilo koja dva računa, odnosno sve iste transakcije za period.

*************************************************************************************************
Valutno računovodstvo na računovodstvenim registrima - kako implementirati:

U kontnom planu kreiramo računovodstveni atribut „valuta“.
U računovodstvenom registru dodatno kreiramo:
- Valutna dimenzija (zabrana praznih vrijednosti, vanbilansnih, računovodstvenih atributa - valuta)
- resurs CurrencyAmount (vanbilansni, računovodstveni atribut - valuta, pohranit će iznos u valuti, tj. 100$ na primjer)
Sve.

Dakle, struktura registra je:

Mjerenja:
- Valuta
Resursi
- Količina
- Iznos (iznos u rubljama)
- CurrencyAmount (iznos u valuti)

Dakle, valutno računovodstvo je samo rafiniranje konvencionalnog računovodstva u Republici Bjelorusiji; ono ne mijenja suštinu, na primjer, iznosa resursa
(tamo je, kao i obično, iznos u rubljama, bez obzira da li je račun u stranoj valuti ili ne).
A ako je funkcija valutnog računovodstva isključena za račun, onda je ovo uobičajena struktura Republike Bjelorusije (resursi - samo količina i iznos).

*************************************************************************************************
Prilikom postavljanja parametara virtuelne tabele da bi se dobio deo potonje, namećemo uslove na dimenzije, a ne na resurse.

U suprotnom, nećemo dobiti dio najnovijih, već posljednji zapis sa navedenom vrijednošću resursa - možda neće biti posljednji u skupu dimenzija

*************************************************************************************************
Značenje izvora i detalji u registru obračuna

U računskim registrima kreiranje resursa omogućava njegovo primanje prilikom izračunavanja baze pomoću ovog registra.
Pa čak i proporcionalno datom periodu, vrijednost resursa će biti preračunata (ako se bazni period ne poklapa sa periodikom registra).

A vrijednost atributa je dostupna samo u stvarnoj tablici registra proračuna; nije dostupna u virtualnim tablicama.

*************************************************************************************************
Potvrdni okvir "Osnovno" u svojstvima dimenzije registra proračuna
To znači da će se iz ove dimenzije u budućnosti dobiti baza i služi za dodatno indeksiranje vrijednosti za ovo polje.

*************************************************************************************************
Pregled perioda važenja godišnjih odmora po mjesecima prilikom evidentiranja kompleta upisa,
ako je odmor naveden u dokumentu u jednom redu nekoliko mjeseci odjednom u jednom redu:

StartDate of CurrentMonth = Početak mjeseca(TexLineMainAccruals.ActionPeriodStart); CurrentMonthEndDate = EndMonth(TexLineMainAccruals.ActionPeriodStart); CurrentMonth = Datum; WhileDateStartCurrentMonth<= НачалоМесяца(ТекСтрокаОсновныеНачисления.ПериодДействияКонец) Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = Ложь; Движение.ВидРасчета = ТекСтрокаОсновныеНачисления.ВидРасчета; Движение.ПериодДействияНачало = Макс(ДатаНачалаТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияНачало); Движение.ПериодДействияКонец = КонецДня(Мин(ДатаОкончанияТекМесяца, ТекСтрокаОсновныеНачисления.ПериодДействияКонец)); Движение.ПериодРегистрации = Дата; Движение.Сотрудник = ТекСтрокаОсновныеНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаОсновныеНачисления.Подразделение; Движение.Сумма = 0; Движение.КоличествоДней = 0; Движение.График = ТекСтрокаОсновныеНачисления.График; Движение.Параметр = ТекСтрокаОсновныеНачисления.Параметр; Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Дата, -3)); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(Дата, -1))); ДатаНачалаТекМесяца = НачалоМесяца(ДобавитьМесяц(ДатаНачалаТекМесяца, 1)); ДатаОкончанияТекМесяца = КонецМесяца(ДатаНачалаТекМесяца); КонецЦикла; КонецЕсли;

*************************************************************************************************
Izgradnja gantograma:

Stavljamo element tipa “Gantt Chart” na obrazac, nazivamo ga DG, zatim kreiramo naredbu “Generate” i upisujemo sljedeće u modul obrasca:

&OnClient procedura Generiraj(naredba) GenerateOnServer(); Kraj procedure &na serveru Procedura GenerateOn Server() DG.Clear(); DG.Update = False; Zahtjev = Novi Zahtjev("SELECT |BasicAccrualsActualActionPeriod.Employee, |BasicAccrualsActualActionPeriod.CalculationType, |BasicAccrualsActualActionPeriod.ActionPeriodStart AS ActionPeriodStart, |BasicAccrualsActualActionPeriod.Per. ROM |Registar izračuna.BasicAccruals.ActualPeriodActions AS BasicAccrualsActualPeriodActions |GDJE |BasicAccrualsActualPeriodActions.PeriodActions IZMEĐU &Datum početka I &EndDate "); Query.SetParameter("StartDate", Period.StartDate); Request.SetParameter("EndDate", Period.EndDate); Odaberite = Query.Run().Select(); Dok Selection.Next() Tačka petlje = DG.SetPoint(Selection.Employee); Serija = DG.SetSeries(Selection.CalculationType); Vrijednost = DG.GetValue(Point, Series); Interval = Value.Add(); Interval.Start = Sample.PeriodActionStart; Interval.End = Sample.ActionPeriodEnd; EndCycle; DG.Update = Tačno; Kraj procedure

Zapravo, ovdje nam je važan samo kod u petlji, ostale stvari su pomoćne, samo sam dao cijelu implementaciju ovog podzadatka.
U zahtjevu nam je bitno da postoji zaposlenik, vrsta uplate, datum početka i datum završetka perioda.
Kôd je zapravo vrlo jednostavan, lako se pamti, nemojte se uznemiravati ako vam se čini glomaznim

*************************************************************************************************
Obrada unosa „preokretanja“ u računskim zadacima:

U proceduri obrade transakcije (objektni modul) formiramo sva kretanja, a onda ako postoje zapisi u drugim periodima dobijamo ih ovako
(sistem ih automatski generiše - pomaže nam):

Zapisi o dodavanju = Movements.MainAccruals.GetAddition(); // Nema potrebe da snimate pokrete da biste dobili dodatak

Za svaku tehničku liniju iz ciklusa dodavanja zapisa
Zapis = Pokreti.Glavni obračuni.Dodaj();
FillPropertyValues(Record, TechString);
Record.RegistrationPeriod = TechString.RegistrationPeriodReversal;
Record.ActionPeriodStart = TechString.ActionPeriodStartReverse;
Record.ActionPeriodEnd = TechString.ActionPeriodEndReversal;
Kraj ciklusa

I prilikom izračunavanja zapisa ubacite čekove:

Ako TechMotion.Reversal Onda
CurrentMovement.Sum = - CurrentMovement.Amount;
endIf;

*************************************************************************************************
Kako odrediti šta je uključeno u glavna, a šta u dodatna razgraničenja u obračunskim zadacima.

Ali to nije uvijek 100% jasno; ima i komplikovanijih slučajeva, iako ih ima poprilično
(na primjer, bonus koji zavisi od broja radnih dana u mjesecu - ovo je HE).

Osnovne naknade:
Ako vrsta obračuna zavisi od rasporeda (što znači registar informacija sa kalendarskim datumima), onda se odnosi na glavne naknade.

Primjer OH:
- Plata
- Nešto što se računa od broja radnih dana (a za to je potrebno koristiti raspored): ili u periodu važenja (kao plata) ili u baznom periodu

Dodatne naknade:
Ono što se uzima u obzir ili od akumuliranog iznosa, ili vremena RADA (a ne norme!), ili uopće ne ovisi - ovo je dodatno. razgraničenja.

Odnosno: razgraničenja za čije se obračunavanje koristi vremenski standard (možda i činjenica) su OH, a za koje nisu potrebni stvarni podaci ili ništa je DN.

Ili drugim riječima:

Ako VR koristi vremenski standard, onda se period važenja mora uključiti za VR.

*************************************************************************************************
Dodajte mogućnost otvaranja ugrađenog odjeljka pomoći "Rad sa referentnim knjigama" u obliku liste direktorija "Nomenklatura".

Pokrenite naredbu na obrascu:

&OnClient
Pomoć za proceduru (komanda)
OpenHelp("v8help://1cv8/EnterprWorkingWithCatalogs");
Kraj procedure

Liniju presjeka definiramo na sljedeći način:
Idite na informacije o pomoći konfiguracijskog objekta (u konfiguratoru), napišite riječ, odaberite je, idite na izbornik Elementi/Link i odaberite željeni odjeljak 1C pomoći, nakon čega se veza automatski ubacuje. Izgleda komplikovano, ali u praksi je lako.

*************************************************************************************************
Implementacija interakcije između oblika, na primjer, odabir:

1. Iz trenutnog obrasca otvorite željeni koristeći metodu “OpenForm()”, prosljeđujući strukturu s parametrima kao drugi parametar (ako je potrebno). Treći parametar može prenijeti vezu na ovaj obrazac - ThisForm.

2. U otvorenom obliku, u rukovatelju “When CreatedOnServer()”, možemo uhvatiti parametre proslijeđene u koraku 1 kroz “Parameters.[ParameterName]”. Obrazac koji je pokrenuo otvaranje ovog obrasca biće dostupan preko identifikatora „Vlasnik“ (ako je, naravno, naveden u koraku 1).

I što je najvažnije, biće dostupne funkcije izvoza obrasca vlasnika. To jest, možemo pozvati funkciju izvoza izvornog obrasca i prenijeti nešto tamo kao parametar za obradu odabira. I ova funkcija će već ispuniti ono što je potrebno u originalnom obrascu. Postoji samo jedno upozorenje - ne možete proslijediti tablicu vrijednosti između klijentskih procedura, ali možemo je smjestiti u privremenu memoriju i jednostavno proslijediti VX adresu, a zatim je izdvojiti iz VX-a.

*************************************************************************************************
Životni ciklus parametara obrasca

Svi parametri preneseni u obrazac u trenutku njegovog otvaranja vidljivi su samo u proceduri “When CreateOnServer”.
Nakon kreiranja, svi parametri se uništavaju i više nisu dostupni na obrascu.
Izuzetak su parametri koji su deklarisani u uređivaču obrasca sa atributom „Ključni parametar“.
Oni određuju jedinstvenost forme.
Ovaj parametar će postojati sve dok postoji sama forma.

*************************************************************************************************
Korištenje interfejsa Taxi

Tokom razvoja, možete podesiti uobičajeni upravljani interfejs 8.2 u svojstvima konfiguracije - ovo sve čini primetno kompaktnijim i poznatijim.
Ovo je posebno tačno ako iznajmljujete na daljinu - rezolucija ekrana je vrlo mala i nemoguće je bilo šta učiniti sa interfejsom "taksi".
Samo ne zaboravite ponovo staviti "Taxi" kada završite!U suprotnom, ispitivač će oduzimati bodove!

*************************************************************************************************

PS: E Postoje zasebni standardni podzadaci koji se koriste u svim zadacima, a upravo njih morate znati rješavati (na primjer, otpisivanje po serijama, korištenje PVC-a (pa, ovo je stvarno rijetko) i drugo). I u svim zadacima se jednostavno ponavljaju (negdje postoje neki podzadaci, negdje drugdje, samo u različitim kombinacijama). Štoviše, odavno su obećali da će objaviti novu kolekciju (ako već nisu), u kojoj bi trebalo biti mnogo više problema, odnosno nema smisla pamtiti rješenja pojedinačnih problema, ima smisla naučiti kako se riješite pojedinačne standardne podzadatke, tada ćete riješiti svaki problem.

PSS: Kolege, ako neko ima još neku korisnu informaciju o pripremama za ispit i polaganju, neka piše u komentarima pa ćemo dodati u članak.