Az "Allowed" direktíva használata. Programozói notebook Az 1c kérésben engedélyezett választás
A lekérdezés egy hatékony eszköz, amely az 1C információs bázis különböző objektumaiban található adatok gyors (az összes többi módszerhez képest) megszerzésére és feldolgozására szolgál.
Hozzon létre egy kérést
A kérés külön objektumként jön létre, amely rendelkezik egy szükséges attribútummal Szöveg, ahol a kérést ténylegesen elhelyezték. Ezenkívül a végrehajtásához szükséges különféle paraméterek átadhatók a kérésnek. A kérés szövegének és paramétereinek kitöltése után a kérést végre kell hajtani, és a végrehajtás eredményét egy kijelölésben vagy értéktáblázatban kell elhelyezni. Valahogy így néz ki az egész:
//Kérés létrehozása
Request = új kérés;
//Töltsd ki a kérés szövegét
Kérés. Szöveg= "Itt írjuk a kérés szövegét";
//Paraméterek átadása a kérésnek
Kérés. SetParameter("Paraméternév" , Paraméterérték) ;
//Végrehajtja a kérést
Eredmény = Lekérdezés. Fuss() ;
//A lekérdezés eredményének feltöltése a kijelölésbe
Minta = Eredmény. Választ() ;
//A lekérdezés eredményének feltöltése az értéktáblázatba
táblázat = Eredmény. Unload() ;
//Az utolsó műveletek kombinálhatók
Fetch = Lekérdezés. Fuss() . Választ() ;
//vagy
Táblázat = Lekérdezés. Fuss() . Unload() ;
Az 1C lekérdezési nyelv alapjai
A legegyszerűbb és leggyakrabban használt lekérdezéseket arra használjuk, hogy valamilyen forrásból adatokat szerezzünk be. A forrás szinte minden adatot tartalmazó objektum lehet: könyvtárak, dokumentumok, regiszterek, konstansok, felsorolások, jellemzőtípusok tervei stb.
Ezekből az objektumokból lekérdezéssel megkaphatja a részletek, táblázatrészek, táblázatrészek részletei, változtatások, erőforrások stb. értékeit.
A kérés szövegének megszerzéséhez gyakran kényelmes a használata Konstruktor kérése. Akkor hívják meg, ha a jobb gombbal a programmodul bármely pontjára kattint.
Például, ha meg kell szereznie az összes könyvtáradat értékét Ügyfelek, akkor a kérés így fog kinézni:
Kérés. Szöveg = "VÁLASZT
| *
|FROM
| Címtár. Partnerek";
Ha csak az egyes részletekre van szüksége, tegye a következőket:
Kérés. Szöveg = "VÁLASZT
| Kód,
| Név,
| Szülő
|FROM
| Címtár. Partnerek";
Ilyen kérés fogadásához írjon be Lekérdezés konstruktor ki kell választania a megfelelő mezőket a lapon Táblázatok és mezők.
A lekérdezésben kiválasztott elemekhez és forrásokhoz álneveket rendelhet, amelyeket később felhasználhat magában a lekérdezésben és az eredménnyel való munka során is. Ezenkívül a kérés tartalmazhat előre meghatározott konkrét értékkel vagy számított értékkel rendelkező mezőket:
Kérés. Szöveg = "VÁLASZT
| Clients.Code AS szám,
| 1000 AS FieldWith Value
|FROM
;
Fetch = Lekérdezés. Fuss() . Választ() ;
Viszlát választás. Következő() Cikk
ClientNumber = Minta. Szám;
ClientName = Kiválasztás. Név;
Érték = Minta. FieldWithValue;
EndCycle ;
Használja a lapot az álnevek beállításához Szakszervezetek/Álnevek V Lekérdezéskészítő.
Egy rögzített vagy számított értékkel rendelkező mező manuálisan jön létre a lapon Táblázatok és mezők, egy oszlopban Mezők.
Az összes kiválasztott elem előre vagy fordított sorrendben is elrendezhető. A megrendeléshez egy vagy több mezőt kiválaszthat. Az elrendezés mellett néha hasznos lehet csak egy vagy néhány első tétel kiválasztása.
//Rendezze meg az ügyfeleket név szerint A-tól Z-ig, és válassza ki az első 10-et
Kérés. Szöveg = "KIVÁLASZTÁS ELSŐ 10
| Clients.Code AS szám,
| Clients.Name AS név,
| 1000 AS FieldWith Value
|FROM
|RENDELÉS
| Név";
//Válassza ki a legújabb alfabetikus klienst
Kérés. Szöveg = "KIVÁLASZTÁS A TOP 1
| Clients.Code AS szám,
| Clients.Name AS név,
| 1000 AS FieldWith Value
|FROM
| Címtár. Partnerek AS ügyfelek
|RENDELÉS
| Név DECLINE";
Az elemek kiválasztását azokra korlátozhatja, amelyekhez a felhasználó hozzáférési jogokkal rendelkezik. Vagy távolítsa el az ismétlődő sorokat a lekérdezés eredményéből.
//A felhasználó számára engedélyezett mintavételezési adatok
Kérés. Szöveg = "KIVÁLASZTÁSA ENGEDÉLYEZETT
| Clients.Code AS szám,
| Clients.Name AS név,
| 1000 AS FieldWith Value
|FROM
| Címtár. Partnerek AS ügyfelek";
//Nem ismétlődő elemek kiválasztása
Kérés. Szöveg = "VÁLASZTÁS KÜLÖNBÖZŐ
| Clients.Code AS szám,
| Clients.Name AS név,
| 1000 AS FieldWith Value
|FROM
| Címtár. Partnerek AS ügyfelek";
A sorrend a lapon van beállítva Rendelés V Lekérdezéskészítő a kiválasztott elemek száma, a felbontás és az ismételhetőség paraméterei a fülön találhatók Továbbá.
Folytatjuk…
Ebben a cikkben mindent szeretnénk megbeszélni veled 1C lekérdezési nyelvi függvények, és lekérdező nyelvi konstrukciók. Mi a különbség a funkció és a design között? A függvényt zárójelekkel és a benne található lehetséges paraméterekkel hívjuk meg, a konstrukciót zárójelek nélkül írjuk. Kétségtelenül az 1C lekérdező nyelv összes struktúráját és funkcióját rugalmassá és multifunkcionálissá tenni az adatgyűjtési folyamatot. Ezek a függvények és konstrukciók a kérelmező mezőkre vonatkoznak, néhány pedig a feltételekre is.
1C lekérdezési nyelvi funkciók
Mert egyértelmű leírás 1C lekérdezési nyelvi függvények sokkal kevésbé gyakori, mint a struktúrák leírása, úgy döntöttünk, hogy elkezdjük a függvények vizsgálatát. Most nézzük meg mindegyiket külön-külön, leírva a célt, a szintaxist és a használati példát, tehát:
1. Funkció DÁTUM IDŐ- ez a függvény egy "Dátum" típusú konstans mezőt hoz létre.
Szintaxis: DÁTUM IDŐ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
Használati példa:
2. DATE DIFFERENCE funkció- a két dátum közötti különbséget adja vissza az egyik dimenzióban (év, hónap, nap, óra, perc, másodperc). A mérés paraméterként kerül átadásra.
Szintaxis: DIFFERENCEDATE(<Дата1>, <Дата2>, <Тип>)
Használati példa:
Query.Text = "SELECT | DIFFERENCEDATE(DATETIME(2015, 4, 17), DATETIME(2015, 2, 1), DAY) | AS Qty.Days";
3. VALUE függvény- beállít egy konstans mezőt egy előre meghatározott rekorddal az adatbázisból; bármilyen típusú üres hivatkozást is kaphat.
Szintaxis: VALUE(<Имя>)
Használati példa:
Request.Text = "SELECT //előre definiált elem | ÉRTÉK (Könyvtár. Pénznemek. Dollár) AS dollár, //üres hivatkozás | ÉRTÉK (Dokumentum. Áruk és szolgáltatások átvétele.EmptyLink) AS nyugta, //átutalási érték | ÉRTÉK (átutalás . Jogi magánszemély. Magánszemély) AS magánszemély, //előre meghatározott számla | ÉRTÉK (Számlatábla. Önfenntartó. Anyagok) AS Számla_10" ;
4. SELECT funkció- előttünk van a kódban használt IF konstrukció analógja, csak ezt használják az 1C lekérdezésekben.
Szintaxis: VÁLASZTÁS MIKOR<Выражение>AKKOR<Выражение>MÁSKÉPP<Выражение>VÉGE
Használati példa:
Request.Text = //ha az összeg meghaladja a 7500-at, akkor 300 rubel kedvezménynek kell lennie, //tehát ha a feltétel aktiválódik, akkor a //függvény az Összeg - 300 értéket adja vissza //egyébként a kérés egyszerűen Összeg "KIVÁLASZT | KIVÁLASZT | WHEN TCR-bevételek.Összeg > 7500 | THEN TCR-bevételek.Összeg - 300 | EGYÉB TCR-bevételek.Összeg | VÉGE AS Összeg Kedvezménnyel |FROM | Dokumentum.Áruk átvételeSzolgáltatások.Áruk TCR-ként";
5. EXPRESS funkció- lehetővé teszi egy konstans mező kifejezését egy adott típussal.
Szintaxis: EXPRESS (Mezőnév AS Típusnév)
Használati példa:
Query.Text = "VÁLASZTÁS KÜLÖNBÖZŐ | Értékesítés.Regisztrátor.Szám, | KIVÁLASZT | WHEN Értékesítés.Regisztrátor LINK Dokumentum.Kiadás | THEN EXPRESS(Értékesítés.Regisztrátor mint dokumentum.Költség) | ELSE SELECT | WHEN Értékesítés.Regisztrátor LINK Dokumentum.Megvalósítás | THEN EXPRESS(Sales.Registrar AS Document. Implementation) | END | ... | END AS Number | FROM | RegisterAccumulations.Purchases AS Purchases";
Egy másik lehetőség az EXPRESS funkció használata a mezőkben vegyes típusok hol találhatók ezek? A legegyszerűbb példa a „Regisztrátor” bármely regiszterhez. Miért kell tehát minősítenünk a típust a regisztrátorban? Tekintsük azt a helyzetet, amikor az anyakönyvvezetőből kiválasztjuk a "Szám" mezőt, melyik táblázatból lesz kiválasztva a szám? A helyes válasz mindenkinek! Ezért, hogy a lekérdezésünk gyorsan működjön, meg kell adnunk egy explicit típust az EXPRESS függvény segítségével
Használati példa:
Query.Text = "SELECT | EXPRESS(Nómenklatúra.Megjegyzés AS sor(300)) AS megjegyzés, | EXPRESS(Nómenklatúra.Összeg AS szám(15,2)) AS Összeg |FROM | Címtár.Nómenklatúra AS Nómenklatúra";
6. ISNULL függvény(alternatív helyesírás ISNULL) - ha a mező NULL típusú, akkor a függvény második paraméterével helyettesítjük.
Szintaxis: NULLA(<Поле>, <ПодставляемоеЗначение>)
Használati példa:
Azt is érdemes megjegyezni, hogy a NULL típust célszerű MINDIG valamilyen értékre cserélni, mert A NULL típussal való összehasonlítás mindig FALSE-t ad vissza, még akkor is, ha a NULL értéket NULL-lal hasonlítja össze. Leggyakrabban a NULL értékek az összekapcsoló táblák eredményeként jönnek létre (minden típusú csatlakozás, kivéve a belsőket).
Query.Text = //Válassza ki a teljes tételt és egyenlegeit //ha valamelyik cikkben nincs egyenleg, akkor egy //NULL mező lesz, ami a 0 értékre lesz cserélve "SELECT | No. Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS maradék | FROM | Címtár.Nómenklatúra AS-szám | BAL KAPCSOLAT Felhalmozások regisztrálása. Áruk raktárban. Maradékok AS ÁrukRaktárokbanMaradványok | BE (GoodsInWarehouses) Linkek";
7. REPREZENTÁCIÓ funkció- lehetővé teszi a kérés mezőjének megjelenítését.
Szintaxis: TELJESÍTMÉNY(<НаименованиеПоля>)
Használati példa:
Query.Text = "SELECT | REPREZENTÁCIÓ(FreeRemainingRemains.Nomenclature) AS Nomenklatúra, | REPRESENTATION(FreeRemaining.Warehouse) AS Raktár, | FreeRemaining.InStockRemaining |FROM |Felhalmozási nyilvántartás.FreeRemainingASFreeing;FreeRemainingARemaining"
Konstrukciók az 1C lekérdezési nyelven
Fentebb megbeszéltük veled 1C lekérdezési nyelvi függvények, itt az ideje átgondolni konstrukciókat az 1C lekérdező nyelven, nem kevésbé fontosak és hasznosak, kezdjük.
1. Építés LINK- egy referenciatípus ellenőrzésére szolgáló logikai operátor. Leggyakrabban akkor fordul elő, amikor egy összetett típusú mezőt egy adott típushoz hasonlítanak. Szintaxis: LINK<Имя таблицы>
Használati példa:
Request.Text = //ha a rögzítő értéktípusa bizonylat Nyugta, //akkor a lekérdezés "Áru átvétele", ellenkező esetben "Árueladás" "SELECT | SELECT | WHEN Remainings.Registrar LINK Dokumentum.Áru átvétele és Szolgáltatások | AKKOR ""Átvétel" | EGYÉB ""Fogyasztás"" | END AS A mozgás típusa | FROM | Felhalmozási nyilvántartás. A raktárban lévő többi termék AS marad" ;
2. Tervezés KÖZÖTT- ez az operátor ellenőrzi, hogy az érték a megadott tartományon belül van-e.
Szintaxis: KÖZÖTT<Выражение>ÉS<Выражение>
Használati példa:
Request.Text = //a teljes nómenklatúra lekérése, amelynek kódja 1 és 100 között van "SELECT | Nomenclature.Link | FROM | Directory.Nómenklatúra AS Nomenklatúra | WHERE | Nomenclature.Code BETWEEN 1-100" ;
3. B és B konstrukció HIERARCHIA- ellenőrizze, hogy az érték benne van-e az átvitt listában (átvihetők listaként tömbök, értéktáblázatok stb.). Az IN HIERARCHY operátor lehetővé teszi a hierarchia megtekintését (példa a Számladiagram használatára).
Szintaxis: BAN BEN(<СписокЗначений>), HIERARCHIABAN(<СписокЗначений>)
Használati példa:
Request.Text = //válassza ki a fiók összes alszámláját "SELECT | Önfenntartó. Kapcsolja össze a fiókot Számlák. Önfenntartó. Áruk)";
4. Kialakítás HASONLÓ- Ez a funkció lehetővé teszi, hogy egy karakterláncot egy karakterlánc-mintával hasonlítsunk össze.
Szintaxis: MINT "<ТекстШаблона>"
Sorminta opciók:
% - tetszőleges számú karaktert tartalmazó sorozat.
Egy tetszőleges karakter.
[...] - bármely, szögletes zárójelben szereplő karakter vagy karaktersorozat. A felsorolás megadhat tartományokat, például a-z, ami egy tetszőleges karaktert jelent a tartományban, beleértve a tartomány végeit is.
[^...] - a szögletes zárójelben szereplő egyetlen karakter vagy karaktersorozat, kivéve a tagadójel után felsoroltakat.
Használati példa:
Query.Text = //keresse meg a teljes nómenklatúrát, amely tartalmazza a TABUR gyökeret és //kis vagy nagy t betűvel kezdődik "SELECT | Nomenclature. Link | FROM | Directory. Nomenclature AS Nomenclature | WHERE | Products. Name LIKE "" [Tt ]abur%""" ;
5. Tervezés ENGEDÉLYEZVE- ez az operátor lehetővé teszi, hogy csak azokat a rekordokat válasszuk ki az adatbázisból, amelyekhez a hívó olvasási jogosultsággal rendelkezik. Ezek a jogok rekordszinten (RLS) vannak konfigurálva.
Szintaxis: Az ALOWED a SELECT kulcsszó után van írva
Használati példa:
Request.Text = "KIVÁLASZTÁS ENGEDÉLYEZETT | Partnerek. Link | FROM | Címtár. Partnerek MINT szerződő felek";
6. Tervezés KÜLÖNBÖZŐ- lehetővé teszi olyan rekordok kiválasztását, amelyekben nincsenek ismétlődő rekordok.
Szintaxis: A SELECT kulcsszó után a VARIOUS szerepel
Használati példa:
Request.Text = //kiválasztja azokat a rekordokat, amelyekhez az olvasónak joga van "SELECT VARIOUS | Counterparties.Name |FROM | Directory. Counterparties AS Counterparties" ;
Ezenkívül a KÜLÖNBÖZŐ konstrukció használható az ALOWED operátorral és más operátorokkal.
Használati példa:
Request.Text = //különféle rekordokat választ ki, amelyekhez az olvasónak joga van "SELECT ALOWED VARIOUS | Counterpartties.Name |FROM | Directory. Counterparties AS Counterparties";
7. Tervezés ELŐSZÖR- a lekérdezés eredményéből kiválasztja a paraméterben megadott rekordok számát.
Szintaxis: FIRST<число>
Használati példa:
Request.Text = //válassza ki az első 4 CCD-számot a "SELECT FIRST 4 | CCD Numbers. Link | FROM | Directory. CCD Numbers AS CCD Numbers" könyvtárból;
8. Tervezés VÁLTOZÁSRA- lehetővé teszi az asztal zárolását, csak tranzakciókban működik (csak az automatikus zárolásoknál releváns).
Szintaxis: VÁLTOZÁSRA<НаименованиеТаблицы>
Használati példa:
Query.Text = "SELECT | Szabad Maradék Maradék. Nómenklatúra, | Szabad Maradék. Raktár, | Szabad Maradék. Raktáron Maradt | FROM | Felhalmozások nyilvántartása. Ingyenes Maradványok. Maradványok, mint szabad maradványok Maradékok | VÁLTOZTATÁSI lajstrom | . Szabad Maradék. Maradék";
9. Tervezés MEGRENDELÉS- meghatározott mezők szerint rendezi az adatokat. Ha a mező hivatkozás, akkor a zászló beállításakor AUTOMATIKUS RENDELÉS A rendezés linkábrázolás szerint történik; ha a jelző ki van kapcsolva, akkor a hivatkozások a memóriában lévő hivatkozási cím rangja szerint vannak rendezve.
Szintaxis: RENDEZÉS<НаименованиеПоля>AUTOMATIKUS RENDELÉS
Használati példa:
Query.Text = "SELECT | Free Remainings Remainings. Nomenclature AS Nomenclature, | Free Remainings Remainings. Warehouse AS Raktár, | Free Remainings Remainings. Raktáron Maradvány | FROM | Regisztráljon Felhalmozások. Szabad Maradványok. Fennmaradó AS Free Remaining Remainings BY | | Nómenklatúra | AUTOMATIKUS MEGRENDELÉS";
10. Tervezés GROUP BY- a lekérdezési karakterláncok meghatározott mezők szerinti csoportosítására szolgál. A numerikus mezőket minden összesítő függvénynél használni kell.
Szintaxis: CSOPORTOSÍT<НаименованиеПоля1>, .... , <НаименованиеПоляN>
Használati példa:
Query.Text = "SELECT | ItemsInWarehouses.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.Stock) AS KÉSZLET |FROM | RegisztrációAccumulations.ItemsInWarehouses AS | ItemsInWarehouses | ItemsInWarehouses | ItemsInWarehouses | ItemsInWarehouses |ItemsInWare | AtWarehouse ah.Warehouse" ;
11. Tervezés HAVING- lehetővé teszi, hogy a WHERE konstrukcióhoz hasonlóan összesítő függvényt alkalmazzon egy adatkiválasztási feltételhez.
Szintaxis: HAVING<агрегатная функция с условием>
Használati példa:
Query.Text = //csoportosított rekordokat választ ki, ahol az InStock mező nagyobb, mint 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenclature, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS KÉSZLET |FROM | RegisztrálásKészletekbe | CSOPORTOSÍTÁS | TermékekRaktárokban.Nómenklatúra, | Raktártermékek.Raktár | |RENDELHETŐ | ÖSSZEG(TermékekRaktárban.Raktáron) > 3" ;
12. Építés INDEX BY- a lekérdezési mező indexelésére szolgál. Az indexeléssel rendelkező lekérdezések végrehajtása hosszabb ideig tart, de felgyorsítja az indexelt mezők közötti keresést. Csak virtuális táblákban használható.
Szintaxis: INDEX BY<Поле1, ... , ПолеN>
Használati példa:
Query.Text = "SELECT | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .CodeOS";
13. Tervezés HOL- lehetővé teszi, hogy feltételt szabjon bármely kiválasztási mezőre. Az eredmény csak a feltételnek megfelelő rekordokat tartalmazza.
Szintaxis: AHOL<Условие1 ОператорЛогСоединения УсловиеN>
Használati példa:
Query.Text = //az összes CompensationRemaining rekord ki van választva<>0 és //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORremains.Counterparty, |CompensationRPORremains.Child, | CompensationRPORremains.CompensationRemaining, | CompensationRPORremains.AmountForCalcCompRemains.AmountForCalcCompRemains.AmountForCalcCompRemains ensationRPRemains | WHERE |KompenzációRPORmarad.Kártérítés Maradék<>0 | És CompensationRPORemains.AmountForCalcCompRemaining> 100" ;
14. Tervezési EREDMÉNYEK... ÁLTALÁNOS- az összegek kiszámítására szolgál; a terv meghatározza azokat a mezőket, amelyek alapján az összegek kiszámításra kerülnek, és az összesítő függvényeket alkalmazza az összesített mezőkre. Ha az ÖSSZESEN konstrukciót követően minden mezőhöz összegeket használ, az adatok csoportosulnak. Van egy opcionális GENERAL konstrukció, ennek használata további csoportosítást is biztosít. Az alábbiakban láthat egy példát a kérés eredményére.
Szintaxis: EREDMÉNYEK<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>ÁLTAL<ОБЩИЕ> <Поле1, ... , ПолеN>
Használati példa:
Request.Text = "SELECT | Számítások. Ügyfélszerződés. Szerződés típusa AS szerződés típusa, | számítások. Partneri megállapodás AS szerződés, | számítások. szerződő fél, | számítások. kölcsönös elszámolási egyenleg összege AS egyenleg | FROM | Felhalmozási nyilvántartás. Kölcsönös Elszámolás szerződő felekkel. Egyenlegek AS számítások | ÖSSZESEN | ÖSSZEG (Egyenleg) | Szoftver | ÁLTALÁNOS, | Szerződés típusa";
Az ábra a kérés teljesítése során kialakult csoportosításokat vázolja, a felső az ÁLTALÁNOS, a második a Partnerszerződés-szerződés típusa mezőre vonatkozik.
A „role” konfigurációs objektum egy sor jogot ad a konfigurációs objektumok feletti műveletekhez (műveletekhez).
Szerep "Teljes jogok".
Ez csak egy szerep (nem előre definiált), amelyben az összes konfigurációs objektumhoz tartozó összes jogtípus ellenőrzésre kerül.
Ami megkülönbözteti a többi szereptől, az az „Adminisztrációs” jog jelenléte.
Ha legalább egy felhasználó létrejön, a rendszer elkezdi ellenőrizni az „Adminisztráció” jog meglétét - legalább egy felhasználónak rendelkeznie kell vele.
Rekordszintű hozzáférési korlátozások
Sorszintű biztonság (RLS) – rekordszintű korlátozás.
Az adathozzáférési korlátozási mechanizmus lehetővé teszi a hozzáférési jogok kezelését nem csak a metaadat objektumok szintjén, hanem az adatbázis objektumok szintjén is. A következő objektumok használhatók az adatokhoz való hozzáférés korlátozására:
- szerepek,
- munkamenet paraméterei,
- funkcionális lehetőségek,
- privilegizált megosztott modulok,
- ALOWED kulcsszó a lekérdezés nyelvén.
A mechanizmust úgy tervezték, hogy korlátozza a metaadat-objektum tábla rekordjaihoz való hozzáférést a táblák sormezőinek értékeihez rendelt tetszőleges feltételek alapján. Például, ha csak a „saját” szerződő felekre, szervezetekre stb.
Hozzáférési korlátozások technikai megvalósítása az 1C-ben
Az 1C kérést generál a DBMS-hez. A szerverfürt hozzáad egy WHERE szakaszt a kérelemhez, amely tartalmazza az RLS-en keresztüli hozzáférés korlátozásának feltételének szövegét, majd ezt a kérést elküldi a DBMS-nek, a kivont adatokat visszaküldi az 1C kliensnek.
Ez a mechanizmus az ügyféltől érkező bármely kérés esetén működik:
- jelentésekben,
- dinamikus listákban és szabályos listaformákban
- egyéni lekérdezésekben.
A mechanizmus ilyen megvalósítása nagyban befolyásolja a teljesítményt.
A hozzáférési korlátozások megkerülésének módjai.
Nagy erőforrás-igényes műveleteknél (például dokumentumok újraküldésének feldolgozása) a kód egy része áthelyezhető kiemelt modulokba.
A) Privilegizált modul egy gyakori modul, a tulajdonságokban a „Privileged” jelzővel.
Különlegessége, hogy a benne lévő kód minden hozzáférési jogosultság ellenőrzése nélkül fut le, beleértve az RLS-t is.
B) Szintén kiváltságos az üzemmód bekapcsolható dokumentum objektum modulokhoz. Ez a dokumentum tulajdonságainál, flagben történik
- Kiemelt bánásmód a lebonyolítás során
- Kiváltságos mód a tranzakció törlésekor
B) Módszer SetPrivilegedMode()
A System parancs lehetővé teszi, hogy bármely modul kódjának egy részét privilegizálttá tegye.
A következő kódsortól a privilegizált végrehajtási mód fog működni.
Ez addig fog működni, amíg az üzemmódot letiltja, vagy az eljárás / funkció végéig
(Igaz);
// az itt található kódok jogkezelés és RLS nélkül végrehajtásra kerülnek
SetPrivilegedMode(Fekszik ); // vagy az eljárás vége / függvény
A privilegizált mód engedélyezésének számának meg kell egyeznie a letiltások számával. Ha azonban egy eljáráson vagy funkción belül a privilegizált módot bekapcsolták (egyszer vagy többször), de nem kapcsolták ki, akkor a rendszer automatikusan leáll, ahányszor hiányos bekapcsolások voltak az eljárásban vagy funkcióban.
Ha egy eljárásban vagy függvényben meghív egy metódust SetPrivilegedMode(False) több mint metódushívást végzett SetPrivilegedMode(Igaz ), akkor kivételt dobunk
Funkció PrivilegedMode() igaz értéket ad vissza, ha a privilegizált mód továbbra is engedélyezve van, és False értéket, ha teljesen le van tiltva. Ez nem elemzi egy adott funkció privilegizált üzemmód-beállításainak számát.
Minden meghívott eljárás és függvény privilegizált módban is végrehajtódik.
Lehetőség van kiemelt munkamenet indítására is. Ez egy olyan munkamenet, amelyben a privilegizált mód a rendszer kezdetétől fogva jön létre. Sőt, működés közben a módszer PrivilegedMode() mindig igaz értéket ad vissza, és a privilegizált mód letiltása nem támogatott. Kiváltságos munkamenetet csak adminisztrátori jogokkal (Adminisztrációs jog) rendelkező felhasználó indíthat. A munkamenet az ügyfélalkalmazás indító parancssori UsePrivilegedMode kapcsolójával vagy az infobase kapcsolati karakterlánc prmod paraméterével indítható el.
Felmerül természetesen a kérdés: Miért kell egyáltalán hozzáférési korlátozásokat felállítani, ha ez olyan könnyen megkerülhető?
Biztonságos mód.
Igen, írhat külső feldolgozást privilegizált végrehajtási móddal, és törölheti/sérült adatokat. Ennek megakadályozására a rendszer rendelkezik egy globális kontextus módszerrel
SetSafeMode().
A csökkentett mód többek között figyelmen kívül hagyja a privilegizált módot.
Telepíteni kell a külső processzorok programozott meghívása vagy az eljárások és funkciók moduljaiból történő exportálása előtt.
Tiltott műveletek végrehajtásakor a rendszer kivételt dob futás közben.
Ezenkívül a szerepbeállítások szintjén letilthatja a felhasználók számára a külső jelentések és feldolgozás interaktív indítását.
Hozzáférési korlátozások beállítása
Az RLS csak a következő jogokhoz konfigurálható:
- olvasni (választani)
- hozzáadás (beszúrás)
- változás (frissítés)
- töröl
Olvasási műveletekhezés törlés esetén az adatbázisban található objektumnak meg kell felelnie az adathozzáférési korlátozásoknak.
Az add művelethez Az adathozzáférési korlátozásnak meg kell felelnie az adatbázisba írni tervezett objektumnak.
Változási művelethez az adathozzáférési korlátozásnak meg kell felelnie az objektumnak mind a változtatás előtt (hogy az objektum beolvasásra kerüljön), mind a változtatás után (hogy az objektum ki legyen írva).
Az összes többi jog esetében nincs ilyen lehetőség.
Adjunk hozzá egy új korlátozást a „Nómenklatúra” könyvtár „olvasási” jogára. Megnyílik azon mezők listája, amelyekhez beállíthatja a hozzáadott korlátozást.
Ez azt jelenti, hogy ha megpróbál hozzáférni a bejelölt mezőkhöz, akkor a korlátozás aktiválódik, de ha megpróbál hozzáférni a nem bejelölt mezőkhöz, a korlátozás nem fog működni.
Ha a zászlót választja Egyéb mezők", a korlátozás minden táblamezőre be lesz állítva, kivéve azokat a mezőket, amelyekre kifejezetten korlátozások vannak beállítva.
*Funkció: a hozzáadási, módosítási, törlési jogokhoz:
- A korlátozás csak az összes mezőre konfigurálható.
- Csak egy korlátozás lehet.
Az „Olvasás” jobbhoz több feltételt is beállíthat, ezek az „AND” logikai operátorral kombinálódnak.
A fő kényszeradat-objektum nem minden mezője használható a következő típusú adatbázis-objektumok korlátozásaiban:
- a felhalmozási regiszterekben a hozzáférési korlátozások csak a korlátozás fő tárgyának méréseit tartalmazhatják;
- a számviteli nyilvántartásokban a korlátozások csak a korlátozás fő tárgyának mérleg szerinti mérését használhatják
Ha a keringő felhalmozási regiszter adataihoz korlátozott hozzáférési feltételek mellett olyan méréseket használnak, amelyek nem szerepelnek az összesítésben, akkor a virtuális fordulatszámtáblázat elérésekor a tárolt összesítések nem kerülnek felhasználásra, és a kérés teljes mértékben a a mozgásasztal.
A hozzáférési korlátozások bevezetésének mechanizmusa.
Az 1C:Enterprise adatbázisban tárolt adatokkal végzett bármilyen művelet végül az adatbázis felhívásához vezet, és az adatok olvasására vagy módosítására vonatkozó kérést. Adatbázis-lekérdezések végrehajtása közben belső mechanizmusok Az 1C:Enterprise hozzáférési korlátozásokat hajt végre. Ahol:
- Létrejön a jogok listája(olvasás, hozzáadása, módosítás, törlés), az adatbázistáblák listája és a lekérdezés által használt mezők listája.
- Az aktuális felhasználó összes szerepköréből hozzáférési korlátozások vannak kiválasztva a kérelemben érintett összes jog, táblázat és mező adataihoz. Ezenkívül, ha egy szerepkör nem tartalmaz korlátozásokat egy tábla vagy mező adataihoz való hozzáférésre vonatkozóan, ez azt jelenti, hogy a szükséges mezők értékei bármely rekordból elérhetők ebben a táblázatban. Más szóval, az adathozzáférési korlátozás hiánya a WHERE IS Truth korlátozás meglétét jelenti.
- Lekéri az összes munkamenet-paraméter és funkcionális beállítás aktuális értékét részt vesz a kiválasztott korlátozásokban.
Egy munkamenet-paraméter vagy szolgáltatásbeállítás értékének lekéréséhez az aktuális felhasználónak nem kell engedélye lennie az érték megszerzéséhez. Ha azonban valamelyik munkamenet-paraméter értéke nincs beállítva, hiba történik, és az adatbázis-lekérdezés nem kerül végrehajtásra.
Az egyik szerepkörből származó kényszerek az ÉS művelettel kombinálódnak.
A különböző szerepkörökből származó kényszerek a VAGY művelettel kombinálódnak.
A felépített feltételek hozzáadódnak azokhoz az SQL-lekérdezésekhez, amelyekkel az 1C: Enterprise hozzáfér a DBMS-hez. A hozzáférés-korlátozási feltételekből származó adatokhoz való hozzáféréskor nem történik jogosultság-ellenőrzés (sem a metaadat-objektumok, sem az adatbázis-objektumok esetében). Ezenkívül a feltételek hozzáadásának mechanizmusa az „összes” vagy „engedélyezett” korlátozások kiválasztott működési módjától függ.
*Tulajdonság: Ha egy felhasználó egy objektum rekordszintjén több szerepkörhöz is hozzáfér konfigurált korlátozásokkal, akkor ebben az esetben a korlátozások feltételei az „OR” logikai művelettel kerülnek hozzáadásra. Más szóval, a felhasználó képességei kumulatívak.
Ebből a következő következtetésre lehet jutni: ne engedjük, hogy egy objektumhoz való hozzáférés korlátozásának feltételei különböző szerepkörben keresztezzék egymást, mivel ebben az esetben a kérés szövege nagyon bonyolult lesz, és ez befolyásolja a teljesítményt.
"Minden" módszer.
Az „all” metódussal történő korlátozások bevetésekor az SQL-lekérdezésekhez feltételek és mezők kerülnek, így az 1C:Enterprise információt kaphat arról, hogy egy adatbázis-lekérdezés végrehajtása során használtak-e egy adott felhasználó számára tiltott adatokat vagy sem. Tiltott adatok használata esetén a kérelem összeomlik a hozzáférés megsértése miatt.
A hozzáférési korlátozások bevezetése „minden” módszerrel az ábrán látható sematikusan:
„Engedélyezett” módszer.
Az „allowed” metódussal történő korlátozások alkalmazásakor az SQL-lekérdezésekhez feltételek kerülnek hozzáadásra, így az aktuális felhasználó számára tiltott rekordok ne befolyásolják a lekérdezés eredményét. Más szóval, amikor az „engedélyezett” módban korlátozásokat vezetnek be, az adott felhasználó számára tiltott rekordok hiányzónak minősülnek, és nem befolyásolják a művelet eredményét, amelyet sematikusan az ábrán mutatunk be:
Az adathozzáférési korlátozások az adatbázis-objektumokra vonatkoznak, amikor az 1C:Enterprise hozzáfér az adatbázishoz.
Az 1C:Enterprise kliens-szerver verziójában korlátozások vonatkoznak az 1C:Enterprise szerverre.
Ez az opció (ALOWED) azonban nem fog működni, ha egy lekérdezésben olyan táblára hivatkozunk, amelyhez nincs beállítva hozzáférési korlátozás, de amely konfigurált korlátozásokkal rendelkező táblasorokra hivatkozik. Ebben az esetben a lekérdezés eredménye a „<Объект не найден>......" a referenciamező értéke helyett.
Ha szabványos vagy egyéni konfigurációs lekérdezések segítségével készít jelentést vagy feldolgoz, mindig ellenőrizze az "Engedélyezett" jelzőt hogy a jelentés működjön bármely felhasználó alatt bármilyen jogcsoporttal.
Adatok adatbázisból történő objektumolvasása esetén az „Engedélyezett” jelző nem állítható be. Ezért szükséges konfigurálja a kijelöléseket az objektumolvasáshoz, figyelembe véve a hozzáférési jogok lehetséges korlátozásait a felhasználó számára. Az objektumtechnológiában nincs lehetőség csak engedélyezett adatok megszerzésére.
Fontos, hogy ha egy lekérdezés nem adja meg az ALOWED kulcsszót, akkor a lekérdezésben megadott összes kijelölés nem ütközhet a lekérdezésben használt adatbázis-objektumokra vonatkozó olvasási korlátozások egyikével sem. Továbbá, ha a lekérdezés virtuális táblákat használ, akkor a megfelelő kijelöléseket magukra a virtuális táblákra kell alkalmazni.
Gyakorlat 1. Lekérdezéskészítő az RLS-beállításokban.
A lekérdezés „HOL” szakaszának szövegét írjuk be a könyvtárba. Használhatja a lekérdezéskészítőt.
A tervező lecsupaszított megjelenésű.
„Táblázatok” fül
A fő tábla annak az objektumnak a táblája lesz, amelyhez a megszorítást konfigurálják.
A „Kapcsolatok” lapon más táblákat is kiválaszthat, és különféle kapcsolatokat hozhat létre közöttük.
"Feltételek" lap
Itt konfigurálhatja a tényleges hozzáférési korlátozási feltételeket
Adjunk feltételeket a nómenklatúra-könyvtár „Price” attribútumához a táblázat összes mezőjének „olvasási” jogához.
„Nómenklatúra WHERE Nomenclature.Price > 500”
Nézzük meg, hogyan működik ez az egyszerű szabály. A címtártábla a következő elemeket tartalmazza:
A hozzáférési korlátozás beállítása után a táblázat csak azokat az elemeket jeleníti meg, amelyek megfelelnek a feltételnek:
A csoportok is eltűntek. Változtassuk meg a korlátozás szövegét
„Nómenklatúra WHERE Nomenclature.Price > 500
VAGY Nómenklatúra. Ez egy csoport"
Nos, most erre van szüksége.
Ha a listabeállításoknál eltávolítja a „kód” mező megjelenítését, akkor a könyvtár minden eleme megjelenik, pl. a korlátozás nem működött. Ha beállítja a „Kód” mező megjelenítését, a korlátozás működni fog.
Ebben az esetben annak ellenére, hogy a címtárelem látható a listamezőben, annak formája nem nyitható meg, mert az attribútum korlátozása be van állítva. Ugyanez történik egy tetszőleges kérés esetén: amikor megpróbál egy „korlátozott” tulajdonságot elérni, hozzáférési hiba lép fel.
Ha programozottan próbálja megszerezni a „korlátozott” hitelesítési adatokat, akkor egy hozzáférési hiba is megjelenik.
Ráadásul egy linken keresztül nem lehet majd elérni egy objektum egyetlen mezőjét sem, mert egy hivatkozás fogadásakor a rendszer a teljes objektumot beolvassa, ha pedig „korlátozott” részleteket tartalmaz, akkor az objektum nem kerül beolvasásra.
Ezért, amikor programozottan dolgozik adatbázis-objektumokkal, szem előtt kell tartania az esetleges rekordszintű korlátozásokat, és kérésre be kell szereznie az összes szükséges objektumadatot, majd el kell helyeznie azokat egy struktúrában, vagy a kód egy részét egy privilegizált modulban kell végrehajtania.
A hozzáférési korlátozás beállítása után megváltozott a sor megjelenítése a jogok listájában - szürke lett és egy ikon jelent meg.
Korlátozások a hozzáférés (RLS) beállításakor.
- Nincs összefoglaló rész;
- A virtuális regisztertáblákhoz nem lehet hozzáférni;
- A paraméterek nem használhatók kifejezetten;
- Beágyazott lekérdezésekben használható any>/span> lekérdezési nyelvi eszközök, kivéve:
- operátor HIERARCHIÁBAN;
- EREDMÉNYEK javaslatok;
- beágyazott lekérdezés eredménye nem tartalmazhat táblázatelemeket>/span>;
- virtuális asztalok, különösen egyenlegek és forgalom
2. gyakorlat. Nómenklatúra aktuális áron.
Korlátozzon hozzáférést, ha olyan tételeket kell megjelenítenie, amelyek aktuális ára magasabb, mint egy bizonyos érték, például 100.
Megoldás:
Új hozzáférés-korlátozási szabályt adunk a „Nómenklatúra” könyvtárhoz „olvasási” joggal.
Válassza az „egyéb mezők” lehetőséget.
A konstruktorban hozzáadunk egy beágyazott lekérdezést. Ebben válassza ki a „Cikkárak” információs nyilvántartás táblázatot.
Nincs „megrendelés” lap – ez a lekérdezéstervező funkciója a hozzáférés-korlátozási kérés felépítéséhez.
Az „Advanced” (Speciális) lapon állítsa be a „first 999999999” értéket, megjelenik a „rendelés” fül.
Az „Időszak” mezőben a sorrendet csökkenő sorrendben állítjuk be.
Ezután hivatkozással kapcsolatot hozunk létre a főtábla és az allekérdezés között.
Hozzáféréskorlátozási sablonok.
3. gyakorlat. Konstans értékkel való korlátozása a „partnerekre”.
Állítsunk be egy hozzáférési korlátozást a Counterparties könyvtárhoz a konstansban tárolt érték alapján.
Ezenkívül korlátozást kell beállítania minden olyan objektum számára, amely a részletekben a „Counterparties” könyvtárat használja.
Megoldás
A „Counterparties” könyvtárban korlátozni fogjuk az „olvasási” jogot úgy, hogy egy beágyazott lekérdezést adunk a „Feltételek” szakasz konstansához. Ne felejtsd el, ez egy csoport.
Problémát látunk, a Counterparties mappa szűrése megfelelően megtörtént, és minden „Counterparty” attribútummal rendelkező dokumentum megjelenik, némelyiknél a „Counterparty” attribútumban „hibás” hivatkozások találhatók.
Most be kell állítania a hozzáférési korlátozásokat minden olyan objektumhoz, amely a „Fiókok” hivatkozást használja. Keressük meg őket az „objektumra mutató hivatkozások keresése” szolgáltatással.
Másoljuk át és módosítsuk kissé az RLS feltétel szövegét a „Counterparties” könyvtárból. Ezt annyiszor kell megtenni, ahány objektum található.
Vagy használjon hozzáférési korlátozási mintát a kódduplikációs problémák elkerülése érdekében.
A hozzáférés-korlátozási sablonok szerepkörszinten vannak konfigurálva, és a szerkesztett szerepkörön belül bármely objektumhoz használhatók.
A sablonhoz bármilyen hozzáférést korlátozó szöveget hozzáadhat. A sablon a „#” szimbólummal hívható meg. Például #TemplateCounterparty.
Az 1C-ben #-n keresztül utasítások íródnak az előfeldolgozóba. A hozzáférés-korlátozási beállítások végrehajtásával összefüggésben a platform lecseréli a sablonhívás szövegét a sablon szövegére.
Adjuk hozzá a WHERE szó utáni szöveget a „Vállalkozói sablon” sablonhoz, kivéve az EtoGroupról szóló szöveget.
Paraméterek a hozzáférés-korlátozási sablonokban.
Folytassuk a 2. feladat megoldását.
A probléma most az, hogy a címtár főtábláját „partnernek” nevezik, a „Nyugta számla” dokumentumban. A címtárban az ellenőrzött mező neve „link”, a dokumentumban pedig „Counterparty”.
Változtassuk meg a főtábla nevét a sablon szövegében a következőre: „#CurrentTable”
A "#CurrentTable" egy előre meghatározott paraméter.
És egy ponton keresztül jelezzük a bemeneti paraméter számát - „.#Parameter(1)
A „#Paraméter” szintén egy előre meghatározott érték. Tetszőleges számú bemeneti paramétert tartalmazhat. Sorozatszámmal vannak megcímezve.
A címtárra vonatkozó hozzáférési korlátozások szövegében a következőket jelöljük:
A dokumentumhoz a következők:
„Áruk értékesítése, WHERE #TemplateCounterparty (“partner”)
Hozzáféréskorlátozási sablon hívásakor a paramétereket csak Stringként, azaz idézőjelben kell átadni neki.
Fő táblázat - Nómenklatúra
A sablon szövege:
#CurrentTable WHERE #AktuálisTábla.#Paraméter(1) = #Paraméter(2)
A sablon szövege tartalmazza a szöveg egy részét az adathozzáférést korlátozó nyelven, és olyan paramétereket is tartalmazhat, amelyek a „#” szimbólummal vannak kiemelve.
A "#" szimbólum után következhet:
- Az egyik kulcsszó:
- Egy paraméter, amelyet a sablonban szereplő paraméter száma követ zárójelben;
- CurrentTable – annak a táblának a teljes nevének beszúrását jelzi a szövegbe, amelyre a megszorítás készül;
- CurrentTableName– a beépített nyelv aktuális verziójában a táblázat teljes nevének beszúrását jelöli (karakterlánc értékként, idézőjelben), amelyre az utasítás vonatkozik;
- NameCurrentAccessRight– tartalmazza annak a jognak a nevét, amelyre az aktuális korlátozás érvényesül: OLVASÁS, HOZZÁADÁS, BESZÚRÁS, MÓDOSÍTÁS, FRISSÍTÉS, TÖRLÉS;
- sablonparaméter neve – a megfelelő sablonparaméter-megkötés beszúrását jelenti a szövegbe;
- „#” szimbólum – egy „#” karakter beszúrását jelzi a szövegbe.
A hozzáférési korlátozás kifejezés a következőket tartalmazhatja:
- Hozzáférés-korlátozási sablon, amely a formátumban van megadva #TemplateName("1. sablonparaméter értéke", "2. sablonparaméter értéke",...). Minden sablon paraméter dupla idézőjelbe van zárva. Ha a paraméterszövegben dupla idézőjel karaktert kell megadnia, akkor két dupla idézőjelet kell használnia.
- StrContains függvény (WhereWeLook, WhatWeLook). A funkció célja, hogy megkeresse a WhatWeLook karakterlánc előfordulását a WhereWeLook karakterláncban. Igaz, ha az előfordulás megtalálható, hamis értéket ad vissza egyébként.
- A + operátor a karakterlánc összefűzésére szolgál.
A sablonszöveg szerkesztésének megkönnyítése érdekében a szerepkör űrlap Korlátozási sablonok lapján kattintson a Sablonszöveg beállítása gombra. A megnyíló párbeszédpanelen írja be a sablon szövegét, majd kattintson az OK gombra.
használatával nem telepíthetők SetParameter() vagy valami hasonló.
A paraméterek ebben az esetben a következők:
- Munkamenet opciók
- Funkcionális opciók
A hozzáférés-korlátozási kérésben a munkamenet-paraméterek beolvasása privilegizált módban történik, vagyis a velük való működési jogok ellenőrzése nélkül.
4. gyakorlat. Hozzáférés a „saját” partnerekhez
Be kell állítani az aktuális felhasználó hozzáférésének korlátozását „saját” partnerei számára.
Van egy „Felhasználók” címtár, egy „Konpertfelek” címtár, valamint a „Kereskedő fél” adatokkal ellátott dokumentumok.
Az aktuális felhasználónak csak azon partnerek adatait kell látnia, akiknek kapcsolata van vele.
A kommunikációt is konfigurálni kell.
Lehetséges opciók:
Kapcsolatok kialakítása a felhasználó és a partner között
- Részletek a partnerek névjegyzékében
- Információk nyilvántartása
Lehetséges megoldások a problémára:
- A felhasználó konstansban való tárolása rossz lehetőség; az állandó minden felhasználó számára elérhető.
- Az aktuális felhasználó partnereinek rögzített tömbjének tárolása a munkamenet paraméterei között nem túl jó jó lehetőség, sok partner lehet
- Elfogadható lehetőség az aktuális felhasználó munkamenet-paramétereinek tárolása, majd az „ő” partnerek listájának kérése.
- Egyéb opciók.
Megoldás.
Hozzon létre egy új "CurrentUser" munkamenet paramétert, és töltse ki a munkamenet modulban.
Hozzunk létre egy információs nyilvántartást „A vezetők és vállalkozók megfelelősége”
Hozzunk létre egy új szerepkört és abban egy új hozzáférési korlátozást a „Számla” bizonylathoz.
A kérelem szövegében a fő táblát összekapcsoljuk a Fiók = Számla és Kezelő = &Jelenlegi Felhasználó információs regiszterével. Csatlakozás típusa Belső.
Ha lehetséges, jobb elkerülni a beágyazott lekérdezéseket a hozzáférést korlátozó szövegekben, mivel ez minden alkalommal végrehajtódik, amikor az objektumból adatokat olvasnak ki az adatbázisból.
Ellenőrzés - a korlátozások működnek
*Tulajdonság: Ha módosítja a felhasználói partnerek listáját a nyilvántartásban, a hozzáférési korlátozások azonnal életbe lépnek, a felhasználói munkamenet újraindítása nélkül.
Gyakorlat 5. Változási tilalom dátuma.
Az adatok szerkesztésének korlátozását a változtatások tiltásának meghatározott időpontja előtt szükséges bevezetni.
Korlátozni kell a felhasználók számára.
Hozzuk létre a „Változtatási tilalom dátumai” információs nyilvántartást Felhasználó, erőforrás Tiltás dátuma dimenzióval.
Építsük fel a megoldás logikáját a következőképpen:
- ha egy felhasználó nincs megadva, akkor a tiltás minden felhasználóra vonatkozik
- ha korlátozás van minden felhasználóra és korlátozás egy adott felhasználóra, akkor a korlátozás egy adott felhasználóra vonatkozik, másokra pedig az általános elv szerint.
Nyilvánvaló, hogy egy ilyen megszorítás beállítható olyan adatbázis-objektumokhoz, amelyeknek valamilyen pozíciója van az időtengelyen. Lehet
- Dokumentáció
- Időszakos információs nyilvántartások
Hozzunk létre egy új szerepet „Korlátozások a változtatások tilalma dátuma szerint”.
Ebben a „Számla” bizonylathoz a megfelelő „módosításért” új hozzáférési korlátozást adunk.
Minden mezőre megadjuk a beállítást.
A korlátozás szövege:
ReceiptInvoice FROM Document.ReceiptInvoice AS ReceiptInvoice
A kitiltási dátumok módosítása. A kitiltási dátum AS kitiltási dátuma
TÓL TŐL
BELSŐ CSATLAKOZÁS (SELECT
MAX(Tiltott dátumok módosítása.Felhasználó) AS Felhasználó
TÓL TŐL
Információk nyilvántartása Változtatási tilalom dátumai AS Változtatási tilalom dátumai
AHOL
(Módosítsa a tiltott dátumokat.User = &Jelenlegi felhasználó
VAGY Dátumok ProhibitedChanges.User = VALUE(Directory.users.EmptyLink))) AS VZ_User
A változtatások tilalmának dátuma szerint.Felhasználó = VZ_Felhasználó.Felhasználó) AS NestedQuery
Szoftver nyugta Számla.Dátum > Beágyazott lekérdezés.Kitiltás dátuma
Ellenőrizzük – működik a korlátozás.
Az előfeldolgozó utasítások használata
#Ha Feltétel1 #Akkor
Kérelem töredék 1
#ElseIf Feltétel2 #Akkor
Kérelem töredék 2
#Másképp
Kérelem töredék 3
#EndIf
Adott körülmények között használható logikai műveletek(és. vagy, nem stb.) és a munkamenet paramétereinek elérése.
Ez a megközelítés a hozzáférési korlátozások felépítésével összefüggésben kényelmes abból a szempontból, hogy a feltételektől függően rövidebb kérési szöveg kerül összeállításra. Egy egyszerűbb lekérdezés kevésbé terheli a rendszert.
Hátránya, hogy a lekérdezéskonstruktor nem fog működni ilyen szöveggel.
* Különlegesség:
Ellentétben a beépített nyelv előfeldolgozójának utasításaival a hozzáférés-korlátozási szövegekben, az operátor elé kell tenni egy hash-t - #Then
6. gyakorlat. Kapcsolja be az „RLS használata” lehetőséget
Egészítsük ki korlátozási rendszerünket egy kapcsolóval, amely rekordszinten kapcsolja be/ki a korlátozások használatát.
Ehhez hozzáadunk egy állandót és egy „UseRLS” nevű session paramétert.
Írjuk be a Session Module-ba, hogy az állandó értékéből állítsuk be a session paraméter értékét.
Adjuk hozzá a következő kódot az összes hozzáférés-korlátozási szöveghez:
„#If &UseRLS #Akkor….. #EndIf”
Ellenőrizzük - minden működik.
Most azonban a „radar használata” jelző bekapcsolása után a változtatások nem lépnek azonnal életbe. Miért?
Mivel a session paraméter a munkamenet indításakor kerül beállításra.
Lehetőség van beállítani, hogy a session paraméter értéke visszaálljon új állandó érték írásakor, de ez csak az aktuális felhasználói munkamenetre fog működni. A többi felhasználót a rendszer újraindítására kell kérni.
Az első rész vége.
). Ennek a kulcsszónak a használatával elkerülheti a hibákat olyan rekordok lekérésekor, amelyekhez a felhasználónak nincs joga.
Probléma: Bizonyos esetekben az 1C 8.3 adathozzáférési korlátozásainak eredménye a DBMS lekérdezési tervtől függhet. Ez a cikk megvizsgálja a lehetséges helyzeteket, és javaslatokat ad ennek elkerülésére.
Az adathozzáférési korlátozások eredményének a DBMS lekérdezési tervtől való esetleges függésének problémája akkor merülhet fel, ha kulcsszó nélküli adatbázis-lekérdezést hajtanak végre. ENGEDÉLYEZVE, ha az aktuális felhasználó adathozzáférési korlátozásokkal rendelkezik, és a kérés az űrlap egy vagy több összehasonlítását tartalmazza:
- <Выражение над полями>(BE|NEM BE) (<Вложенный запрос>)
- (<Выражение над полями 1>, …, <Выражение над полями N>) (BE|NEM BE) (<Вложенный запрос>)
Ha ebben az esetben < > (lekérdezés a lekérdezésben) adatbázis táblákat használ, amelyekre hozzáférési korlátozások vonatkoznak, előfordulhat, hogy egyes DBMS-eken a lekérdezés sikeresen lefut, míg másokon üzenetet adnak ki, feltéve, hogy az információs bázisokban lévő adatok teljesen azonosak .
Szerezzen ingyen 267 videóleckét 1C-n:
Az eltérések oka
Az esetleges viselkedésbeli eltérés a kulcsszó nélküli adathozzáférési korlátozások bevezetéséből adódik ENGEDÉLYEZVE az 1C Enterprise 8.3-ban.
Lekérdezés kulcsszó nélkül ENGEDÉLYEZVE csak akkor kerül végrehajtásra sikeresen, ha végrehajtása során nem történik hozzáférés tiltott adatokhoz. Ehhez egy speciális jelmező kerül hozzáadásra, amely felveszi az értéket Igaz azon iratok esetében, amelyek kialakításában csak engedélyezett adatok vettek részt, és az érték Fekszik az összes többi bejegyzéshez. Ha legalább egy mintarekord tartalmazza az értéket Fekszik a jel mezőben a kérés végrehajtása rendellenesen végződik.
Ugyanez a jelmező hozzáadódik az összehasonlításba ágyazott lekérdezések eredményeihez BAN BEN/NEM BENT. Ezenkívül a jeloszlop értékének ellenőrzése ebben az esetben DBMS eszközökkel történik. Így ha egy beágyazott lekérdezés végrehajtása során tiltott adatokhoz fértek hozzá, akkor a lekérdezés hibával meghiúsul. A felhasználónak nincs elegendő jogosultsága egy művelet végrehajtásához az adatbázison.
Lekérdezési terv készítésekor azonban előfordulhat, hogy a DBMS nem kapja meg a teljes mintát <Вложенным запросом> , és csak azokat a rekordokat kapja meg, amelyek valóban szükségesek az állapot ellenőrzéséhez BAN BEN/NEM BENT. Ebben az esetben a kérés akkor is sikeres lehet, ha a <Вложенного запроса> független kérésként tiltott adatokhoz való hozzáférés történhet.
Nézzünk egy egyszerű példát. Engedd az asztalra Címtár. Magánszemélyek az adatokhoz való hozzáférést korlátozzák. Ebben az esetben a kérés:
táblázat.Egyén AS Egyén
tiltott adatokhoz való hozzáférési kísérlet miatt hibával fog végrehajtani. Ha ez a lekérdezés összehasonlításra vonatkozik, például:
táblázat.Egyén AS Egyén
Címtár. Magánszemélyek AS táblázat)
akkor a kiválasztott DBMS lekérdezési tervtől függően a lekérdezés sikeresen vagy hibásan végrehajtható. Ez a kérési viselkedés nem hiba, mert a kérés végrehajtása során tiltott adatokhoz is hozzá lehet férni, vagy nem. A kiszámíthatóbb eredmény érdekében a lekérdezést úgy kell összeállítani, hogy a beágyazott lekérdezés garantáltan ne férhessen hozzá nyilvánvalóan szükségtelen adatokhoz. Különösen, ha az előző lekérdezést így írják át:
Munkavégzési szerződés egyénnel.Alkalmazott.Magánszemély
Dokumentum Fizikai személlyel végzett munkavégzésre vonatkozó megállapodás, mint fizikai személlyel végzett munka végzésére vonatkozó megállapodás
Munkavégzési szerződés egyénnel.Munkavállaló.B magánszemélyrel (
táblázat.Egyén AS Egyén
Címtár.Egyének AS táblázat
A lekérdezési nyelv az 1C 8.3 egyik alapvető mechanizmusa a fejlesztők számára. Lekérdezések segítségével gyorsan lekérheti az adatbázisban tárolt adatokat. Szintaxisa nagyon hasonlít az SQL-hez, de vannak eltérések.
Az 1C 8.3 (8.2) lekérdező nyelv fő előnyei az SQL-lel szemben:
- hivatkozási mezők hivatkozásának megszüntetése (egy vagy több pont hivatkozása az objektum részleteire);
- az eredményekkel dolgozni nagyon kényelmes;
- virtuális táblák létrehozásának képessége;
- a kérelmet angolul és oroszul is meg lehet írni;
- az adatok blokkolásának képessége a holtpontok elkerülése érdekében.
A lekérdezési nyelv hátrányai az 1C-ben:
- az SQL-től eltérően az 1C lekérdezések nem teszik lehetővé az adatok megváltoztatását;
- a tárolt eljárások hiánya;
- egy karakterlánc számmá alakításának lehetetlensége.
Vessünk egy pillantást az 1C lekérdezési nyelv alapvető konstrukcióiról szóló mini oktatóanyagunkra.
Tekintettel arra, hogy az 1C-ben a lekérdezések csak adatok fogadását teszik lehetővé, minden lekérdezésnek a „SELECT” szóval kell kezdődnie. A parancs után megjelennek azok a mezők, amelyekből adatokat kell beszerezni. Ha „*”-t ad meg, az összes elérhető mező ki lesz jelölve. A „FROM” szó után megjelenik az a hely, ahonnan az adatok kiválasztásra kerülnek (dokumentumok, nyilvántartások, címtárak stb.).
Az alábbiakban tárgyalt példában a teljes nómenklatúra nevei a „Nómenklatúra” könyvtárból vannak kiválasztva. A „HOGYAN” szó után a táblázatok és mezők álnevei (nevei) láthatók.
VÁLASZT
Nómenklatúra Név AS A nómenklatúra neve
TÓL TŐL
Directory.Nomenclature AS NómenklatúraA „SELECT” parancs mellett kulcsszavakat adhat meg:
- KÜLÖNFÉLE. A lekérdezés csak azokat a sorokat jelöli ki, amelyek legalább egy mezőben különböznek egymástól (ismétlődések nélkül).
- ELSŐ n, Ahol n– az eredmény elejétől a kiválasztandó sorok száma. Leggyakrabban ezt a konstrukciót a válogatással együtt használják (ORDER BY). Például, ha bizonyos számú, dátum szerint friss dokumentumot kell kiválasztania.
- ENGEDÉLYEZVE. Ez a kialakítás lehetővé teszi, hogy az adatbázisból csak azokat a rekordokat válasszuk ki, amelyek az aktuális felhasználó számára elérhetőek. A kulcsszó használata alapján a felhasználó hibaüzenetet kap, amikor olyan rekordokat próbál lekérdezni, amelyekhez nem fér hozzá.
Ezek a kulcsszavak együtt vagy külön-külön is használhatók.
VÁLTOZÁSRA
Ez a javaslat blokkolja az adatokat a kölcsönös konfliktusok elkerülése érdekében. A zárolt adatok nem kerülnek beolvasásra másik kapcsolatból a tranzakció befejezéséig. Ebben a záradékban megadhat bizonyos táblákat, amelyeket zárolni kell. Ellenkező esetben mindenki blokkolva lesz. A kialakítás csak az automatikus zárolási módra vonatkozik.
Leggyakrabban a „FOR CHANGE” záradékot használják egyenlegek fogadásakor. Hiszen ha több felhasználó dolgozik egyidejűleg a programban, miközben az egyik egyenleget kap, egy másik módosíthatja azokat. Ebben az esetben a kapott maradék már nem lesz helyes. Ha ezzel a javaslattal zárolja az adatokat, addig amíg az első alkalmazott meg nem kapja a megfelelő egyenleget és el nem végzi vele az összes szükséges manipulációt, addig a második dolgozó kénytelen várakozni.
VÁLASZT
Kölcsönös elszámolások. Munkavállaló,
Kölcsönös elszámolások Kölcsönös elszámolások összege Egyenleg
TÓL TŐL
Felhalmozási nyilvántartás Kölcsönös elszámolások alkalmazottakkal Egyenlegek AS Kölcsönös elszámolások
VÁLTOZÁSRAAHOL
A tervezésre azért van szükség, hogy valamilyen szelekciót kényszerítsünk a feltöltött adatokra. A regiszterekből történő adatok beszerzésének egyes esetekben ésszerűbb kiválasztási feltételeket megadni a virtuális táblák paramétereiben. A "WHERE" használatakor először minden rekord lekérésre kerül, és csak ezután történik a kijelölés, ami jelentősen lelassítja a lekérdezést.
Az alábbiakban egy példa látható egy kapcsolattartó személy megszerzésére irányuló kérelemre egy adott pozícióhoz. A kiválasztási paraméter formátuma: &ParameterName (a paraméter neve tetszőleges).
KIVÁLASZTÁS (CASE)
A kialakítás lehetővé teszi, hogy a feltételeket közvetlenül a kérelem törzsében adjon meg.
Az alábbi példában a „További mező” szöveget tartalmaz attól függően, hogy a dokumentum fel van-e küldve vagy sem:
VÁLASZT
BelépőT&U.Link,
VÁLASZTÁS
MIKOR a felvételiT&U.Végzett
AKKOR „A dokumentumot elfogadták!”
EGYÉB „A dokumentum nem került feladásra...”
VÉGE MINT Kiegészítő mező
TÓL TŐL
Dokumentum Áruk és szolgáltatások átvétele HOGYAN Átvételi feltételekCSATLAKOZIK
A csatlakozások két asztalt kötnek össze bizonyos feltétel kommunikáció.
BAL/JOBB CSATLAKOZTATÁS
A LEFT join lényege, hogy az első megadott táblát teljes egészében felvesszük, a másodikat pedig a kapcsolódási feltételnek megfelelően csatoljuk hozzá. Ha a másodikban nincsenek az első táblának megfelelő rekordok, akkor ezek értéke NULL lesz. Egyszerűen fogalmazva, a fő tábla az első megadott tábla, és a második tábla adatai (ha vannak ilyenek) már ki vannak cserélve annak adataira.
Például az árucikkeket az „Áruk és szolgáltatások átvétele” bizonylatokból, az árakat pedig a „Cikkárak” információs nyilvántartásból kell beszerezni. Ebben az esetben, ha valamelyik pozíció ára nem található, cserélje ki helyette a NULL értéket. A dokumentum összes eleme ki lesz választva, függetlenül attól, hogy van-e ára vagy sem.
VÁLASZT
Nyugta és U. Nómenklatúra,
Árak. Ár
TÓL TŐL
Dokumentum Áruk és szolgáltatások átvétele Áruk HOGYAN Átvétel és specifikációk
BELSŐ CSATLAKOZÁS RegisztrációInformation.PricesNomenclature.SliceLast AS Árak
Software Receipt&U.Nomenclature = Prices.NomenclatureJOBBAN minden pontosan az ellenkezője.
TELJES KAPCSOLAT
Ez a kapcsolattípus abban különbözik a korábbiaktól, hogy ennek eredményeként mind az első, mind a második tábla összes rekordja visszakerül. Ha a megadott hivatkozási feltétel alapján nem található rekord az első vagy a második táblában, akkor a rendszer NULL értéket ad vissza.
Amikor az előző példában használjuk teljes kapcsolat Az „Áruk és szolgáltatások átvétele” bizonylaton szereplő összes tétel, valamint a „Cikkárak” nyilvántartásból a legfrissebb árak kerülnek kiválasztásra. A nem található rekordok értéke mind az első, mind a második táblában NULL lesz.
BELSŐ ÖSSZEKAPCSOLÁS
Az INNER JOIN és a FULL JOIN között az a különbség, hogy ha egy rekord nem található legalább az egyik táblában, akkor a lekérdezés egyáltalán nem jeleníti meg. Ennek eredményeként az „Áruk és szolgáltatások átvétele” bizonylatból csak azok a tételek kerülnek kiválasztásra, amelyekre a „Cikkárak” információs nyilvántartásban vannak bejegyzések, ha az előző példában a „TELJES” szót „BELSŐ”-re cseréljük.
CSOPORTOSÍT
Az 1C lekérdezésekben történő csoportosítás lehetővé teszi a táblasorok összecsukását (mezők csoportosítását) egy adott meghatározottság szerint. közös tulajdonság(csoportosított mezők). A csoportosító mezők csak összesítő függvényekkel jeleníthetők meg.
A következő lekérdezés eredménye a terméktípusok listája lesz, a hozzájuk tartozó maximális árakkal.
VÁLASZT
,
MAX(Ár.Ár) AS Ár
TÓL TŐL
CSOPORTOSÍT
Árak.Nómenklatúra.Nómenklatúra típusaEREDMÉNYEK
A csoportosítással ellentétben az összegek használatakor az összes rekord megjelenik, és az összesített sorok hozzáadódnak hozzájuk. A csoportosítás csak az általánosított rekordokat jeleníti meg.
Az eredmények összegezhetők a teljes táblázatra (az „Általános” kulcsszó használatával), több mezőre, hierarchikus felépítésű mezőkre (kulcsszavak „HIERARCHIA”, „CSAK HIERARCHIA”). Az eredmények összegzésekor nem szükséges aggregált függvényeket használni.
Nézzünk egy, a fenti példához hasonló példát csoportosítással. Ebben az esetben a lekérdezés eredménye nem csak csoportosított mezőket ad vissza, hanem részletes rekordokat is.
VÁLASZT
Prices.Nomenclature.Type of Nomenclature AS A nómenklatúra típusa,
Árak.Ár AS ár
TÓL TŐL
Információk nyilvántartása. Nómenklatúra árai. Pillanatkép a legújabb AS árakról
EREDMÉNYEK
MAXIMUM (ár)
ÁLTAL
TípusNómenklatúraHAVING
Ez az operátor hasonló a WHERE operátorhoz, de csak összesített függvényekhez használatos. A többi mezőt, kivéve azokat, amelyeket ez az operátor használ, csoportosítani kell. A WHERE operátor nem alkalmazható az összesített függvényekre.
Az alábbi példában egy cikk maximális árai vannak kiválasztva, ha azok meghaladják az 1000-et, cikktípus szerint csoportosítva.
VÁLASZT
MAX(Ár.Ár) AS Ár
TÓL TŐL
Információk nyilvántartása. Nómenklatúra árai. Pillanatkép a legújabb AS árakról
CSOPORTOSÍT
Árak.Nómenklatúra.Nómenklatúra típusa
HAVING
MAXIMUM(Árak.Ár) > 1000RENDEZÉS
Az ORDER BY operátor rendezi a lekérdezés eredményét. Annak biztosítására, hogy a rekordok következetes sorrendben jelenjenek meg, az AUTO ORDER használatos. A primitív típusokat a szokásos szabályok szerint rendezzük. A referenciatípusok GUID szerint vannak rendezve.
Példa az alkalmazottak név szerint rendezett listájára:
VÁLASZT
Alkalmazottak.Name AS Név
TÓL TŐL
Directory.Employees HOGYAN Alkalmazottak
RENDEZÉS
Név
AUTOMATIKUS RENDELÉSEgyéb 1C lekérdezési nyelvi konstrukciók
- KOMBÁJN– két lekérdezés eredménye egybe.
- ÖSSZE MINDENT– hasonló a COMBINE-hoz, de az azonos sorok csoportosítása nélkül.
- ÜRES ASZTAL– néha használják lekérdezések összekapcsolásakor egy üres beágyazott tábla megadására.
- HELY– ideiglenes táblát hoz létre az összetett 1C lekérdezések optimalizálásához. Az ilyen kéréseket kötegelt kéréseknek nevezzük.
Lekérdezési nyelv jellemzői
- SUBSTRING egy karakterláncot adott pozícióból meghatározott számú karakterre csonkol.
- ÉV...MÁSODIK lehetővé teszi egy numerikus típus kiválasztott értékének lekérését. A beviteli paraméter a dátum.
- IDŐSZAK KEZDETE és IDŐSZAK VÉGE dátumokkal való munka során használják. Az időszak típusa (NAP, HÓNAP, ÉV stb.) kiegészítő paraméterként van feltüntetve.
- ADDKDATE lehetővé teszi egy bizonyos típusú meghatározott időpont hozzáadását vagy kivonását egy dátumból (MÁSODPERC, PERC, NAP stb.).
- KÜLÖNBSÉG meghatározza két dátum közötti különbséget, jelezve a kimeneti érték típusát (NAP, ÉV, HÓNAP stb.).
- NULLA lecseréli a hiányzó értéket a megadott kifejezésre.
- KÉPVISELÉS és KÉPVISELŐLINKEK megkapja a megadott mező karakterlánc-ábrázolását. Alkalmazzon bármilyen értékre és csak referenciaértékre.
- TÍPUS, TÍPUS ÉRTÉKEK a bemeneti paraméter típusának meghatározására szolgálnak.
- LINK egy logikai összehasonlító operátor az attribútum érték típusához.
- EXPRESSZérték konvertálására szolgál a kívánt típusra.
- DÁTUM IDŐ„Dátum” típusú értéket kap numerikus értékekből (év, hónap, nap, óra, perc, másodperc).
- JELENTÉS az 1C kérésben előre meghatározott értékek jelzésére szolgál - könyvtárak, felsorolások, a jellemzők típusaira vonatkozó tervek. Használati példa: " Ahol jogi személy = érték (felsorolás. Jogi személy. Magánszemély)«.
Lekérdezéskészítő
Az 1C segítségével lekérdezések létrehozásához van egy nagyon kényelmes beépített mechanizmus - a lekérdezéstervező. A következő fő lapokat tartalmazza:
- „Táblázatok és mezők” – tartalmazza a kiválasztandó mezőket és azok forrásait.
- „Kapcsolatok” – a CONNECTION struktúra feltételeit írja le.
- „Csoportosítás” – a csoportosítási struktúrák leírását és az ezek alapján összegzett mezőket tartalmazza.
- „Feltételek” - felelős a kérelemben szereplő adatok kiválasztásáért.
- „Speciális” – további lekérdezési paraméterek, például kulcsszavak a „SELECT” parancshoz stb.
- „Joins/Aliases” – a táblák összekapcsolásának lehetőségei meg vannak jelölve és az álnevek megadva (a „HOGYAN” konstrukció).
- A „Rendelés” felelős a lekérdezések eredményének rendezéséért.
- „Összesen” – hasonló a „Csoportosítás” laphoz, de a „TOTALS” konstrukcióhoz használatos.
Maga a kérelem szövege a bal alsó sarokban található „Kérés” gombra kattintva tekinthető meg. Ebben a formában manuálisan javítható vagy másolható.
Konzol kérése
Egy lekérdezés eredményének Vállalati módban gyors megtekintéséhez vagy az összetett lekérdezések hibakereséséhez használja a . Tartalmazza a kérés szövegét, beállítja a paramétereket és megjeleníti az eredményt.
A lekérdezési konzolt letöltheti az ITS lemezről, vagy a webhelyről.