1c odaberite dozvoljeno. Sveska programera. Ograničite pristup na nivou zapisa

Konfiguracijski objekt "uloga" daje skup prava na operacije (akcije) na konfiguracijskim objektima.

Uloga "Puna prava".

Ovo je samo uloga (nije unaprijed definirana) koja ima potvrdne okvire za sve vrste prava na svim konfiguracijskim objektima.

Njegova razlika u odnosu na druge uloge je prisustvo prava „Administracija“.

Ako je barem jedan korisnik kreiran, sistem počinje provjeravati pravo "Administracija" - mora ga imati barem jedan korisnik.

Ograničite pristup na nivou zapisa

Sigurnost na nivou reda (RLS) - Ograničenje na nivou zapisa.

Mehanizam ograničenja pristupa podacima omogućava vam da upravljate pravima pristupa ne samo na nivou metapodataka, već i na nivou objekata baze podataka. Za ograničavanje pristupa podacima mogu se koristiti sljedeći objekti:

  • uloge,
  • opcije sesije,
  • funkcionalne opcije,
  • privilegovani zajednički moduli,
  • ključna riječ DOZVOLJENA u jeziku upita.

Mehanizam je dizajniran da ograniči pristup zapisima tablice objekata metapodataka prema proizvoljnim uvjetima nametnutim vrijednostima polja reda ovih tabela. Na primjer, da vidite zapise samo za "vaše" ugovorne strane, organizacije itd.

Tehnička implementacija ograničenja pristupa u 1C

1C generiše zahtjev za DBMS. Klaster servera dodaje zahtjevu odjeljak WHERE koji sadrži tekst uvjeta za ograničavanje pristupa od strane RLS-a, zatim se ovaj zahtjev šalje u DBMS, ekstrahovani podaci se vraćaju 1C klijentu.


Ovaj mehanizam će raditi za svaki zahtjev klijenta:

  • u izvještajima
  • u dinamičkim listama i regularnim listama
  • u nasumičnim zahtjevima.

Takva implementacija mehanizma uvelike utiče na performanse.

Načini zaobilaženja ograničenja pristupa.

U velikim operacijama koje zahtijevaju velike resurse (na primjer, obrada dokumenata za ponovno objavljivanje), dio koda se može premjestiti u privilegirane module.

ALI) privilegovani modul je zajednički modul sa oznakom "Privilegirano" u svojstvima.

Njegova posebnost leži u činjenici da se kod u njemu izvršava bez ikakve kontrole pristupa, uključujući RLS.


B) Takođe privilegovan način rada može biti omogućen za module objekata dokumenata. To se radi u svojstvima dokumenta, zastavica

  • Privilegirani način rada kada držite
  • Privilegirani način rada prilikom poništavanja rasporeda


B) Metoda SetPrivilegedMode()

Sistemska naredba koja vam omogućava da dio koda bilo kojeg modula učinite privilegiranim.

Od sljedećeg reda koda, na snazi ​​će biti privilegirani način izvršavanja.

Djelovat će do linije za onemogućavanje ovog načina rada ili do kraja procedure/funkcije

(Tačno);

// bilo koji kod ovdje će biti izvršen bez kontrole prava i RLS-a

SetPrivilegedMode(Laž); // ili kraj procedure / funkcije

Broj aktivacija privilegovanog načina rada mora odgovarati broju deaktivacija. Međutim, ako je privilegirani način rada bio omogućen (jednom ili više) unutar procedure ili funkcije, ali nije onemogućen, sistem će ga automatski onemogućiti onoliko puta koliko je bilo aktivacija na čekanju u proceduri ili funkciji koja se napušta.

Ako u proceduri ili funkciji poziva metode SetPrivilegedMode(False) više od poziva metoda SetPrivilegedMode(tačno) tada će biti izbačen izuzetak

Funkcija PrivilegedMode() vraća True ako je privilegirani način i dalje omogućen, i False ako je privilegirani način potpuno onemogućen. Ne analizira broj postavki privilegovanog načina rada u određenoj funkciji.

Sve pozvane procedure i funkcije će se također izvršiti u privilegovanom načinu.


Također je moguće pokrenuti privilegovanu sesiju. Ovo je sesija u kojoj se privilegirani način postavlja od samog početka sistema. Istovremeno, tokom rada, metoda PrivilegedMode() će uvijek vratiti True , a mogućnost onemogućavanja privilegovanog načina rada nije podržana. Samo korisnik sa administrativnim pravima (pravo administracije) može započeti privilegovanu sesiju. Početak sesije se može obaviti pomoću ključa komandna linija pokretanje klijentske aplikacije UsePrivilegedMode ili parametar niza veze infobaze prmod .


Postavlja se prirodno pitanje: zašto onda uopće postavljati ograničenja pristupa, ako se to tako lako može zaobići?

Siguran način.

Da, moguće je pisati eksternu obradu sa privilegovanim načinom izvršavanja i isprazniti/okvariti podatke. Da bi se to spriječilo, sistem ima metodu globalnog konteksta

Postavite SafeMode().

Sigurni način rada, između ostalog, zanemaruje privilegirani način rada.

Mora se postaviti prije programskog pozivanja vanjskih rukovatelja ili eksportnih procedura i funkcija iz njihovih modula.

Izbacuje izuzetak prilikom izvođenja zabranjenih operacija u vrijeme izvođenja.

Osim toga, za korisnike možete isključiti mogućnost interaktivnog pokretanja vanjskih izvještaja i obrade na nivou postavki uloge.

Postavka ograničenja pristupa

RLS se može konfigurirati samo za prava:

  • čitanje (odaberi)
  • dodavanje (ubaci)
  • promijeniti (ažurirati)
  • brisanje (brisanje)

Za operacije čitanja i brisanje, objekt u bazi podataka mora biti u skladu sa ograničenjem pristupa podacima.

Za operaciju dodavanja ograničenje pristupa podacima mora odgovarati objektu koji se planira upisati u bazu podataka.

Za operaciju promjene Ograničenje pristupa podacima mora odgovarati objektu i prije promjene (da bi se objekt pročitao) i nakon promjene (da bi se objekt upisivao).

Za sva ostala prava ova opcija nije dostupna.

Dodajmo novo ograničenje za pravo "čitanja" referentne knjige "Nomenklatura". Otvoriće se lista polja za koja možete konfigurisati dodano ograničenje.

To znači da ako pokušate da pristupite poljima za potvrdu, ograničenje će raditi, ali ako pokušate da pristupite nepotvrđenim poljima, ograničenje neće raditi.

Ako odaberete zastavu Ostala polja“, ograničenje će biti postavljeno za sva polja tabele, osim za polja za koja su ograničenja postavljena eksplicitno.


*Funkcija: za prava na dodavanje, promjenu, brisanje:

  • Ograničenje se može konfigurirati samo za sva polja.
  • Može postojati samo jedno ograničenje.

Za pravo "Čitanje" možete postaviti nekoliko uslova, oni će biti kombinovani sa logičkim operatorom "AND".

U ograničenjima na objekte baze podataka sljedećih tipova, ne mogu se koristiti sva polja glavnog objekta podataka ograničenja:

  • u registrima akumulacije ograničenja pristupa mogu sadržavati samo mjerenja glavnog objekta ograničenja;
  • u računovodstvenim registrima u ograničenjima možete koristiti samo bilansne mjere glavnog objekta ograničenja

Ako se u uslovima ograničenog pristupa podacima registra akumulacije prometa koriste mjerenja koja nisu uključena u zbrojeve, tada se pri pristupu virtuelnoj tablici prometa ne koriste pohranjeni zbrojevi i upit se izvršava u potpunosti prema kretanju. sto.

Mehanizam za nametanje ograničenja pristupa.

Svaka operacija nad podacima pohranjenim u bazi podataka u 1C:Enterpriseu na kraju rezultira pristupom bazi podataka sa nekim zahtjevom za čitanje ili izmjenu podataka. Tokom izvršavanja upita bazi podataka, interni mehanizmi 1C:Enterprise nameću ograničenja pristupa. pri čemu:

  • Formira se lista prava(čitanje, dodavanje, ažuriranje, brisanje), lista tabela baze podataka i lista polja koja koristi ovaj upit.
  • Iz svih uloga trenutnog korisnika odaberite ograničenja pristupa na podatke za sva prava, tabele i polja uključena u zahtjev. Štoviše, ako bilo koja uloga ne sadrži ograničenja pristupa podacima bilo koje tablice ili polja, to znači da su vrijednosti potrebnih polja iz bilo kojeg zapisa dostupne u ovoj tablici. Drugim riječima, odsustvo ograničenja pristupa podacima znači da postoji ograničenje WHERE True.
  • Dobijte trenutne vrijednosti svih parametara sesije i funkcionalnih opcija učestvovanje u odabranim ograničenjima.

Da biste dobili vrijednost parametra sesije, ili funkcionalna opcija trenutni korisnik ne mora imati pravo da dobije ovu vrijednost. Međutim, ako vrijednost nekog parametra sesije nije postavljena, tada će doći do greške i upit baze podataka neće biti izvršen.

Ograničenja izvedena iz iste uloge kombiniraju se s operacijom AND.

Ograničenja primljena iz različitih uloga kombiniraju se s operacijom OR.

Konstruirani uvjeti se dodaju u SQL upite s kojima 1C:Enterprise pristupa DBMS-u. Prilikom pristupa podacima sa strane uvjeta ograničenja pristupa, ne vrši se nikakva provjera prava (ni na objekte metapodataka, niti na objekte baze podataka). Štaviše, mehanizam za dodavanje uslova zavisi od izabranog načina rada ograničenja „sve“ ili „dozvoljeno“.


*Fakcija: Ako korisnik ima pristup više uloga sa konfigurisanim ograničenjima na nivou zapisa za jedan objekat, tada se u ovom slučaju uslovi ograničenja dodaju logičkom operacijom "ILI". Drugim riječima, korisničke dozvole su kumulativne.

Ovo dovodi do sljedećeg zaključka: ne dozvolite da se pređe uvjet ograničenja pristupa jednom objektu u različitim ulogama, jer će u tom slučaju tekst upita postati mnogo komplikovaniji i to će uticati na performanse.

Do kraja.

Kada se nametnu ograničenja metodom "sve", SQL upitima se dodaju uslovi i polja kako bi 1C:Enterprise mogao dobiti informaciju o tome da li su podaci koji su zabranjeni za datog korisnika korišteni u procesu izvršavanja upita baze podataka ili ne . Ako su korišteni zabranjeni podaci, zahtjev se poništava zbog kršenja pristupa.

Nametanje ograničenja pristupa metodom "svi" shematski je prikazano na slici:


Metoda "Dozvoljeno".

Kada se ograničenja nametnu korištenjem “dozvoljene” metode, takvi uvjeti se dodaju u SQL upite tako da zapisi zabranjeni za trenutnog korisnika ne utječu na rezultat upita. Drugim riječima, kada su ograničenja nametnuta u „dozvoljenom“ načinu rada, zapisi zabranjeni za ovog korisnika smatraju se nedostajućim i ne utiču na rezultat operacije, što je shematski prikazano na slici:


Ograničenja pristupa podacima nameću se objektima baze podataka kada 1C:Enterprise pristupa bazi podataka.

U verziji klijent-server 1C:Enterprise, ograničenja se primjenjuju na 1C:Enterprise server.

Međutim, ova opcija (DOPUŠTENA) neće raditi ako se u upitu pozivamo na tablicu za koju nisu konfigurirana ograničenja pristupa, ali u kojoj postoje veze na redove tablice s konfiguriranim ograničenjima. U ovom slučaju, rezultat upita će biti "<Объект не найден>…...” umjesto vrijednosti referentnog polja.


Ako razvijate izvještaj ili obrađujete koristeći generičke ili prilagođene konfiguracijske upite, uvijek provjerite oznaku "Dozvoljeno". da bi izveštaj funkcionisao pod bilo kojim korisnikom sa bilo kojim skupom prava.

U slučaju čitanja podataka objekta iz baze podataka, nije moguće postaviti oznaku "Dozvoljeno". Stoga je neophodno konfigurirati odabire za čitanje objekata, uzimajući u obzir moguća ograničenja prava pristupa za korisnika. U objektnoj tehnologiji ne postoje načini za dobijanje samo dozvoljenih podataka.

Važno je da ako ključna riječ ALLOWED nije navedena u upitu, tada svi filteri navedeni u tom upitu ne smiju biti u sukobu s bilo kojim ograničenjem čitanja objekata baze podataka korištenim u upitu. Štoviše, ako se u upitu koriste virtualne tablice, tada se odgovarajući filteri moraju nametnuti samim virtualnim tablicama.

Vježba 1. Kreator upita u RLS postavkama.

Hajde da sastavimo tekst odeljka "WHERE" u upitu za direktorijum. Možete koristiti alatku za pravljenje upita.
Konstruktor je skraćen.


Kartica "Tabele"

Glavna tabela će biti tabela objekta za koji se konfiguriše ograničenje.

Također možete odabrati druge tabele i postaviti različite odnose između njih na kartici "Relationships".

Kartica Uslovi

Ovdje možete konfigurirati stvarne uvjete za ograničavanje pristupa.

Dodajmo uslove za atribut "Cijena" direktorija berzanske liste za pravo "čitanja" u sva polja tabele.

"Nomenklatura GDJE Nomenklatura. Cijena > 500"

Pogledajmo kako ovo jednostavno pravilo funkcionira. Referentna tabela sadrži sljedeće elemente:


Nakon postavljanja ograničenja pristupa, tabela će prikazati samo elemente koji zadovoljavaju uslov:


Grupe su također nestale. Promijenite tekst ograničenja

"Nomenklatura GDJE Nomenklatura. Cijena > 500

ILI Nomenklatura. Ovo je grupa"

Pa, evo šta vam treba.


Ako uklonite prikaz polja "šifra" u postavkama liste, bit će prikazani svi elementi imenika, tj. ograničenje nije uspjelo. Ako postavite prikaz polja "Šifra", ograničenje će raditi.


Istovremeno, uprkos činjenici da je element pretraživanja vidljiv u polju liste, njegov obrazac se ne može otvoriti, jer je postavljeno ograničenje na atribut. Isto u proizvoljnom zahtjevu: kada pokušate dobiti "restricted" atribut, doći će do greške u pristupu.


Ako pokušate programski dobiti "ograničene" propse, također će se pojaviti greška u pristupu.


Štaviše, preko veze će biti nemoguće pristupiti bilo kojim poljima objekta, jer kada se link primi, sistem čita ceo objekat, a ako ima „ograničene“ detalje, objekat neće biti pročitan.

Stoga, kada programski radite s objektima baze podataka, morate imati na umu moguća ograničenja na razini zapisa i upitom dobiti sve potrebne podatke o objektu, a zatim ih smjestiti u strukturu ili izvršiti dio koda u privilegovanom modulu.

Nakon postavljanja ograničenja pristupa, prikaz linije na listi prava se promijenio - postao je siv i pojavila se ikona.

Ograničenja konfiguracije pristupa (RLS).

  • Nema odjeljka sa sažetkom;
  • Ne možete pristupiti virtualnim registarskim tablicama;
  • Ne možete eksplicitno koristiti parametre;
  • Podupiti mogu koristiti bilo koje>/span> mogućnosti jezika upita, osim:
    • operator U HIERARHIJI;
    • nudi REZULTATE;
    • ugniježđeni rezultati upita ne smije sadržavati tabelarne dijelove>/span>;
    • virtuelne tabele, posebno stanja i promet

Vježba 2. Nomenklatura sa trenutnom cijenom.

Ograničite pristup ako trebate prikazati stavku čija je trenutna cijena veća od određene vrijednosti, na primjer 100.

Rješenje:

Dodali smo novo pravilo ograničenja pristupa za referentnu knjigu "Nomenklatura" za pravo "čitanja".
Odaberite "druga polja".
U konstruktoru dodajte ugniježđeni upit. U njemu odaberite tablicu registra informacija "Cijene artikala".
Ne postoji kartica "narudžba" - ovo je karakteristika graditelja upita za izgradnju upita za ograničenje pristupa.
Na kartici "Napredno" postavite "prvi 999999999", pojavila se kartica "narudžba".
Podesite redosled po polju "Period" u opadajućem redosledu.
Zatim postavljamo vezu glavne tabele sa podupitom referencom.


Predlošci ograničenja pristupa.

Vježba 3. Ograničenje na "ugovarače" vrijednosti u konstanti.

Postavite ograničenje pristupa za imenik Counterparties po vrijednosti pohranjenoj u Konstanti.

Osim toga, morate postaviti ograničenje za sve objekte koji koriste direktorij "Ugovarači" u detaljima.

Rješenje

Za referentnu knjigu „Računi“, za pravo „čitanja“, postavićemo ograničenje dodavanjem ugnežđenog upita konstanti u odeljku „Uslovi“. Ne zaboravite ovu grupu.

Vidimo problem, imenik Counterparties je ispravno filtriran i prikazani su svi dokumenti sa atributom “Counterparty”, neki sa “pokvarenim” vezama u atributu “Counterparty”.

Sada morate konfigurirati ograničenje pristupa za sve objekte koristeći vezu na "Računi". Pronađimo ih uslugom "traži linkove do objekta".

Kopirajmo i malo izmijenimo tekst RLS uslova iz direktorija "Counterparties". Ovo se mora učiniti onoliko puta koliko se nađe objekata.

Ili koristite obrazac ograničenja pristupa da biste izbjegli probleme s dupliciranjem koda.

Predlošci ograničenja pristupa su konfigurirani na razini uloge i mogu se koristiti za bilo koji objekt unutar uređene uloge.

Možete staviti bilo koji dio teksta ograničenja pristupa u predložak. Šablon se poziva pomoću simbola "#". Na primjer, #TemplateContractor.

Preko # u 1C, instrukcije se pišu u pretprocesor. U kontekstu izvršavanja postavki ograničenja pristupa, platforma zamjenjuje tekst poziva šablona tekstom šablona.

Premjestimo tekst iza riječi WHERE u šablon "TemplateContractor", osim teksta o ovoj grupi.

Parametri u predlošcima ograničenja pristupa.

Nastavimo rješavati zadatak 2.

Sada je problem što se glavna tabela u imeniku zove "druga strana", u dokumentu "Faktura". Označeno polje u imeniku se zove "link", u dokumentu - "Counterparty".

Promijenite naziv glavne tabele u tekstu predloška u "#CurrentTable"

"#CurrentTable" je unaprijed definirani parametar.

I kroz tačku označavamo broj ulaznog parametra - “.#Parameter(1)

"#Parameter" je također unaprijed definirana vrijednost. Može sadržavati proizvoljan broj ulaznih parametara. Navedeni su serijskim brojem.

U tekstu ograničenja pristupa direktoriju navodimo sljedeće:

Za dokument slijedeće:

“Prodaja robe GDJE #TemplateContractor(“Izvođač”)”

Prilikom pozivanja predloška ograničenja pristupa, parametri bi mu trebali biti proslijeđeni samo kao String, odnosno u navodnicima.

Glavna tabela - Nomenklatura

Tekst šablona je:

#TrenutnaTabela GDJE #TrenutnaTabela.#Parametar(1) = #Parametar(2)

Tekst predloška sadrži dio teksta na jeziku ograničenja pristupa podacima i može sadržavati parametre koji su istaknuti simbolom "#".

Znak "#" može biti praćen:

  • Jedna od ključnih riječi:
    • Parametar iza kojeg slijedi broj parametra u predlošku u zagradama;
    • CurrentTable - znači umetanje u tekst punog naziva tabele za koju se gradi ograničenje;
    • CurrentTableName– označava umetanje u tekst punog naziva tabele (kao string vrednosti, pod navodnicima), na koju se instrukcija primenjuje, u trenutnoj verziji ugrađenog jezika;
    • NameCurrentPermission– sadrži naziv prava za koje se vrši trenutno ograničenje: READ/READ, ADD/INSERT, MODIFY/UPDATE, DELETE/DELETE;
  • naziv parametra šablona - znači umetanje ograničenja odgovarajućeg parametra šablona u tekst;
  • simbol "#" - označava umetanje jednog simbola "#" u tekst.

Izraz ograničenja pristupa može sadržavati:

  • Obrazac ograničenja pristupa, koji je naveden u formatu #TemplateName("Vrijednost parametra predloška 1", "Vrijednost parametra predloška 2",...). Svaki parametar šablona je stavljen u dvostruke navodnike. Ako trebate navesti znak dvostrukog navodnika u tekstu parametra, koristite dva dvostruka navodnika.
  • Funkcija StrContains (gdje tražimo, šta tražimo). Funkcija je dizajnirana za traženje pojavljivanja WhatLooking u stringu WhereLooking for. Vraća True ako je podudaranje pronađeno, False u suprotnom.
  • Operator + za konkatenaciju nizova.

Za praktičnost uređivanja teksta predloška, ​​na kartici Predlošci ograničenja u obrascu uloge kliknite na dugme Postavi tekst predloška. U dijalogu koji se otvori unesite tekst predloška i kliknite na OK.

Ne mogu se instalirati pomoću setParameter() ili nešto slično.

U ovom slučaju, parametri su:

  • Opcije sesije
  • Funkcionalne opcije

Čitanje parametara sesije u zahtjevu za ograničenje pristupa događa se u privilegovanom načinu rada, tj. bez kontrole prava na rad s njima.

Praksa 4. Pristup „vašim“ ugovornim stranama

Potrebno je postaviti ograničenje pristupa trenutnom korisniku "njihovim" sugovornicima.

Postoji imenik "Korisnici", imenik "Counterparts", dokumenti sa rekvizitom "Counterparty".

Trenutni korisnik treba da vidi podatke samo za one ugovorne strane za koje je sa njim uspostavljena veza.

Komunikaciju također treba konfigurirati.

Moguće opcije:

Uspostavljanje veza korisnik + kontrastrana

  • Detalji u imeniku ugovornih strana
  • Registar informacija

Moguća rješenja problema:

  • Pohranjivanje korisnika u konstantu je loša opcija, konstanta je dostupna svim korisnicima.
  • Održavanje fiksnog niza suprotnih strana trenutnog korisnika u parametrima sesije nije baš dobro. dobra opcija, može biti mnogo kontrastranaka
  • Sačuvajte u sesiji parametre trenutnog korisnika, a zatim zatražite da dobijete listu "njegovih" strana - prihvatljiva opcija.
  • Druge opcije.

Rješenje.

Kreirajmo novi parametar sesije "CurrentUser" i upišemo njegovo popunjavanje u modul sesije.

Kreirajmo registar informacija "Korespondencija menadžera i suradnika"

Kreirajmo novu ulogu iu njoj novo ograničenje pristupa dokumentu "Priznanica".

U tekstu upita ćemo povezati glavnu tabelu sa registrom informacija po Contractor = Contractor i Manager = &CurrentUser. Vrsta veze Interni.

Ako je moguće, bolje je izbjegavati ugniježđene upite u tekstovima ograničenja pristupa, jer će se izvršavati svaki put kada se podaci iz ovog objekta čitaju iz baze podataka.

Provjeravamo - ograničenja rade

*Fakcija : Ako promijenite listu korisnika u registru, ograničenja pristupa će stupiti na snagu odmah bez ponovnog pokretanja korisničke sesije.

Vježba 5. Bez promjene datuma.

Ograničenje uređivanja podataka potrebno je implementirati ranije od datuma određenog za zabranu izmjena.
Korisnici moraju biti ograničeni.

Kreirajmo registar informacija "ChangeBarDateDate" s dimenzijom Korisnik, resursom RestrictedDate.

Izgradimo logiku rješenja na ovaj način:

  • ako korisnik nije naveden, tada se zabrana odnosi na sve korisnike
  • ako postoji ograničenje za sve korisnike i ograničenje za određenog korisnika, onda postoji ograničenje za određenog korisnika, a za ostalo po opštem principu.

Očigledno, takvo ograničenje se može konfigurirati za objekte baze podataka koji imaju određenu poziciju na vremenskoj osi. Može biti

  • Dokumenti
  • Registar periodičnih informacija

Kreirajmo novu ulogu "RestrictionsBy ChangeProhibitionDate".

U njemu ćemo za dokument "Prijemni račun" za pravu "promjenu" dodati novo ograničenje pristupa.

Postavka je navedena za sva polja.

Tekst ograničenja je:

Račun prijema IZ dokumenta Prijemni račun KAO faktura faktura

ChangeProhibitionDates.ProhibitionDate AS ProhibitionDate
OD

UNUTRAŠNJI SPOJ (ODABIR
MAXIMUM(ChangeProhibitionDate.User) AS korisnik
OD
Registar informacija Datumi zabrane promjena AS Datum zabrane promjena
GDJE
(ChangeProhibitionDates.User = &TrenutniKorisnik
ORChangeProhibitionDate.User = VALUE(Reference.users.NullReference))) KAO OT_User
BYChangeProhibitedDate.User = OT_User.User) AS potupit
Faktura Invoice.Date > NestedRequest.BanDate

Provjeravamo - ograničenje radi.

Korištenje instrukcija predprocesora

#Ako je stanje1 #Onda

Fragment zahtjeva 1

#ElseIf Condition2 #Onda

Fragment zahtjeva 2

#Otherwise

Fragment zahtjeva 3

#EndIf

Pod uslovima, možete koristiti logičke operacije(i. ili, ne, itd.) i pristup parametrima sesije.

Ovaj pristup u kontekstu ograničenja pristupa zgradi je zgodan jer će se, u zavisnosti od uslova, sastaviti kraći tekst upita. Jednostavniji zahtjev manje opterećuje sistem.

Loša strana je što konstruktor upita neće raditi s takvim tekstom.

*Posebnost:

Za razliku od instrukcija pretprocesoru 1C:Enterprise u tekstovima o ograničenju pristupa, ispred operatora Then sa oznakom hash — #Zatim

Vježba 6. Prebacite "Koristi RLS"

Hajde da dopunimo naš sistem ograničenja sa prekidačem koji omogućava/onemogućava upotrebu ograničenja na nivou zapisa.

Da biste to učinili, dodajte konstantu i parametar sesije pod nazivom "UseRLS".

Upišimo u modul sesije postavljanje vrijednosti parametra sesije iz vrijednosti konstante.

Dodajte sljedeći kod svim tekstovima ograničenja pristupa:

"#If &UseRLS #Onda….. #EndIf"

Provjeravamo - sve radi.

Međutim, sada nakon uključivanja zastavice „koristi radar“, promjene neće odmah stupiti na snagu. Zašto?

Zato što se parametar sesije postavlja kada sesija započne.

Moguće je resetirati parametar sesije kada se upiše nova konstantna vrijednost, ali to će raditi samo za trenutnu korisničku sesiju. Drugi korisnici moraju biti upitani da ponovo pokrenu sistem.


Kraj prvog dijela.

20.09.2014

Postoji direktiva "Dozvoljeno" u jeziku upita. Namijenjen je da ga okvir koristi za filtriranje zapisa na koje korisnik nema prava prilikom postavljanja ograničenja na razini zapisa baze podataka.

Čini se da je u upitima bolje uvijek koristiti ovu direktivu. Ja ću tvrditi da to nije slučaj. Takođe, tvrdiću da ako je moguće, treba da izbegavate da ga koristite, eto zašto.

Recimo da napravimo izvještaj o međusobnim obračunima pojedinci. Korisnik ima prava na jednu organizaciju, a u bazi podataka postoji više organizacija, a ograničenje na nivou zapisa je omogućeno u bazi podataka. Takođe, baza podataka ima registar „Međusobna poravnanja“ sa dimenzijama „Organizacija“ i „Pojedinac“. Ako postoji zahtjev u sistemu

„Izaberi

organizacija,

Pojedinac

i biće izvršen u ime korisnika sa dozvolom jedne organizacije, onda će upit propasti ako u ovom registru postoje zapisi drugih organizacija. Doći će do greške, a opis greške će biti "Korisnik nema dovoljno prava da dovrši zahtjev!" i to je tačno, platforma ne vara, jer nema prava na evidenciju drugih organizacija u ovom registru.

Što učiniti u ovom slučaju, koristiti direktivu "Dozvoljeno"? Po mom mišljenju nije vredno toga. Vi samo trebate podesiti odabir po organizaciji i korisnik će moći generirati izvještaj. Upit za izvještaj sa sastavom podataka će izgledati ovako

„Izaberi

organizacija,

Pojedinac

(Odaberi

Organizacija

pojedinac)

Iz registra akumulacije.Međusobna poravnanja

(Gdje

Organizacija

pojedinac)

Ako korisnik izvrši upit na tablici bez odabira, tada se izvještaj neće generirati, a korisnik neće prepoznati podatke za druge organizacije, a ako postavi odabir za svoju organizaciju, generiraće ispravne podatke.

Možete ponovo pitati - "Zašto ne biste koristili direktivu Allowed", ovo odmah nameće selekciju, spašava korisnika od poruka koje mu nisu potrebne!

Odgovor na ovo pitanje će biti sljedeći – kako će u ovom slučaju korisnik znati da su svi potrebni podaci uneseni u izvještaj. Pretpostavimo da je ranije ovaj korisnik radio pod punim pravima i napravio grešku i odabrao pojedinca iz druge organizacije u dokumentu. Može biti i situacija, podaci su se učitavali - a u dokumentima organizacije je upisana podjela druge organizacije (u ZUP-u i oni podliježu ograničenjima za vlasnika). U ovom slučaju, direktiva "Dozvoljeno" će odsjeći zabranjene podatke bez ikakvih poruka korisniku, a on neće znati da nije uključeno sve što bi trebalo uključiti u izvještaj.

Stoga, nije potrebno ovu direktivu masovno unositi u zahtjeve za tipične konfiguracije, smatrajući to greškom. Veoma je obeshrabreno da se to radi u regulisanim zahtevima za izveštavanje. Takođe, nemojte to raditi u drugim izvještajima i dokumentima gdje je potrebna tačnost informacija.

Ali kako još uvijek izbjeći grešku "padanja" programa s nedostatkom prava?

Da, vrlo je jednostavno, trebate koristiti naredbu "Pokušaj", evo primjera:

Pokušaj

Request.Execute();

Izuzetak

Izvještaj(Opis greške());

Kraj pokušaja;

U izveštajima koji koriste ACS, programski kod za izvršavanje izveštaja mora biti napisan ručno, takođe kroz pokušaj.

Kao rezultat toga, korisnik neće primiti netačne podatke i dobit će zdravu poruku o grešci.

Možete se upoznati s nijansama postavljanja RLS-a odvojene podjele u našem članku.

U ovom članku želimo razgovarati sa svima vama funkcije jezika upita 1s, kao i konstrukcije jezika upita. Koja je razlika između funkcije i strukture? Funkcija se poziva sa zagradama i mogućim parametrima u njima, a konstrukcija se piše bez zagrada. Bez sumnje sve konstrukcije i funkcije 1c jezika upita učiniti proces prikupljanja podataka fleksibilnim i multifunkcionalnim. Ove funkcije i konstrukcije primjenjuju se na polja upita, a neke se primjenjuju i na uvjete.

Funkcije jezika upita 1s

Od jasnog opisa funkcije jezika upita 1s je mnogo rjeđi od opisa struktura, odlučili smo da počnemo gledati funkcije. Sada analizirajmo svaki posebno, opisujući njegovu svrhu, sintaksu i primjer upotrebe, dakle:

1. Funkcija DATUM VRIJEME - datu funkciju kreira konstantno polje tipa "Datum".

sintaksa: DATUM VRIJEME(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Primjer upotrebe:

2. DATUM DIFFERENCE funkcija- vraća razliku dva datuma u jednoj od dimenzija (godina, mjesec, dan, sat, minuta, sekunda). Mjerenje se prenosi kao parametar.

sintaksa: DATUM RAZLIKA(<Дата1>, <Дата2>, <Тип>)

Primjer upotrebe:

Query.Text = "ODABIR | DATUM RAZLIKA(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Broj dana";

3. Funkcija VALUE- postavlja konstantno polje sa unapred definisanim unosom iz baze podataka, takođe možete dobiti null referencu bilo koje vrste.

Sintaksa: VALUE(<Имя>)

Primjer upotrebe:

Query.Text = "SELECT //predefinirani element | VALUE(Currency.Dollar.Catalog.Dollar) AS Dollar, //null reference | VALUE(Document.IncomingGoodsServices.EmptyReference) AS Potvrda, //transfer vrijednost | VALUE(Transfer.LegalIndividual . Pojedinac) AS Pojedinac, //predefinisani račun | VRIJEDNOST(Kontni plan.Samonosivi.Materijal) AS Račun_10" ;

4. SELECT funkcija- imamo analognu IF konstrukciju koja se koristi u kodu, samo se ova koristi u 1C upitima.

sintaksa: IZBOR KADA<Выражение>ONDA<Выражение>U protivnom<Выражение>KRAJ

Primjer upotrebe:

Request.Text = //ako je iznos veći od 7500, tada bi trebao postojati popust od 300 rubalja, //dakle, ako se uvjet pokrene, tada funkcija //vraća iznos - 300 //u suprotnom, zahtjev će jednostavno vratiti iznos "SELECT | SELECT | WHEN PMIncome.Amount > 7500 | THEN PTReceipts.Amount - 300 | ELSE PTReceipts.Amount | END AS Iznos Discounted |FROM | Document.ReceiptofGoodsServices.Goods ASTRe";

5. EXPRESS funkcija- omogućava vam da izrazite konstantno polje sa određenim tipom.

sintaksa: EXPRESS(Ime polja AS Ime vrste)

Primjer upotrebe:

Query.Text = "IZABIR RAZNO | Sales.Registrar.Broj, | SELECT | WHEN Sales.Registrar REF Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar REF dokument.Im EXPRESS THEN EXPRESS(Sales.Registrar AS Document.Release) | KRAJ | ... | KRAJ AS Broj | FROM | Registar akumulacije.Kupovine KAO kupovine";

Još uvijek postoji varijanta korištenja funkcije EXPRESS u poljima mješovitih tipova gdje se takvi susreću? Najjednostavniji primjer je "Registar" za bilo koji registar. Zašto bismo onda morali da kvalifikujemo tip u registratoru? Razmotrimo situaciju kada iz registratora odaberemo polje "Broj", iz koje tabele će se odabrati broj? Tačan odgovor svih! Stoga, da bi naš upit brzo funkcionirao, moramo specificirati eksplicitni tip koristeći funkciju EXPRESS

Primjer upotrebe:

Query.Text = "IZABIR | EXPRESS(Nomenklatura.Komentar KAO Niz(300)) KAO Komentar, | EXPRESS(Nomenklatura.Zbroj AS Broj(15,2)) KAO Zbir |FROM | Referentna.Nomenklatura AS Nomenklatura";

6. ISNULL funkcija(alternativno pravopis IS NULL) - ako je polje tipa NULL, tada se zamjenjuje drugim parametrom funkcije.

sintaksa: ISNULL(<Поле>, <ПодставляемоеЗначение>)

Primjer upotrebe:

Također imajte na umu da je poželjno UVIJEK zamijeniti tip NULL nekom vrijednošću, jer poređenje sa NULL uvijek se procjenjuje na FALSE čak i ako uspoređujete NULL sa NULL. Najčešće se NULL vrijednosti formiraju kao rezultat spajanja tablica (sve vrste spajanja osim unutrašnjih).

Query.Text = //Odaberi cijelu stavku i njena stanja //ako nema stanja u nekoj stavci, tada će postojati polje //NULL koje će biti zamijenjeno vrijednošću 0 "SELECT | No.Reference, | ISNULL (GoodsInWarehouseRemains.InStockRemaining, 0) KAKO Ostatak | FROM | Imenik Nomenklatura AS Nom | LIJEVO PRIDRUŽENJE Registar akumulacije.

7. Funkcija REPRESENTATION- omogućava vam da dobijete prikaz polja zahtjeva.

sintaksa: PERFORMANSE(<НаименованиеПоля>)

Primjer upotrebe:

Query.Text = "SELECT | REPRESENTATION(Free RemainsRemains.Nomenclature) AS Nomenklatura, | REPRESENTATION(FreeRemainsRemains.Warehouse) AS Warehouse, | FreeRemainsRemains.AvailableRemains |FROM | Registar akumulacije.FreeinsRema ASRemains"

Konstrukcije u jeziku upita 1s

Gore smo razgovarali s vama funkcije jezika upita 1s, sada je vrijeme za razmatranje konstrukcije u jeziku upita 1s, nisu ništa manje važni i korisni, hajde da počnemo.

1. Građevinski LINK- je operator provjere logičkog referentnog tipa. Najčešće se susreće prilikom testiranja polja kompozitnog tipa za određeni tip. sintaksa: VEZA<Имя таблицы>

Primjer upotrebe:

Query.Text = //ako je tip vrijednosti registratora Potvrda dokumenta, //onda će upit vratiti "Dolazna roba", u suprotnom "Prodaja robe" "ODABIR | ODABIR | KADA ostaje.Registar LINK Document.IncomingGoodsServices | THEN ""Dolazni" | OSTALO "Trošak" | KRAJ KAO Vrsta kretanja | IZ | Registar akumulacije. Ostaci robe u skladištima AS Ostaci ";

2. Izgradnja BETWEEN- ovaj operator provjerava da li je vrijednost unutar specificiranog raspona.

sintaksa: IZMEĐU<Выражение>I<Выражение>

Primjer upotrebe:

Query.Text = //dobijamo cijelu nomenklaturu čiji je kod u rasponu od 1 do 100 "SELECT | Nomenclature.Reference |FROM | Catalog.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code IZMEĐU 1 I 100" ;

3. Konstrukcija B i B HIJERARHIJE- provjerite da li se vrijednost nalazi u proslijeđenoj listi (nizovi, tablice vrijednosti itd. mogu se proslijediti kao lista). Operator IN HIERARCHY vam omogućava da vidite hijerarhiju (primjer korištenja PlanAccounts).

sintaksa: AT(<СписокЗначений>), U HIJERARHIJI(<СписокЗначений>)

Primjer upotrebe:

Query.Text = //odaberite sve podračune računa "ODABIR | Samonosivi.Referentni AS račun |FROM | PlanAccounts.Samonosivi AS Samonosivi |GDJE | Samonosivi.Referenca U HIERARHIJSKOJ VRIJEDNOSTI(Raspored od Računi.Samonosivi.Roba)";

4. Izgradnja LIKE- ova funkcija nam omogućava da uporedimo string sa uzorkom niza.

sintaksa: LIKE"<ТекстШаблона>"

Opcije predloška linije:

% - niz koji sadrži bilo koji broj proizvoljnih znakova.

Jedan proizvoljan karakter.

[...] - bilo koji pojedinačni znak ili niz znakova navedenih u uglastim zagradama. Nabrajanje može sadržavati opsege, kao što je a-z, što znači bilo koji znak unutar raspona, uključujući i krajeve raspona.

[^...] - bilo koji pojedinačni znak ili niz znakova navedenih u uglastim zagradama, osim onih navedenih nakon znaka negacije.

Primjer upotrebe:

Query.Text = //pronađi cijelu nomenklaturu koja sadrži korijen TABUR i počinje //bilo s malim ili velikim slovom t "SELECT | Nomenclature.Reference |FROM | Directory.Nomenclature AS Nomenclature |WHERE | Goods.Name LIKE ""[Tt ]abur%""" ;

5. Dizajn DOZVOLJEN- ova izjava vam omogućava da odaberete samo one zapise iz baze podataka za koje pozivalac ima pravo čitati. Ova prava su konfigurisana na nivou zapisa (RLS).

sintaksa: ALOWED se piše iza ključne riječi SELECT

Primjer upotrebe:

Query.Text = "ODABIR DOZVOLJENO | Counterparties.Reference |FROM | Directory.Counterparties AS Counterparties";

6. Izgradnja VARIOUS- omogućava vam da odaberete zapise u kojima nema ponovljenih zapisa.

sintaksa: DIFFERENT se piše iza ključne riječi SELECT

Primjer upotrebe:

Request.Text = //odabira zapise na koje čitač ima prava "IZABIR DRUGAČIJE | Counterparties.Name |FROM | Directory.Counterparties AS Counterparties" ;

DIFFERENT konstrukcija se također može koristiti s operatorom ALLOWED i drugim operatorima.

Primjer upotrebe:

Query.Text = //odabire različite zapise na koje čitač ima prava "ODABIR DOZVOLJENO RAZLIČITI | Contractors.Name |FROM | Directory.Contractors AS Contractors";

7. Izgradnja FIRST- bira broj zapisa navedenih u parametru iz rezultata upita.

Sintaksa: FIRST<число>

Primjer upotrebe:

Query.Text = //odaberite prva 4 GTD broja iz direktorija "IZABIR PRVA 4 | GTD brojevi.Referenca |FROM | Catalog.GTE brojevi KAO GTD brojevi";

8. Dizajn ZA PROMJENU- omogućava zaključavanje tabele, radi samo u transakcijama (relevantno samo za automatska zaključavanja).

sintaksa: ZA PROMJENU<НаименованиеТаблицы>

Primjer upotrebe:

Query.Text = "SELECT | FreeRemainsRemains.Nomenclature, | FreeRemainsRemains.Warehouse, | FreeRemainsRemains.AvailableRemains |FROM | Registar akumulacije.FreeRemains.Remains KAO FreeRemainsRemains |ZA PROMJENU |

9. Struktura ORDER BY- sortira podatke po određenom polju. Ako je polje veza, onda prilikom postavljanja zastavice AUTO ORDERće se sortirati prema prikazu veze, ako je zastavica isključena, onda se veze sortiraju prema senioritetu adrese veze u memoriji.

sintaksa: SORT BY<НаименованиеПоля>AUTO ORDER

Primjer upotrebe:

Query.Text = "SELECT | FreeRemainsRemains.Nomenclature AS nomenklatura, | FreeRemainsRemains.Warehouse AS skladište, | FreeRemainsRemains.In StockRemaining |From |

10. Dizajn GROUP BY- koristi se za grupisanje nizova upita prema određenim poljima. Numerička polja moraju se koristiti sa bilo kojom agregatnom funkcijom.

sintaksa: GROUP BY<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Primjer upotrebe:

Query.Text = "SELECT | ItemsInWarehouse.Nomenklatura AS Nomenklatura, | ItemsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) AS InStock |FROM |

11. Dizajn HAVING- omogućava vam da primijenite agregatnu funkciju na uvjet odabira podataka, slično konstrukciji WHERE.

sintaksa: HAVING<агрегатная функция с условием>

Primjer upotrebe:

Query.Text = //Odabire grupisane zapise u kojima je polje InStock veće od 3 "SELECT | GoodsInStock.Nomenklatura AS Nomenklatura, | GoodsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) KAO InStock |FROM | Akumulacija Registar robeWInhouses ASInWarehouses | |GRUPA PO | Roba u skladištima.Nomenklatura, | Roba u skladištima.Skladište | |IMAJUĆI | IZNOS (Roba u skladištima.Na zalihama) > 3" ;

12. INDEX BY konstrukcija- koristi se za indeksiranje polja upita. Indeksirani upit traje duže da se završi, ali ubrzava pretraživanja u indeksiranim poljima. Može se koristiti samo u virtualnim tablicama.

sintaksa: INDEX BY<Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "SELECT | Tz.OS Naziv, | Tz.Folder Number, | Tz.CodeOS, | Tz.Term, | Tz.Type |PUT DataTz |FROM | &Tz HOW Tz | | INDEX BY | Tz.OS Naziv , | Tz .CodeOS";

13. Izgradnja GDJE- omogućava vam da nametnete uslov za bilo koja polja selekcije. Samo zapisi koji ispunjavaju uslov će biti uključeni u rezultat.

sintaksa: GDJE<Условие1 ОператорЛогСоединения УсловиеN>

Primjer upotrebe:

Query.Text = //odaberite sve zapise sa CompensationRemainder<>0 i //AmountFor Calc.CompBalance > 100 "SELECT | Compensation RPO stanja.Račun, | Compensation RPO stanja.Dijete, | Compensation RPO stanja. Compensation Balance, | Compensation RPO stanja. SumFor Calc. Comp Balance | PLACE DataTz |FROM | Registar akumulacije Kompenzacija RP Stanja AS Kompenzacija RPO Stanja | Kompenzacija GPO.<>0 | I bilansi RPO kompenzacije. Iznos za CalcComp ostatak > 100" ;

14. REZULTATI dizajna ... OPĆENITO- koristi se za izračunavanje ukupnih vrijednosti, dizajn specificira polja za koja će se ukupni iznosi izračunati i agregatne funkcije se primjenjuju na ukupna polja. Kada se koriste zbrojevi za svako polje nakon konstrukcije TOTALS, podaci se grupišu. Postoji opcioni konstrukt GENERAL, njegova upotreba takođe omogućava dodatno grupisanje. U nastavku možete vidjeti primjer rezultata upita.

sintaksa: REZULTATI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>ON<ОБЩИЕ> <Поле1, ... , ПолеN>

Primjer upotrebe:

Query.Text = "ODABIR | Poravnanja.Ugovor sa drugom stranom.Vrsta ugovora KAO Vrsta ugovora, | Poravnanja.Sporazum sa drugom stranom KAO Ugovor, | Poravnanja.Protustrana, | Poravnanja.Iznos međusobnih poravnanjaStanje KAO Preostalo |FROM, | Softver | | Vrsta ugovora";

Grupacije koje su formirane tokom izvršenja zahteva su zaokružene na slici, gornja pripada delu GENERAL, a druga polju ContractContractorContractType.

Zahtjev je moćan alat koji služi za brzo (u odnosu na sve druge metode) primanje i obradu podataka sadržanih u različitim objektima 1C infobaze.

Kreirajte zahtjev

Zahtjev se kreira kao poseban objekt koji ima traženi atribut Tekst, gdje se postavlja sam zahtjev. Osim toga, zahtjevu se mogu prenijeti različiti parametri potrebni za njegovo izvršenje. Nakon što se popune tekst i parametri upita, upit se mora izvršiti, a rezultat izvršenja staviti u izbor ili tablicu vrijednosti. Sve to izgleda ovako:

//Kreiraj zahtjev
Zahtjev = novi zahtjev;

//Popunite tekst zahtjeva
Zahtjev. Tekst= "Ovdje pišemo tekst zahtjeva";

// Prosljeđivanje parametara zahtjevu
Zahtjev. SetParameter("ParameterName" , ParameterValue) ;

//Izvršite zahtjev
Rezultat = Zahtjev. Izvrši() ;

//Učitavanje rezultata upita u odabir
Uzorak = rezultat. Izaberi() ;

//Učitavanje rezultata upita u tablicu vrijednosti
tabela= rezultat. Unload() ;

//Posljednje akcije se mogu kombinirati
Dohvatiti = Zahtjev. Izvrši() . Izaberi() ;
//ili
table= upit. Izvrši() . Unload() ;

Osnove 1C jezika upita

Najjednostavniji i najčešće korišteni upiti su za dobivanje podataka iz nekog izvora. Gotovo svi objekti koji sadrže bilo koje podatke mogu biti izvor: imenici, dokumenti, registri, konstante, enumeracije, planovi tipova karakteristika itd.

Iz ovih objekata, pomoću upita, možete dobiti vrijednosti atributa, tabelarnih dijelova, atributa tabličnog dijela, promjena, resursa itd.

Da biste dobili tekst zahtjeva, često je zgodno koristiti Konstruktor zahtjeva. Poziva se kada desnom tipkom miša kliknete bilo gdje u programskom modulu.

Na primjer, ako trebate dobiti vrijednosti svih detalja direktorija Counterparties, tada će upit izgledati ovako:

Zahtjev. Tekst = „IZABIR
| *
OD
| Imenik. Ugovorne strane"
;

Ako trebate dobiti samo pojedinačne detalje, onda - ovako:

Zahtjev. Tekst = „IZABIR
| kod,
| ime,
| Roditelj
OD
| Imenik. Ugovorne strane"
;

Da biste dobili tekst takvog zahtjeva Konstruktor zahtjeva potrebno je da izaberete odgovarajuća polja na kartici Tabele i polja.

Elementima i izvorima odabranim u upitu možete dodijeliti pseudonime i koristiti ih kasnije kako u samom upitu tako i kada radite s rezultatom. Osim toga, zahtjev može sadržavati polja s unaprijed definiranom specifičnom vrijednošću ili sa izračunatom vrijednošću:

Zahtjev. Tekst = „IZABIR
| Customers.Code AS broj,

| 1000 AS FieldWith Value
OD
;

Uzorak = Zahtjev. Izvrši() . Izaberi() ;

Dok je odabir. Next() Petlja
Broj klijenta = Izbor. Broj;
Ime klijenta = Izbor. Ime;
Vrijednost = Izbor. FieldWithValue;
EndCycle ;

Koristite karticu za postavljanje alijasa. Sindikati/aliasi in Query Builder.

A polje sa fiksnom ili izračunatom vrijednošću kreira se ručno na kartici Tabele i polja, u koloni Polja.

Svi odabrani elementi mogu se sortirati direktno ili obrnutim redoslijedom. Možete odabrati jedno ili više polja za naručivanje. Uz naručivanje, ponekad je korisno odabrati samo jedan ili nekoliko prvih elemenata.

//Naručite kupce po imenu od A do Ž i odaberite prvih 10
Zahtjev. Tekst = "PRVO ODABIR 10
| Customers.Code AS broj,
| Customers.Name AS Ime,
| 1000 AS FieldWith Value
OD

|ORDER BY
| ime"
;

//Odaberite najnovijeg klijenta po abecednom redu
Zahtjev. Tekst = "PRVO ODABIR 1
| Customers.Code AS broj,
| Customers.Name AS Ime,
| 1000 AS FieldWith Value
OD
| Imenik. Counterparties AS Klijenti
|ORDER BY
| Ime DESC"
;

Možete ograničiti izbor elemenata na one za koje korisnik ima prava pristupa. Ili uklonite duple linije iz rezultata upita.

//Odabir podataka dozvoljenih korisniku
Zahtjev. Tekst = "ODABIR DOZVOLJEN
| Customers.Code AS broj,
| Customers.Name AS Ime,
| 1000 AS FieldWith Value
OD
| Imenik. Counterparties AS Klijenti"
;

//Odaberite elemente koji se ne ponavljaju
Zahtjev. Tekst = „IZABIR DRUGAČIJE
| Customers.Code AS broj,
| Customers.Name AS Ime,
| 1000 AS FieldWith Value
OD
| Imenik. Counterparties AS Klijenti"
;

Redoslijed je postavljen na kartici Red in kreator upita, broj odabranih elemenata, rezolucija i parametri ponovljivosti - na kartici Dodatno.

Nastavlja se…

). Korištenjem ove ključne riječi izbjegava se greška pri preuzimanju zapisa za koje korisnik nema prava.

Problem: U nekim slučajevima, rezultat ograničenja pristupa podacima u 1C 8.3 može ovisiti o DBMS planu upita. Ovaj članak govori o mogućim situacijama i daje preporuke kako to izbjeći.

Problem moguće ovisnosti rezultata ograničenja pristupa podacima o DBMS planu upita može se pojaviti kada se upit baze podataka izvršava bez ključne riječi DOZVOLJENO, ako postoje ograničenja pristupa podacima za trenutnog korisnika i upit sadrži jedno ili više poređenja obrasca:

  • <Выражение над полями>(U|NE U) (<Вложенный запрос>)
  • (<Выражение над полями 1>, …, <Выражение над полями N>) (U|NE U) (<Вложенный запрос>)

Ako u ovom slučaju < > (upit u upitu) koristi tabele baze podataka koje imaju ograničenja pristupa, moguće je da će upit biti uspješno izvršen na nekim DBMS-ovima, a poruka na drugima, pod uslovom da su podaci u infobazama potpuno identični.

Nabavite 267 1C video lekcija besplatno:

Razlog za razlike

Moguća razlika u ponašanju je zbog implementacije ograničenja pristupa podacima bez ključne riječi DOZVOLJENO u 1C Enterprise 8.3.

Upit bez ključne riječi DOZVOLJENOće se uspješno izvršiti samo ako tokom njegovog izvršavanja nema pristupa zabranjenim podacima. Da biste to učinili, dodaje mu se posebno signalno polje koje uzima vrijednost Tačno za one zapise u čijem su formiranju učestvovali samo dozvoljeni podaci i vrijednost Lazi za sve ostale unose. Ako barem jedan zapis odabira sadrži vrijednost Lazi u polju signala, onda se upit nenormalno završava.

Isto polje signala dodaje se rezultatima upita ugniježđenih u poređenju. AT/NOT IN. Štaviše, provjera vrijednosti stupca signala u ovom slučaju se vrši pomoću DBMS-a. Dakle, ako je u procesu izvršavanja ugniježđenog upita došlo do pristupa zabranjenim podacima, onda bi izvršenje upita trebalo završiti greškom Korisnik nema dovoljno prava da izvrši operaciju na bazi podataka.

Međutim, prilikom izrade plana upita, DBMS možda neće primiti punu selekciju <Вложенным запросом> , i dobiti samo one zapise koji su zaista potrebni za provjeru stanja AT/NOT IN. U ovom slučaju, upit može uspjeti čak i ako <Вложенного запроса> pristup zabranjenim podacima mogao bi se pojaviti kao nezavisan zahtjev.

Razmotrimo jednostavan primjer. Pustite na sto Imenik.Pojedinci ograničenja pristupa podacima. U ovom slučaju zahtjev je:

Table.Individual AS Individual

će se izvršiti s greškom zbog pokušaja pristupa zabranjenim podacima. Ako je ovaj upit uključen u poređenje, na primjer:

Table.Individual AS Individual

Directory.Individuals AS Table)

zatim, u zavisnosti od plana upita odabranog od strane DBMS-a, upit se može izvršiti bilo uspješno ili sa greškom. Ovakvo ponašanje zahtjeva nije pogrešno, jer pristup zabranjenim podacima tokom izvršenja ovog zahtjeva može, ali i ne mora biti. Da bi se dobio predvidljiviji rezultat, potrebno je izgraditi upit na takav način da je zajamčeno da ugniježđeni upit neće obavljati pristupe očigledno nepotrebnim podacima. Konkretno, ako se prethodni upit prepiše ovako:

Ugovor o obavljanju poslova sa osobom.zaposlenom.fizicom

Dokument Ugovor o obavljanju poslova sa fizičkim licem AS Ugovor o obavljanju poslova sa fizičkim licem

Ugovor o obavljanju poslova sa osobom.Zaposlenom.Pojedincem B (

Table.Individual AS Individual

Directory.Individuals AS Table