Korzystanie z dyrektywy „Dozwolone”. Notatnik programisty Wybierz dozwolony w żądaniu 1c
Zapytanie to potężne narzędzie, które służy do szybkiego (w porównaniu do wszystkich innych metod) uzyskiwania i przetwarzania danych zawartych w różnych obiektach bazy informacji 1C.
Utwórz prośbę
Żądanie tworzone jest jako oddzielny obiekt posiadający wymagany atrybut Tekst, gdzie faktycznie znajduje się samo żądanie. Dodatkowo do żądania można przekazać różne parametry niezbędne do jego wykonania. Po uzupełnieniu tekstu i parametrów żądania należy wykonać żądanie, a wynik wykonania umieścić w selekcji lub tabeli wartości. Wszystko wygląda mniej więcej tak:
//Utwórz żądanie
Żądanie = nowe żądanie;
//Wpisz tekst żądania
Wniosek. Tekst= „Tutaj piszemy tekst wniosku”;
//Przekaż parametry do żądania
Wniosek. SetParameter("NazwaParametru", WartośćParametru) ;
//Wykonaj żądanie
Wynik = zapytanie. Uruchomić() ;
//Prześlij wynik zapytania do zaznaczenia
Próbka = wynik. Wybierać() ;
//Prześlij wynik zapytania do tabeli wartości
Tabela = Wynik. Rozładuj() ;
//Ostatnie akcje można łączyć
Pobierz = Zapytanie. Uruchomić() . Wybierać() ;
//Lub
Tabela = Zapytanie. Uruchomić() . Rozładuj() ;
Podstawy języka zapytań 1C
Najprostsze i najczęściej używane zapytania służą do uzyskania danych z jakiegoś źródła. Źródłem mogą być niemal wszystkie obiekty zawierające dowolne dane: katalogi, dokumenty, rejestry, stałe, wyliczenia, plany typów cech itp.
Z tych obiektów za pomocą zapytania można uzyskać wartości szczegółów, części tabeli, szczegóły części tabeli, zmiany, zasoby itp.
Aby uzyskać tekst żądania, często wygodnie jest go użyć Konstruktor żądania. Jest wywoływany po kliknięciu prawym przyciskiem myszy w dowolnym miejscu modułu programu.
Na przykład, jeśli chcesz uzyskać wartości wszystkich szczegółów katalogu Kontrahenci, wówczas żądanie będzie wyglądać następująco:
Wniosek. Tekst = "WYBIERAĆ
| *
|OD
| Katalog. Kontrahenci”;
Jeśli chcesz uzyskać tylko indywidualne dane, wykonaj następujące czynności:
Wniosek. Tekst = "WYBIERAĆ
| Kod,
| Nazwa,
| Rodzic
|OD
| Katalog. Kontrahenci”;
Aby otrzymać taką prośbę, wyślij wiadomość w formacie Konstruktor zapytań należy zaznaczyć odpowiednie pola na zakładce Tabele i pola.
Do wybranych w zapytaniu elementów i źródeł możesz przypisać aliasy i wykorzystać je później zarówno w samym zapytaniu, jak i podczas pracy z wynikiem. Dodatkowo żądanie może zawierać pola z predefiniowaną konkretną wartością lub z wartością wyliczoną:
Wniosek. Tekst = "WYBIERAĆ
| Klienci.Kod AS Numer,
| Pole 1000 AS z wartością
|OD
;
Pobierz = Zapytanie. Uruchomić() . Wybierać() ;
Żegnaj Wyborze. Następna () pętla
Numer Klienta = Próbka. Numer;
NazwaKlienta = Wybór. Nazwa;
Wartość = próbka. PoleZWartością;
Koniec cyklu ;
Użyj tej zakładki, aby ustawić aliasy Związki/aliasy V Konstruktor zapytań.
Na zakładce ręcznie tworzone jest pole z wartością stałą lub wyliczoną Tabele i pola, w kolumnie Pola.
Wszystkie wybrane elementy można ułożyć w kolejności do przodu lub do tyłu. Możesz wybrać jedno lub więcej pól do zamówienia. Oprócz aranżacji czasami pomocne może być wybranie tylko jednego lub kilku pierwszych elementów.
//Uporządkuj klientów według nazwy od A do Z i wybierz pierwszych 10
Wniosek. Tekst = „WYBIERZ PIERWSZE 10
| Klienci.Kod AS Numer,
| Klienci.Nazwa AS Nazwa,
| Pole 1000 AS z wartością
|OD
| ZAMÓW PRZEZ
| Nazwa";
//Wybierz najnowszego klienta alfabetycznego
Wniosek. Tekst = „WYBIERZ TOP 1
| Klienci.Kod AS Numer,
| Klienci.Nazwa AS Nazwa,
| Pole 1000 AS z wartością
|OD
| Katalog Kontrahenci AS Klienci
| ZAMÓW PRZEZ
| Nazwa ODRZUCENIE”;
Możesz ograniczyć wybór elementów do tych, do których użytkownik ma uprawnienia dostępu. Lub usuń zduplikowane linie z wyniku zapytania.
//Próbkowanie danych udostępnionych użytkownikowi
Wniosek. Tekst = „WYBIERZ DOZWOLONE
| Klienci.Kod AS Numer,
| Klienci.Nazwa AS Nazwa,
| Pole 1000 AS z wartością
|OD
| Katalog. Kontrahenci AS Klienci”;
//Wybór niepowtarzających się elementów
Wniosek. Tekst = „WYBIERZ RÓŻNE
| Klienci.Kod AS Numer,
| Klienci.Nazwa AS Nazwa,
| Pole 1000 AS z wartością
|OD
| Katalog. Kontrahenci AS Klienci”;
Kolejność ustalana jest na zakładce Zamówienie V Konstruktor zapytań na zakładce znajduje się liczba wybranych elementów, parametry rozdzielczości i powtarzalności Dodatkowo.
Ciąg dalszy nastąpi…
W tym artykule chcemy omówić z Tobą wszystko Funkcje języka zapytań 1C, I konstrukcje języka zapytań. Jaka jest różnica między funkcją a designem? Funkcja jest wywoływana z nawiasami i możliwymi parametrami, a konstrukcja jest zapisywana bez nawiasów. Niewątpliwie wszystkie struktury i funkcje języka zapytań 1C sprawiają, że proces pozyskiwania danych jest elastyczny i wielofunkcyjny. Te funkcje i konstrukcje mają zastosowanie do pól żądań, a niektóre także do warunków.
Funkcje języka zapytań 1C
Bo jasny opis Funkcje języka zapytań 1C jest znacznie mniej powszechne niż opisy struktur, postanowiliśmy zacząć przyglądać się funkcjom. Przyjrzyjmy się teraz każdemu z osobna, opisując jego przeznaczenie, składnię i przykład użycia, a więc:
1. Funkcjonować DATA CZAS- funkcja tworzy stałe pole typu "Data".
Składnia: DATA CZAS(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
Przykład użycia:
2. Funkcja RÓŻNICA DATY- zwraca różnicę pomiędzy dwiema datami w jednym z wymiarów (rok, miesiąc, dzień, godzina, minuta, sekunda). Pomiar przekazywany jest jako parametr.
Składnia: RÓŻNICA DATA(<Дата1>, <Дата2>, <Тип>)
Przykład użycia:
Query.Text = "WYBIERZ | RÓŻNICA DATA(DATACZAS(2015, 4, 17), DATACZAS(2015, 2, 1), DZIEŃ) | JAKO Ilość dni";
3. Funkcja WARTOŚĆ- ustawia stałe pole z predefiniowanym rekordem z bazy danych, można też otrzymać pusty link dowolnego typu.
Składnia: WARTOŚĆ(<Имя>)
Przykład użycia:
Request.Text = "WYBIERZ //predefiniowany element | WARTOŚĆ(Katalog.Waluty.Dolar) Dolar AS, //pusty link | WARTOŚĆ(Dokument.Odbiór towarów i usług.EmptyLink) AS Paragon, //wartość przelewu | WARTOŚĆ(Przelew . Osoba prawna. Osoba fizyczna) AS Indywidualna, //konto predefiniowane | WARTOŚĆ(Plan kont. Samonośne. Materiały) AS Konto_10" ;
4. WYBIERZ funkcję- mamy przed sobą analogię konstrukcji IF, która jest używana w kodzie, tylko ta jest używana w zapytaniach 1C.
Składnia: WYBÓR KIEDY<Выражение>NASTĘPNIE<Выражение>W PRZECIWNYM RAZIE<Выражение>KONIEC
Przykład użycia:
Request.Text = //jeśli kwota jest większa niż 7500, to powinien obowiązywać rabat w wysokości 300 rubli, //więc jeśli warunek zostanie spełniony, to funkcja //zwróci Kwotę - 300 //w przeciwnym razie żądanie zwróci po prostu Kwotę "WYBIERZ | WYBIERZ | KIEDY TCReceipts.Kwota > 7500 | WTEDY TCReceipts.Amount - 300 | ELSE TCReceipts.Amount | END JAK KwotaZ Rabatem |FROM | Dokument.Odbiór TowarówUsługi.Towary JAKO TCReceipts";
5. Funkcja EKSPRES- pozwala wyrazić pole stałe określonego typu.
Składnia: EXPRESS (nazwa pola jako nazwa typu)
Przykład użycia:
Query.Text = "WYBIERZ RÓŻNE | Numer.sprzedaży.Rejestratora, | WYBIERZ | KIEDY Rejestr.Sprzedaż LINK Dokument.Wydatek | WTEDY WYRAŻONY(Dokument.Sprzedaż.Registrar AS.Wydatek) | ELSE WYBIERZ | KIEDY Sprzedawca.Registrar LINK Dokument.Implementacja | THEN EXPRESS(Dokument sprzedaży.Rejestrator AS.Wdrożenie) | END | ... | END AS Numer | OD | ZarejestrujAkumulacje.Zakupy AS Zakupy";
Inną możliwością jest użycie w polach funkcji EXPRESS typy mieszane gdzie je można znaleźć? Najprostszym przykładem jest „Rejestrator” dla dowolnego rejestru. Dlaczego więc możemy potrzebować zakwalifikować typ w rejestratorze? Rozważmy sytuację, gdy wybierzemy od rejestratora pole „Numer”, z której tabeli zostanie wybrany numer? Prawidłowa odpowiedź ze wszystkich! Dlatego, aby nasze zapytanie działało szybko, powinniśmy określić typ jawny za pomocą funkcji EXPRESS
Przykład użycia:
Query.Text = "SELECT | EXPRESS(Nomenklatura.Komentarz AS Line(300)) AS Komentarz, | EXPRESS(Nomenklatura.Suma AS Number(15,2)) AS Suma |FROM | Katalog.Nomenklatura AS Nomenklatura";
6. Funkcja ISNULL(alternatywna pisownia ISNULL) - jeżeli pole jest typu NULL to zostaje ono zastąpione drugim parametrem funkcji.
Składnia: ISNULL(<Поле>, <ПодставляемоеЗначение>)
Przykład użycia:
Należy również pamiętać, że wskazane jest ZAWSZE zastępowanie typu NULL jakąś wartością, ponieważ porównanie z typem NULL zawsze zwraca FALSE, nawet jeśli porównasz NULL z NULL. Najczęściej wartości NULL powstają w wyniku łączenia tabel (wszystkie typy złączeń z wyjątkiem złączeń wewnętrznych).
Query.Text = //Wybierz całą pozycję i jej salda //jeśli w jakiejś pozycji nie ma salda, pojawi się pole //NULL, które zostanie zastąpione wartością 0 "SELECT | Nr Link, | ISNULL (ProductsInStockRemains.InStockRemaining, 0) AS Pozostała | Z | Katalog.Nomenklatura AS Nr | LEWE POŁĄCZENIE Zarejestruj akumulacje. GoodsInWarehouses. Pozostało AS GoodsInWarehousesRemains | ON (GoodsInWarehousesRemains. Nomenklatura = No. Link)";
7. Funkcja REPREZENTACJA- pozwala uzyskać reprezentację pola żądania.
Składnia: WYDAJNOŚĆ(<НаименованиеПоля>)
Przykład użycia:
Query.Text = "SELECT | REPRESENTATION(FreeRemainingRemains.Nomenclature) AS Nomenklatura, | REPRESENTATION(FreeRemainingRemaining.Warehouse) AS Warehouse, | FreeRemainingRemaining.InStockRemaining |FROM |Akumulacja Register.FreeRemaining.Remaining AS FreeRemainingRemaining";
Konstruuje w języku zapytań 1C
Rozmawialiśmy z Tobą powyżej Funkcje języka zapytań 1C, teraz czas się zastanowić konstrukcje w języku zapytań 1C, są nie mniej ważne i przydatne, zaczynajmy.
1. LINK budowlany- jest operatorem logicznym służącym do sprawdzania typu referencyjnego. Najczęściej spotykane podczas sprawdzania pola typu złożonego względem określonego typu. Składnia: POŁĄCZYĆ<Имя таблицы>
Przykład użycia:
Request.Text = //jeśli typem wartości rejestratora jest dokument Paragon, //wtedy zapytanie zwróci „Odbiór towaru”, w przeciwnym razie „Sprzedaż towaru” „WYBIERZ | WYBIERZ | KIEDY Remainings.Registrar LINK Dokument.Odbiór towaru i Usługi | WTEDY ""Odbiór"" | W przeciwnym razie ""Konsumpcja" | END AS Rodzaj ruchu | OD | Rejestr akumulacji. Pozostałe produkty w magazynach JAKO Pozostałości" ;
2. Projekt MIĘDZY- operator ten sprawdza, czy wartość mieści się w podanym zakresie.
Składnia: MIĘDZY<Выражение>I<Выражение>
Przykład użycia:
Request.Text = //pobierz całą nomenklaturę, której kod mieści się w zakresie od 1 do 100 "SELECT | Nomenclature.Link |FROM | Directory.Nomenclature AS Nomenklatura |WHERE | Nomenklatura.Code BETWEEN 1 AND 100" ;
3. HIERARCHIA konstrukcji B i B- sprawdź, czy wartość znajduje się na przesyłanej liście (tablice, tabele wartości itp. można przesyłać w formie listy). Operator IN HIERARCHY umożliwia podgląd hierarchii (przykład wykorzystania Planu kont).
Składnia: W(<СписокЗначений>), W HIERARCHII (<СписокЗначений>)
Przykład użycia:
Request.Text = //wybierz wszystkie subkonta konta "WYBIERZ | Samonośne. Połącz konto AS | Z | Plan kont. Samonośne AS Samonośne | GDZIE | Samonośne. Link W WARTOŚCI HIERARCHII (Schemat kont Konta. Samonośne. Towary)";
4. Projekt PODOBNY- Ta funkcja pozwala nam porównać ciąg znaków ze wzorcem ciągu.
Składnia: TAK JAK "<ТекстШаблона>"
Opcje wzoru wiersza:
% - ciąg zawierający dowolną liczbę dowolnych znaków.
Jeden dowolny znak.
[...] - dowolny pojedynczy znak lub ciąg znaków umieszczony w nawiasach kwadratowych. Wyliczenie może określać zakresy, na przykład a-z, co oznacza dowolny znak zawarty w zakresie, łącznie z końcami zakresu.
[^...] - dowolny pojedynczy znak lub ciąg znaków umieszczony w nawiasach kwadratowych, z wyjątkiem tych wymienionych po znaku negacji.
Przykład użycia:
Query.Text = //znajdź całą nomenklaturę zawierającą rdzeń TABUR i rozpoczynającą się //małą lub dużą literą t "WYBIERZ | Nomenklatura. Link | Z | Katalog. Nomenklatura AS Nomenklatura | GDZIE | Produkty. Nazwa LIKE "" [Tt ]abur%""" ;
5. Projekt DOZWOLONY- operator ten pozwala na wybranie z bazy danych tylko tych rekordów, do których osoba wywołująca ma uprawnienia do odczytu. Uprawnienia te konfiguruje się na poziomie rekordu (RLS).
Składnia: ALLOWED jest zapisywany po słowie kluczowym SELECT
Przykład użycia:
Request.Text = "WYBIERZ DOZWOLONE | Kontrahenci. Link | Z | Katalog. Kontrahenci JAKO Kontrahenci";
6. Projektowanie RÓŻNE- umożliwia wybranie rekordów, w których nie ma duplikatów rekordów.
Składnia: VARIOUS jest zapisywane po słowie kluczowym SELECT
Przykład użycia:
Request.Text = //wybiera rekordy, do których czytelnik ma uprawnienia "WYBIERZ RÓŻNE | Kontrahenci.Nazwa |FROM | Katalog. Kontrahenci JAKO Kontrahenci" ;
Ponadto konstrukcji RÓŻNE można używać z operatorem DOZWOLONYM i innymi operatorami.
Przykład użycia:
Request.Text = //wybiera różne rekordy, do których czytelnik ma uprawnienia "WYBIERZ DOZWOLONE RÓŻNE | Kontrahenci.Nazwa |FROM | Katalog. Kontrahenci JAKO Kontrahenci";
7. Najpierw zaprojektuj- wybiera z wyniku zapytania liczbę rekordów określoną w parametrze.
Składnia: PIERWSZY<число>
Przykład użycia:
Request.Text = //wybierz pierwsze 4 numery CCD z katalogu "WYBIERZ PIERWSZE 4 | Numery CCD. Link | Z | Katalog. Numery CCD JAKO Numery CCD";
8. Projekt DLA ZMIANY- pozwala na zablokowanie stołu, działa tylko w transakcjach (dotyczy tylko zamków automatycznych).
Składnia: DLA ZMIANY<НаименованиеТаблицы>
Przykład użycia:
Query.Text = "WYBIERZ | Wolne pozostałości Pozostałości. Nomenklatura, | Wolne pozostałości Pozostałości. Magazyn, | Wolne pozostałości Pozostałości. W magazynie Pozostało | Z | Rejestr nagromadzeń. Wolne pozostałości. Pozostałości AS Wolne pozostałości Pozostałości | DO ZMIANY | Rejestr nagromadzeń . Wolne pozostałości. Pozostałości”;
9. Projekt ZAMÓW PRZEZ- porządkuje dane według określonego pola. Jeżeli pole jest linkiem to przy ustawianiu flagi AUTOMATYCZNE ZAMÓWIENIE Sortowanie będzie odbywać się według reprezentacji łącza; jeśli flaga jest wyłączona, łącza są sortowane według starszeństwa adresu łącza w pamięci.
Składnia: SORTUJ WEDŁUG<НаименованиеПоля>AUTOMATYCZNE ZAMÓWIENIE
Przykład użycia:
Query.Text = "WYBIERZ | Wolne pozostałości Pozostałości. Nomenklatura AS Nomenklatura, | Wolne pozostałości pozostałe. Magazyn AS Magazyn, | Wolne pozostałości pozostałe. W magazynie Pozostałe | OD | Zarejestruj nagromadzenia. Wolne pozostałości. Pozostałe jako Wolne pozostałe pozostałości | | ZAMÓW PRZEZ | Nomenklatura | AUTO ZAMÓW VANIE";
10. Projekt GRUPA WG- służy do grupowania ciągów zapytań według określonych pól. Z każdą funkcją agregującą należy używać pól numerycznych.
Składnia: GRUPUJ WEDŁUG<НаименованиеПоля1>, .... , <НаименованиеПоляN>
Przykład użycia:
Query.Text = "WYBIERZ | ItemsInWarehouses.Nomenklatura AS Nomenklatura, | ItemsInWarehouses.Warehouse, | SUM(ItemsInWarehouses.InStock) JAKO INSTOCK |FROM | RegisterAccumulations.ItemsInWarehouses AS ItemsInWarehouses | |GROUP BY | ItemsInWarehouses.Nomenklatura, | ItemsAtWarehouse a h.Magazyn" ;
11. Projekt MIEĆ- umożliwia zastosowanie funkcji agregującej do warunku wyboru danych, podobnie jak w przypadku konstrukcji WHERE.
Składnia: MAJĄCY<агрегатная функция с условием>
Przykład użycia:
Query.Text = //wybiera zgrupowane rekordy, w których pole InStock jest większe niż 3 "SELECT | ItemsInStocks.Nomenclature AS Nomenklatura, | ItemsInWarehouses.Warehouse, | SUM(ItemsInStocks.InStock) AS INSTOCK |FROM | RegisterAccumulations.ItemsInStocks AS ItemsInStocks | | GRUPUJ WEDŁUG | ProductsInWarehouses.Nomenklatura, | ProductsInWarehouses.Warehouse | |DOSTĘPNE | KWOTA(ProductsInWarehouses.InStock) > 3" ;
12. INDEKS Budowlany WG- służy do indeksowania pola zapytania. Wykonanie zapytania z indeksowaniem trwa dłużej, ale przyspiesza przeszukiwanie zaindeksowanych pól. Można go używać tylko w tabelach wirtualnych.
Składnia: INDEKS WG<Поле1, ... , ПолеN>
Przykład użycia:
Query.Text = "WYBIERZ | Ts.NameOS, | Ts.FolderNumber, | Ts.CodeOS, | Ts.Term, | Ts.Type | PLACE DataTs | FROM | &Ts AS Ts | | INDEX BY | Ts.NameOS, | Ts .KodeksOS";
13. Projekt GDZIE- umożliwia nałożenie warunku na dowolne pola wyboru. W rezultacie zostaną uwzględnione tylko rekordy spełniające warunek.
Składnia: GDZIE<Условие1 ОператорЛогСоединения УсловиеN>
Przykład użycia:
Query.Text = //wybrano wszystkie rekordy z CompensationRemaining<>0 i //AmountForCalcCompRemaining > 100 "SELECT | CompensationRPORemains.Counterparty, |CompensationRPORemains.Child, | CompensationRPORemains.CompensationRemaining, | CompensationRPORemains.AmountForCalcCompRemains |Place DataTz |FROM | Rejestr akumulacji.CompensationRP.Remains AS CompensationRPRemains | WHERE |WynagrodzenieRPORemaining.WynagrodzeniePozostałe<>0 | I CompensationRPORemains.AmountForCalcCompRemaining> 100" ;
14. WYNIKI PROJEKTOWANIA... OGÓLNE- służy do obliczania sum; projekt określa pola, według których sumy będą obliczane oraz funkcje agregujące stosowane do pól sumy. W przypadku stosowania sum dla każdego pola po konstrukcji TOTAL dane są grupowane. Istnieje opcjonalna konstrukcja OGÓLNA, której użycie zapewnia również dodatkowe grupowanie. Poniżej zobaczysz przykładowy wynik żądania.
Składnia: WYNIKI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>PRZEZ<ОБЩИЕ> <Поле1, ... , ПолеN>
Przykład użycia:
Request.Text = "WYBIERZ | Obliczenia. Umowa z kontrahentem. Rodzaj umowy AS Rodzaj kontraktu, | Obliczenia. Umowa z kontrahentem Kontrakt AS, | Obliczenia. Kontrahent, | Obliczenia. Kwota salda rozliczeń wzajemnych Saldo AS | OD | Rejestr akumulacji. Wzajemne Rozliczenie z kontrahentami Salda AS Obliczenia | OGÓŁEM | KWOTA (Saldo) | Oprogramowanie | OGÓLNE, | Rodzaj umowy";
Na rysunku przedstawiono zgrupowania, które powstały w trakcie realizacji żądania, górne odnosi się do sekcji OGÓLNE, a drugie do pola Typ umowy z kontrahentem.
Obiekt konfiguracyjny „role” nadaje zestaw praw do operacji (akcji) na obiektach konfiguracyjnych.
Rola „Pełne prawa”.
Jest to po prostu rola (niepredefiniowana), w której sprawdzane są wszystkie typy uprawnień do wszystkich obiektów konfiguracyjnych.
Tym, co odróżnia ją od innych ról, jest obecność uprawnienia „Administracja”.
Jeżeli zostanie utworzony przynajmniej jeden użytkownik, system zaczyna sprawdzać obecność uprawnienia „Administracja” – przynajmniej jeden użytkownik musi je posiadać.
Ograniczenia dostępu na poziomie rekordu
Row Level Security (RLS) – ograniczenie na poziomie rekordu.
Mechanizm ograniczeń dostępu do danych pozwala zarządzać prawami dostępu nie tylko na poziomie obiektów metadanych, ale także na poziomie obiektów bazy danych. Do ograniczenia dostępu do danych można wykorzystać następujące obiekty:
- role,
- parametry sesji,
- opcje funkcjonalne,
- uprzywilejowane moduły współdzielone,
- słowo kluczowe ALLOWED w języku zapytań.
Mechanizm ma za zadanie ograniczać dostęp do rekordów tabeli obiektów metadanych w oparciu o dowolne warunki nałożone na wartości pól wierszowych tych tabel. Na przykład, aby zobaczyć rekordy tylko dla „swoich” kontrahentów, organizacji itp.
Techniczne wdrożenie ograniczeń dostępu w 1C
1C generuje żądanie do DBMS. Klaster serwerów dodaje do żądania sekcję WHERE, która zawiera tekst warunku ograniczenia dostępu przez RLS, następnie żądanie to jest wysyłane do systemu DBMS, wyodrębnione dane zwracane są do klienta 1C.
Mechanizm ten zadziała w przypadku każdego żądania od klienta:
- w raportach,
- na listach dynamicznych i w zwykłych formularzach list
- w niestandardowych zapytaniach.
Taka implementacja mechanizmu znacząco wpływa na wydajność.
Sposoby ominięcia ograniczeń dostępu.
W przypadku dużych operacji wymagających dużej ilości zasobów (na przykład przetwarzanie ponownego wysyłania dokumentów) część kodu można przenieść do uprzywilejowanych modułów.
A) Uprzywilejowany moduł to powszechny moduł z flagą „Uprzywilejowany” we właściwościach.
Jego osobliwością jest to, że zawarty w nim kod jest wykonywany bez żadnej kontroli praw dostępu, w tym RLS.
B) Również uprzywilejowany tryb można włączyć dla modułów obiektów dokumentu. Odbywa się to we właściwościach dokumentu, flaga
- Uprzywilejowane traktowanie podczas dyrygowania
- Tryb uprzywilejowany przy anulowaniu transakcji
B) Metoda Ustaw tryb uprzywilejowany()
Polecenie systemowe pozwala na uprzywilejowanie części kodu dowolnego modułu.
Od następnej linijki kodu będzie działać uprzywilejowany tryb wykonywania.
Będzie działać do momentu pojawienia się linii wyłączającej ten tryb lub do zakończenia procedury/funkcji
(PRAWDA);
// dowolny kod tutaj zostanie wykonany bez kontroli praw i RLS
Ustaw tryb uprzywilejowany(Kłamstwo ); // lub koniec procedury/funkcji
Liczba włączeń trybu uprzywilejowanego musi odpowiadać liczbie jego wyłączeń. Jeśli jednak w ramach procedury lub funkcji został włączony tryb uprzywilejowany (raz lub więcej), ale nie został wyłączony, to system automatycznie wyłączy się tyle razy, ile razy w procedurze lub funkcji pozostały niepełne włączenia
Jeśli w procedurze lub funkcji wywołuje metodę Ustaw tryb uprzywilejowany(False) wykonało więcej niż wywołania metod Ustaw tryb uprzywilejowany(True ), wówczas zostanie zgłoszony wyjątek
Funkcjonować Tryb uprzywilejowany() zwraca True, jeśli tryb uprzywilejowany jest nadal włączony, i False, jeśli jest całkowicie wyłączony. Nie analizuje to liczby ustawień trybu uprzywilejowanego w konkretnej funkcji.
Wszystkie wywoływane procedury i funkcje będą również wykonywane w trybie uprzywilejowanym.
Możliwe jest także rozpoczęcie sesji uprzywilejowanej. Jest to sesja, w której od samego początku działania systemu ustanawiany jest tryb uprzywilejowany. Ponadto podczas pracy metoda Tryb uprzywilejowany() zawsze zwróci True, a możliwość wyłączenia trybu uprzywilejowanego nie jest obsługiwana. Sesję uprzywilejowaną może rozpocząć jedynie użytkownik posiadający uprawnienia administracyjne (prawo Administracja). Sesję można rozpocząć za pomocą przełącznika wiersza poleceń uruchamiania aplikacji klienckiej UsePrivilegedMode lub parametru ciągu połączenia infobase prmod .
Naturalnie pojawia się pytanie: po co w ogóle ustawiać ograniczenia dostępu, skoro można je tak łatwo ominąć?
Tryb bezpieczeństwa.
Tak, możesz zapisać przetwarzanie zewnętrzne w uprzywilejowanym trybie wykonywania i zwolnić/uszkodzić dane. Aby temu zapobiec, system posiada metodę kontekstu globalnego
Ustaw tryb awaryjny().
Tryb awaryjny ignoruje między innymi tryb uprzywilejowany.
Należy go zainstalować przed programowym wywoływaniem zewnętrznych procesorów lub eksportowaniem procedur i funkcji z ich modułów.
Podczas wykonywania zabronionych operacji w czasie wykonywania zgłaszany jest wyjątek.
Dodatkowo na poziomie ustawień roli można wyłączyć możliwość interaktywnego uruchamiania przez użytkowników zewnętrznych raportów i przetwarzania.
Konfigurowanie ograniczeń dostępu
RLS można skonfigurować tylko dla uprawnień:
- przeczytaj (wybierz)
- dodanie (wstaw)
- zmienić (aktualizować)
- usuwać
Do operacji odczytu i usunięcia, obiekt znajdujący się w bazie danych musi spełniać ograniczenia dostępu do danych.
Dla operacji dodawania Ograniczenie dostępu do danych musi odpowiadać obiektowi, który ma zostać zapisany w bazie danych.
Do operacji zmiany ograniczenie dostępu do danych musi być zgodne z obiektem zarówno przed zmianą (aby obiekt został odczytany), jak i po zmianie (aby obiekt został zapisany).
W przypadku pozostałych praw nie ma takiej możliwości.
Dodajmy nowe ograniczenie dla prawa „odczytu” katalogu „Nomenklatura”. Otworzy się lista pól, dla których możesz skonfigurować dodane ograniczenie.
Oznacza to, że jeśli spróbujesz uzyskać dostęp do zaznaczonych pól, ograniczenie zostanie uruchomione, ale jeśli spróbujesz uzyskać dostęp do niezaznaczonych pól, ograniczenie nie zadziała.
Jeśli wybierzesz flagę „ Inne pola", ograniczenie zostanie skonfigurowane dla wszystkich pól tabeli, z wyjątkiem pól, dla których jawnie ustawiono ograniczenia.
*Funkcja: prawa do dodawania, zmiany, usuwania:
- Ograniczenie można skonfigurować tylko dla wszystkich pól.
- Ograniczenie może być tylko jedno.
Dla prawa „Odczyt” możesz skonfigurować kilka warunków, które zostaną połączone operatorem logicznym „AND”.
Nie wszystkie pola głównego obiektu danych ograniczenia mogą być użyte w ograniczeniach dla następujących typów obiektów bazy danych:
- w rejestrach akumulacji ograniczenia dostępu mogą zawierać wyłącznie pomiary głównego przedmiotu ograniczenia;
- w rejestrach księgowych ograniczenia mogą wykorzystywać wyłącznie pomiary bilansowe głównego przedmiotu ograniczenia
Jeżeli w warunkach ograniczonego dostępu do danych obiegowego rejestru akumulacji stosowane są pomiary nie wliczane do sum, to przy dostępie do wirtualnej tabeli obrotów nie wykorzystuje się zapisanych sum i żądanie realizowane jest całkowicie według stół ruchowy.
Mechanizm nakładania ograniczeń dostępu.
Każda operacja na danych przechowywanych w bazie danych w 1C:Enterprise ostatecznie prowadzi do wywołania bazy danych z prośbą o odczytanie lub zmianę danych. Podczas wykonywania zapytań do bazy danych mechanizmy wewnętrzne 1C:Enterprise wdraża ograniczenia dostępu. W której:
- Generowana jest lista uprawnień(czytaj, dodawaj, modyfikuj, usuwaj), listę tabel bazy danych i listę pól używanych przez to zapytanie.
- Ze wszystkich ról bieżącego użytkownika wybrane zostały ograniczenia dostępu do danych w zakresie wszystkich praw, tabel i pól objętych żądaniem. Co więcej, jeśli rola nie zawiera ograniczeń w dostępie do danych tabeli lub pola, oznacza to, że w tej tabeli dostępne są wartości wymaganych pól z dowolnego rekordu. Innymi słowy, brak ograniczenia dostępu do danych oznacza obecność ograniczenia GDZIE JEST Prawda.
- Pobiera aktualne wartości wszystkich parametrów sesji i opcji funkcjonalnych uczestniczenia w wybranych ograniczeniach.
Aby uzyskać wartość parametru sesji lub opcji funkcji, bieżący użytkownik nie musi mieć uprawnień do uzyskania tej wartości. Jeżeli jednak nie została ustawiona wartość jakiegoś parametru sesji, pojawi się błąd i zapytanie do bazy danych nie zostanie wykonane.
Ograniczenia pochodzące z jednej roli są łączone za pomocą operacji AND.
Ograniczenia pochodzące z różnych ról są łączone za pomocą operacji OR.
Skonstruowane warunki są dodawane do zapytań SQL, za pomocą których 1C: Enterprise uzyskuje dostęp do systemu DBMS. Podczas dostępu do danych z warunków ograniczeń dostępu nie jest przeprowadzana kontrola uprawnień (ani dla obiektów metadanych, ani dla obiektów bazy danych). Ponadto mechanizm dodawania warunków zależny jest od wybranego sposobu działania ograniczeń „wszystkie” lub „dozwolone”.
*Cecha: Jeżeli użytkownik ma dostęp do kilku ról ze skonfigurowanymi ograniczeniami na poziomie rekordu dla jednego obiektu, to w tym przypadku warunki ograniczeń dodawane są za pomocą operacji logicznej „OR”. Innymi słowy, uprawnienia użytkownika kumulują się.
Prowadzi to do następującego wniosku: nie pozwól, aby warunki ograniczania dostępu do jednego obiektu w różnych rolach krzyżowały się, ponieważ w tym przypadku tekst żądania będzie znacznie skomplikowany, co wpłynie na wydajność.
Metoda „wszystko”.
W przypadku nałożenia ograniczeń metodą „all” do zapytań SQL dodawane są warunki i pola, dzięki czemu 1C:Enterprise może uzyskać informację, czy podczas wykonywania zapytania do bazy danych zostały wykorzystane dane, które były zabronione dla danego użytkownika, czy też nie. Jeśli użyto zabronionych danych, żądanie ulegnie awarii z powodu naruszenia zasad dostępu.
Nakładanie ograniczeń dostępu metodą „wszystkich” schematycznie przedstawiono na rysunku:
Metoda „dozwolona”.
Podczas stosowania ograniczeń metodą „dozwoloną” do zapytań SQL dodawane są warunki, dzięki czemu rekordy zabronione dla bieżącego użytkownika nie wpływają na wynik zapytania. Innymi słowy, w przypadku nałożenia ograniczeń w trybie „dozwolonym”, rekordy zabronione dla danego użytkownika uznawane są za brakujące i nie wpływają na wynik operacji, co schematycznie przedstawiono na rysunku:
Ograniczenia dostępu do danych są nakładane na obiekty bazy danych w momencie, gdy 1C:Enterprise uzyskuje dostęp do bazy danych.
W wersji klient-serwer 1C:Enterprise ograniczenia są stosowane na serwerze 1C:Enterprise.
Opcja ta (ALLOWED) nie będzie jednak działać, jeśli w zapytaniu odwołujemy się do tabeli, dla której nie skonfigurowano ograniczeń dostępu, ale która zawiera odniesienia do wierszy tabeli ze skonfigurowanymi ograniczeniami. W takim przypadku w wyniku zapytania wyświetli się „<Объект не найден>........." zamiast wartości pola referencyjnego.
Jeśli tworzysz raport lub przetwarzasz przy użyciu standardowych lub niestandardowych zapytań konfiguracyjnych, zawsze zaznacz flagę „Dozwolone”. aby raport zadziałał pod dowolnym użytkownikiem z dowolnym zestawem praw.
W przypadku obiektowego odczytu danych z bazy danych nie ma możliwości ustawienia flagi „Dozwolone”. Dlatego jest to konieczne skonfiguruj wybory do odczytu obiektów, biorąc pod uwagę możliwe ograniczenia praw dostępu dla użytkownika. W technice obiektowej nie ma możliwości uzyskania wyłącznie danych dozwolonych.
Ważne jest, aby jeśli w zapytaniu nie określono słowa kluczowego ALLOWED, wszystkie wybory określone w tym zapytaniu nie mogły kolidować z żadnymi ograniczeniami odczytu nałożonymi na obiekty bazy danych użyte w zapytaniu. Co więcej, jeśli zapytanie korzysta z tabel wirtualnych, odpowiednie selekcje należy zastosować do samych tabel wirtualnych.
Praktyka 1. Kreator zapytań w ustawieniach RLS.
Skomponujmy tekst sekcji „WHERE” w zapytaniu do katalogu. Możesz użyć konstruktora zapytań.
Projektantka postawiła na minimalistyczny wygląd.
Zakładka „Tabele”.
Tabela główna będzie tabelą obiektu, dla którego konfigurowane jest ograniczenie.
Możesz także wybrać inne tabele i skonfigurować różne połączenia między nimi w zakładce „Relacje”.
Zakładka „Warunki”
Tutaj możesz skonfigurować rzeczywiste warunki ograniczeń dostępu
Dodajmy do atrybutu „Cena” katalogu nomenklatury warunki na prawo „odczytu” do wszystkich pól tabeli.
„Nomenklatura GDZIE Nomenklatura. Cena > 500”
Zobaczmy, jak działa ta prosta zasada. Tabela katalogów zawiera następujące elementy:
Po ustawieniu ograniczenia dostępu w tabeli zostaną pokazane tylko elementy spełniające warunek:
Zniknęły także grupy. Zmieńmy tekst ograniczenia
„Nomenklatura GDZIE Nomenklatura. Cena > 500
LUB Nomenklatura. To jest grupa”
Cóż, teraz tego właśnie potrzebujesz.
Jeżeli w ustawieniach listy usuniesz wyświetlanie pola „kod”, to wyświetlone zostaną wszystkie elementy katalogu, tj. ograniczenie nie zadziałało. Jeśli ustawisz wyświetlanie pola „Kod”, ograniczenie będzie działać.
W tym przypadku pomimo tego, że element katalogu jest widoczny w polu listy, nie można otworzyć jego formularza, ponieważ skonfigurowane jest ograniczenie atrybutu. To samo dzieje się w przypadku dowolnego żądania: przy próbie uzyskania „ograniczonej” właściwości wystąpi błąd dostępu.
Jeśli spróbujesz programowo uzyskać „ograniczone” poświadczenia, zostanie również zgłoszony błąd dostępu.
Co więcej, poprzez link nie będzie można uzyskać dostępu do jakichkolwiek pól obiektu, gdyż po otrzymaniu linku system odczytuje cały obiekt, a jeśli zawiera on „zastrzeżone” szczegóły, obiekt nie zostanie odczytany.
Dlatego pracując programowo z obiektami bazy danych należy mieć na uwadze możliwe ograniczenia na poziomie rekordu i na żądanie pozyskać wszystkie niezbędne dane obiektowe, a następnie umieścić je w strukturze lub wykonać część kodu w uprzywilejowanym module.
Po ustawieniu ograniczenia dostępu zmienił się sposób wyświetlania wiersza na liście uprawnień – stał się szary i pojawiła się ikona.
Ograniczenia podczas konfigurowania dostępu (RLS).
- Nie ma sekcji Podsumowanie;
- Nie można uzyskać dostępu do wirtualnych tabel rejestrowych;
- Nie można jawnie używać parametrów;
- Można go używać w zapytaniach zagnieżdżonych any>/span> narzędzia języka zapytań z wyjątkiem:
- operator W HIERARCHII;
- WYNIKI propozycje;
- zagnieżdżone wyniki zapytania nie może zawierać części tabeli>/span>;
- wirtualne stoły, w szczególności Salda i Obroty
Ćwiczenie 2. Nazewnictwo z aktualną ceną.
Wprowadź ograniczenie dostępu, jeśli chcesz wyświetlić produkty, których aktualna cena jest większa niż określona wartość, na przykład 100.
Rozwiązanie:
Dodajemy nową regułę ograniczenia dostępu do katalogu „Nomenklatura” z prawem „odczyt”.
Wybierz „inne pola”.
W konstruktorze dodajemy zagnieżdżone zapytanie. Wybierz w nim tabelę rejestru informacyjnego „Ceny towarów”.
Nie ma zakładki „zamówienie” – jest to funkcja projektanta zapytań służąca do budowania żądania ograniczenia dostępu.
W zakładce „Zaawansowane” ustaw „pierwsze 999999999”, pojawi się zakładka „zamówienie”.
Kolejność ustalamy według pola „Okres” w kolejności malejącej.
Następnie ustanawiamy połączenie pomiędzy tabelą główną a podzapytaniem poprzez referencję.
Szablony ograniczeń dostępu.
Praktyka 3. Ograniczenie „kontrahentów” według wartości stałej.
Skonfigurujmy ograniczenie dostępu do katalogu Counterparties w oparciu o wartość przechowywaną w stałej.
Dodatkowo w szczegółach należy ustawić ograniczenie dla wszystkich obiektów korzystających z katalogu „Kontrahenci”.
Rozwiązanie
Dla katalogu „Kontrahenci” ustawimy ograniczenie prawa „odczyt” dodając zagnieżdżone zapytanie do stałej w sekcji „Warunki”. Nie zapominaj, że to jest grupa.
Widzimy problem, katalog Kontrahenci jest poprawnie filtrowany i wyświetlają się wszystkie dokumenty z atrybutem „Kontrahent”, niektóre z „zepsutymi” linkami w atrybucie „Kontrahent”.
Teraz musisz skonfigurować ograniczenia dostępu dla wszystkich obiektów korzystających z linku do „Konta”. Znajdźmy je korzystając z usługi „szukaj linków do obiektu”.
Skopiujmy i lekko zmodyfikujmy tekst warunku RLS z katalogu „Kontrahenci”. Należy to zrobić tyle razy, ile znaleziono obiektów.
Lub użyj wzorca ograniczeń dostępu, aby uniknąć problemów z powielaniem kodu.
Szablony ograniczeń dostępu konfiguruje się na poziomie roli i można ich używać dla dowolnego obiektu w ramach edytowanej roli.
Do szablonu możesz dodać dowolny fragment tekstu dotyczącego ograniczeń dostępu. Szablon wywoływany jest za pomocą symbolu „#”. Na przykład #TemplateCounterparty.
Przez # w 1C instrukcje są zapisywane do preprocesora. W kontekście realizacji ustawień ograniczeń dostępu platforma zastępuje tekst wywołania szablonu tekstem szablonu.
Dodajmy tekst po słowie WHERE do szablonu „Szablon kontrahenta”, za wyjątkiem tekstu o EtoGroup.
Parametry w szablonach ograniczeń dostępu.
Kontynuujmy rozwiązywanie problemu 2.
Problem polega na tym, że główna tabela w katalogu nosi nazwę „kontrahent”, w dokumencie „Faktura paragonu”. Pole sprawdzane w katalogu nazywa się „link”, w dokumencie „Kontrahent”.
Zmieńmy nazwę tabeli głównej w tekście szablonu na „#CurrentTable”
„#CurrentTable” jest predefiniowanym parametrem.
I kropką wskazujemy numer parametru wejściowego - „.#Parameter(1)
„#Parametr” jest także wartością predefiniowaną. Może zawierać dowolną liczbę parametrów wejściowych. Są adresowane według numeru seryjnego.
W tekście ograniczeń dostępu do książki telefonicznej wskazujemy, co następuje:
Dla dokumentu:
„Sprzedaż towarów GDZIE #TemplateKontrahent („Kontrahent”)”
Wywołując szablon ograniczeń dostępu, parametry należy przekazać do niego wyłącznie w formie String, czyli w cudzysłowie.
Tabela główna - Nomenklatura
Tekst szablonu to:
#CurrentTable GDZIE #CurrentTable.#Parametr(1) = #Parametr(2)
Tekst szablonu zawiera część tekstu w języku ograniczeń dostępu do danych i może zawierać parametry wyróżnione symbolem „#”.
Po symbolu „#” może następować:
- Jedno ze słów kluczowych:
- Parametr, po którym następuje numer parametru w szablonie w nawiasie;
- CurrentTable – oznacza wstawienie do tekstu pełnej nazwy tabeli, dla której budowane jest ograniczenie;
- Nazwa bieżącej tabeli– oznacza wstawienie do tekstu pełnej nazwy tabeli (jako wartość ciągu znaków, w cudzysłowie), do której stosowana jest instrukcja, w aktualnej wersji języka wbudowanego;
- NazwaBieżący dostępPrawo– zawiera nazwę uprawnienia, dla którego realizowane jest aktualne ograniczenie: CZYTAJ, DODAJ, WSTAW, ZMIEŃ, AKTUALIZUJ, USUŃ;
- nazwa parametru szablonu – oznacza wstawienie do tekstu odpowiedniego ograniczenia parametru szablonu;
- symbol „#” – oznacza wstawienie jednego znaku „#” do tekstu.
Wyrażenie ograniczenia dostępu może zawierać:
- Szablon ograniczeń dostępu określony w formacie #TemplateName("Wartość parametru szablonu 1", "Wartość parametru szablonu 2",...). Każdy parametr szablonu jest ujęty w podwójny cudzysłów. Jeśli chcesz określić znak podwójnego cudzysłowu w tekście parametru, musisz użyć dwóch podwójnych cudzysłowów.
- Funkcja StrContains(WhereWeLook, WhatWeLook). Funkcja przeznaczona jest do wyszukiwania wystąpień ciągu WhatWeLook w ciągu WhereWeLook. Zwraca True, jeśli znaleziono wystąpienie, i False w przeciwnym razie.
- Operator + służy do łączenia ciągów.
Aby ułatwić edycję tekstu szablonu, na zakładce Szablony ograniczeń w formularzu roli kliknij przycisk Ustaw tekst szablonu. W otwartym oknie dialogowym wprowadź tekst szablonu i kliknij OK.
Nie można ich zainstalować za pomocą UstawParametr() lub coś podobnego.
Parametry w tym przypadku to:
- Opcje sesji
- Opcje funkcjonalne
Odczyt parametrów sesji w żądaniu ograniczenia dostępu następuje w trybie uprzywilejowanym, czyli bez kontroli uprawnień do operowania nimi.
Praktyka 4. Dostęp do „swoich” kontrahentów
Należy skonfigurować ograniczenie dostępu aktualnego użytkownika do „jego” kontrahentów.
Istnieje katalog „Użytkownicy”, katalog „Kontrahenci”, dokumenty z danymi „Kontrahent”.
Aktualny użytkownik powinien zobaczyć dane tylko dla tych kontrahentów, dla których zostało nawiązane z nim połączenie.
Należy także skonfigurować komunikację.
Możliwe opcje:
Nawiązanie powiązań pomiędzy użytkownikiem a kontrahentem
- Szczegóły w katalogu kontrahentów
- Rejestr informacji
Możliwe rozwiązania problemu:
- Przechowywanie użytkownika w stałej jest złą opcją; stała jest dostępna dla wszystkich użytkowników.
- Przechowywanie stałej tablicy kontrahentów bieżącego użytkownika w parametrach sesji nie jest zbyt dobre dobra opcja, kontrahentów może być wielu
- Dopuszczalną opcją jest zapisanie w parametrach sesji bieżącego użytkownika, a następnie zażądanie listy „jego” kontrahentów.
- Inne opcje.
Rozwiązanie.
Stwórzmy nowy parametr sesji „CurrentUser” i wypełnijmy go w module sesji.
Stwórzmy rejestr informacji „Compliance menadżerów i wykonawców”
Stwórzmy nową rolę, a w niej nowe ograniczenie dostępu dla dokumentu „Faktura”.
W treści żądania połączymy tabelę główną z rejestrem informacyjnym dla Konta = Konto i Menedżera = &CurrentUser. Typ połączenia Wewnętrzne.
Jeśli to możliwe, lepiej unikać zapytań zagnieżdżonych w tekstach ograniczeń dostępu, ponieważ będą one wykonywane za każdym razem, gdy dane z tego obiektu będą odczytywane z bazy danych.
Sprawdzam - ograniczenia działają
*Cecha: Jeśli zmienisz listę kontrahentów użytkowników w rejestrze, ograniczenia dostępu zaczną obowiązywać natychmiast, bez ponownego uruchamiania sesji użytkownika.
Praktyka 5. Data zakazu zmian.
Konieczne jest wprowadzenie ograniczenia edycji danych przed ustalonym terminem zakazu zmian.
Musisz ograniczyć to dla użytkowników.
Stwórzmy rejestr informacji „Daty zakazu zmian” o wymiarze Użytkownik, zasób Data zakazu.
Zbudujmy logikę rozwiązania w ten sposób:
- jeśli użytkownik nie jest określony, wówczas zakaz dotyczy wszystkich użytkowników
- jeżeli istnieje ograniczenie dla wszystkich użytkowników i ograniczenie dla konkretnego użytkownika, to ograniczenie dotyczy konkretnego użytkownika, a pozostałych zgodnie z ogólną zasadą.
Oczywiście takie ograniczenie można skonfigurować dla obiektów bazy danych, które mają pewne położenie na osi czasu. To może być
- Dokumentacja
- Okresowe rejestry informacyjne
Utwórzmy nową rolę „Ograniczenia według daty zakazu zmian”.
W nim dla dokumentu „Faktura” za właściwą „zmianę” dodamy nowe ograniczenie dostępu.
Określamy ustawienie dla wszystkich pól.
Treść ograniczenia brzmi:
Faktura odbioru z dokumentu. Faktura odbioru jako faktura odbioru
Zmień daty bana.Data bana jako data bana
Z
POŁĄCZENIE WEWNĘTRZNE (WYBIERZ
MAX(Zmień zabronione daty.Użytkownik) JAKO Użytkownik
Z
Rejestr informacji Daty zakazu zmian AS Daty zakazu zmian
GDZIE
(Zmień zabronione daty.User = &CurrentUser
LUB Daty ProhibitedChanges.User = WARTOŚĆ(Directory.users.EmptyLink))) AS VZ_User
BY Data zakazu zmian.User = VZ_User.User) AS NestedQuery
Data otrzymania oprogramowania.Data > Zagnieżdżone zapytanie.Data zakazu
Sprawdźmy – ograniczenie działa.
Korzystanie z instrukcji preprocesora
#Jeśli Warunek 1 #Wtedy
Poproś o fragment 1
#ElseIf Warunek2 #Wtedy
Poproś o fragment 2
#W przeciwnym razie
Poproś o fragment 3
#KoniecJeśli
W warunkach można go używać operacje logiczne(i. lub, nie itp.) i uzyskiwanie dostępu do parametrów sesji.
Takie podejście w kontekście konstruowania ograniczeń dostępu jest wygodne, ponieważ w zależności od warunków zostanie skompilowany krótszy tekst żądania. Prostsze zapytanie mniej obciąża system.
Wadą jest to, że konstruktor zapytań nie będzie działał z takim tekstem.
*Specyfika:
W odróżnieniu od instrukcji do preprocesora wbudowanego języka w tekstach ograniczeń dostępu, przed operatorem należy wówczas umieścić hash - #Then
Praktyka 6. Przełącz „Użyj RLS”
Uzupełnijmy nasz system ograniczeń o przełącznik włączający/wyłączający stosowanie ograniczeń na poziomie rekordu.
Aby to zrobić, dodamy stałą i parametr sesji o nazwie „UseRLS”.
Napiszmy w module Session, aby ustawić wartość parametru sesji z wartości stałej.
Dodajmy następujący kod do wszystkich tekstów ograniczeń dostępu:
„#If &UseRLS #Then….. #EndIf”
Sprawdzamy – wszystko działa.
Jednak teraz, po włączeniu flagi „użyj radaru”, zmiany nie zaczną obowiązywać od razu. Dlaczego?
Ponieważ parametr sesji jest ustawiany podczas uruchamiania sesji.
Możliwe jest ustawienie wartości parametru sesji, która ma zostać zresetowana po zapisaniu nowej wartości stałej, ale będzie to działać tylko w przypadku bieżącej sesji użytkownika. Inni użytkownicy powinni zostać poproszeni o ponowne uruchomienie systemu.
Koniec pierwszej części.
). Użycie tego słowa kluczowego pozwala uniknąć błędów przy pobieraniu rekordów, do których użytkownik nie ma uprawnień.
Problem: W niektórych przypadkach wynik ograniczeń dostępu do danych w 1C 8.3 może zależeć od planu zapytań DBMS. W tym artykule przeanalizowano możliwe sytuacje i przedstawiono zalecenia, jak tego uniknąć.
Problem ewentualnej zależności wyniku ograniczeń dostępu do danych od planu zapytań DBMS może pojawić się podczas wykonywania zapytania do bazy danych bez słowa kluczowego DOZWOLONY, jeśli bieżący użytkownik ma ograniczenia dostępu do danych, a żądanie zawiera jedno lub więcej porównań formularza:
- <Выражение над полями>(W|NIE W) (<Вложенный запрос>)
- (<Выражение над полями 1>, …, <Выражение над полями N>) (W|NIE W) (<Вложенный запрос>)
Jeśli w tym przypadku < > (zapytanie w zapytaniu) wykorzystuje tabele bazy danych, na które nałożone są ograniczenia dostępu, możliwe jest, że w niektórych SZBD zapytanie zostanie wykonane pomyślnie, a w innych zostanie wyświetlony komunikat pod warunkiem, że dane w bazach informacji są całkowicie identyczne .
Uzyskaj 267 lekcji wideo na 1C za darmo:
Przyczyna różnic
Możliwa różnica w zachowaniu wynika z wdrożenia ograniczeń dostępu do danych bez słowa kluczowego DOZWOLONY w 1C Enterprise 8.3.
Zapytanie bez słowa kluczowego DOZWOLONY zostanie zrealizowany pomyślnie tylko wtedy, gdy w trakcie jego realizacji nie nastąpi dostęp do zabronionych danych. W tym celu dodawane jest specjalne pole sygnałowe, które przyjmuje wartość PRAWDA dla tych rekordów, w tworzeniu których brały udział wyłącznie dozwolone dane, oraz wartość Kłamstwo dla wszystkich innych wpisów. Jeśli co najmniej jeden przykładowy rekord zawiera wartość Kłamstwo w polu sygnałowym, realizacja żądania kończy się nieprawidłowo.
To samo pole sygnałowe dodawane jest do wyników zapytań zagnieżdżonych w porównaniu W/NIE W. Ponadto sprawdzenie wartości kolumny sygnału w tym przypadku odbywa się za pomocą narzędzi DBMS. Zatem jeśli podczas wykonywania zagnieżdżonego zapytania uzyskano dostęp do zabronionych danych, wówczas zapytanie powinno zakończyć się niepowodzeniem i wystąpieniem błędu Użytkownik nie ma wystarczających uprawnień, aby wykonać operację na bazie danych.
Jednak podczas budowania planu zapytań DBMS może nie otrzymać pełnej próbki <Вложенным запросом> i otrzymywać tylko te zapisy, które są rzeczywiście niezbędne do sprawdzenia warunku W/NIE W. W takim przypadku żądanie może zakończyć się powodzeniem, nawet jeśli <Вложенного запроса> na niezależne żądanie może nastąpić dostęp do zabronionych danych.
Spójrzmy na prosty przykład. Niech na stole Katalog.Osoby indywidualne nakładane są ograniczenia w dostępie do danych. W tym przypadku żądanie:
Stół.Indywidualny JAKO Indywidualny
zostanie wykonane z błędem wynikającym z próby dostępu do zabronionych danych. Jeśli to zapytanie bierze udział w porównaniu, na przykład:
Stół.Indywidualny JAKO Indywidualny
Katalog.Osoby AS Tabela)
następnie, w zależności od wybranego planu zapytań DBMS, zapytanie może zostać wykonane pomyślnie lub z błędem. To zachowanie żądania nie jest błędem, ponieważ podczas wykonywania żądania może zostać uzyskany dostęp do zabronionych danych. Aby uzyskać bardziej przewidywalny wynik, należy skonstruować zapytanie w taki sposób, aby zagnieżdżone zapytanie nie miało dostępu do oczywiście niepotrzebnych danych. W szczególności, jeśli poprzednie zapytanie zostanie przepisane w następujący sposób:
Umowa o wykonywanie pracy z osobą fizyczną.Pracownikiem.Osobą fizyczną
Dokument Umowa o świadczenie pracy z osobą fizyczną JAKO Umowa o świadczenie pracy z osobą fizyczną
Umowa o świadczenie pracy z osobą fizyczną.Pracownik.Osoba B (
Stół.Indywidualny JAKO Indywidualny
Katalog.Osoby AS Tabela
Język zapytań jest jednym z podstawowych mechanizmów 1C 8.3 dla programistów. Za pomocą zapytań można szybko odzyskać dowolne dane zapisane w bazie danych. Jego składnia jest bardzo podobna do SQL, ale są pewne różnice.
Główne zalety języka zapytań 1C 8.3 (8.2) w porównaniu z SQL:
- dereferencja pól referencyjnych (odniesienie jednego lub większej liczby punktów do szczegółów obiektu);
- praca z wynikami jest bardzo wygodna;
- możliwość tworzenia wirtualnych tabel;
- wniosek może zostać napisany w języku angielskim i rosyjskim;
- możliwość blokowania danych w celu uniknięcia zakleszczeń.
Wady języka zapytań w 1C:
- w przeciwieństwie do SQL, w zapytaniach 1C nie pozwalają na zmianę danych;
- brak procedur przechowywanych;
- niemożność konwersji ciągu znaków na liczbę.
Rzućmy okiem na nasz mini samouczek na temat podstawowych konstrukcji języka zapytań 1C.
Ponieważ zapytania w 1C pozwalają tylko na odbieranie danych, każde zapytanie musi zaczynać się od słowa „WYBIERZ”. Po tym poleceniu wskazane są pola, z których należy pobrać dane. Jeżeli wpiszesz „*”, wybrane zostaną wszystkie dostępne pola. Miejsce, z którego zostaną wybrane dane (dokumenty, rejestry, spisy itp.) wskazane jest po słowie „OD”.
W omówionym poniżej przykładzie nazwy całej nomenklatury wybierane są z katalogu „Nomenklatura”. Po słowie „JAK” wskazane są aliasy (nazwy) tabel i pól.
WYBIERAĆ
Nomenklatura Nazwa AS Nazwa nomenklatury
Z
Katalog.Nomenklatura AS NomenklaturaObok polecenia „WYBIERZ” możesz określić słowa kluczowe:
- RÓŻNY. Zapytanie wybierze tylko wiersze, które różnią się co najmniej jednym polem (bez duplikatów).
- PIERWSZY rz, Gdzie N– liczba wierszy od początku wyniku, które należy wybrać. Najczęściej tę konstrukcję stosuje się w połączeniu z sortowaniem (ORDER BY). Na przykład, gdy chcesz wybrać określoną liczbę dokumentów, które są aktualne według daty.
- DOZWOLONY. Konstrukcja ta umożliwia wybranie z bazy danych tylko tych rekordów, które są dostępne dla bieżącego użytkownika. W wyniku użycia tego słowa kluczowego użytkownik otrzyma komunikat o błędzie podczas próby zapytania o rekordy, do których nie ma dostępu.
Te słowa kluczowe mogą być używane razem lub osobno.
DLA ZMIANY
Niniejsza propozycja blokuje dane, aby zapobiec wzajemnym konfliktom. Zablokowane dane nie zostaną odczytane z innego połączenia aż do zakończenia transakcji. W tej klauzuli możesz określić konkretne tabele, które mają być zablokowane. W przeciwnym razie wszyscy zostaną zablokowani. Konstrukcja dotyczy wyłącznie trybu automatycznego ryglowania.
Najczęściej przy odbiorze salda stosowana jest klauzula „DO ZMIANY”. Przecież gdy w programie pracuje jednocześnie kilku użytkowników, jeden otrzymuje salda, drugi może je zmieniać. W takim przypadku otrzymana reszta nie będzie już poprawna. Jeśli zablokujesz dane tą propozycją, to dopóki pierwszy pracownik nie otrzyma prawidłowego salda i nie wykona przy nim wszystkich niezbędnych manipulacji, drugi pracownik będzie zmuszony poczekać.
WYBIERAĆ
Wzajemne rozliczenia Pracownik,
Wzajemne rozliczenia Kwota wzajemnych rozliczeń Saldo
Z
Rejestr Akumulacji Wzajemne rozliczenia z pracownikami Salda AS Wzajemne rozliczenia
DLA ZMIANYGDZIE
Projekt jest konieczny, aby narzucić pewnego rodzaju selekcję przesyłanym danym. W niektórych przypadkach pozyskiwania danych z rejestrów rozsądniejsze jest określenie warunków selekcji w parametrach tablic wirtualnych. W przypadku użycia opcji „WHERE” w pierwszej kolejności pobierane są wszystkie rekordy, a dopiero potem stosowana jest selekcja, co znacznie spowalnia zapytanie.
Poniżej znajduje się przykład zapytania o pozyskanie osób kontaktowych na konkretne stanowisko. Parametr wyboru ma format: &NazwaParametru (nazwa parametru jest dowolna).
WYBÓR (przypadek)
Konstrukcja umożliwia określenie warunków bezpośrednio w treści żądania.
W poniższym przykładzie „AdditionalField” będzie zawierać tekst w zależności od tego, czy dokument został zaksięgowany, czy nie:
WYBIERAĆ
WstępT&U.Link,
WYBÓR
KIEDY WstępT&U.Wykonane
WTEDY „Dokument został przyjęty!”
W przeciwnym razie „Dokument nie został wysłany...”
KONIEC JAKO Pole dodatkowe
Z
Dokument Odbiór towarów i usług JAK Warunki odbioruDOŁĄCZYĆ
Złączenia łączą dwie tabele według pewien warunek komunikacja.
POŁĄCZENIE LEWE/PRAWE
Istotą złączenia LEFT jest to, że pierwsza określona tabela jest pobierana w całości, a druga jest z nią łączona zgodnie z warunkiem połączenia. Jeśli w drugiej tabeli nie ma rekordów odpowiadających pierwszej tabeli, wówczas jako ich wartości zostaje podstawiona wartość NULL. Mówiąc najprościej, tabela główna jest pierwszą określoną tabelą, a dane drugiej tabeli (jeśli istnieją) są już zastąpione jej danymi.
Przykładowo konieczne jest uzyskanie pozycji towarowych z dokumentów „Odbiór towarów i usług”, a cen z rejestru informacyjnego „Ceny pozycji”. W takim przypadku, jeśli nie zostanie znaleziona cena dla żadnej pozycji, zamiast tego zamień NULL. Wybrane zostaną wszystkie pozycje z dokumentu niezależnie od tego czy mają cenę czy nie.
WYBIERAĆ
Nomenklatura odbioru i U,
Ceny.Cena
Z
Dokument Odbiór towarów i usług Towar JAK Odbiór i specyfikacje
DOŁĄCZENIE WEWNĘTRZNE RejestrInformacje.CenyNomenklatura.SliceLast AS Ceny
Otrzymanie oprogramowania i nomenklatura = Ceny. NomenklaturaW PRAWEJ wszystko jest dokładnie odwrotnie.
PEŁNE POŁĄCZENIE
Ten typ połączenia różni się od poprzednich tym, że w rezultacie zwrócone zostaną wszystkie rekordy zarówno pierwszej, jak i drugiej tabeli. Jeśli w pierwszej lub drugiej tabeli na podstawie określonego warunku połączenia nie zostaną znalezione żadne rekordy, zamiast tego zostanie zwrócona wartość NULL.
Kiedy użyto w poprzednim przykładzie pełne połączenie Wybrane zostaną wszystkie pozycje towarowe z dokumentu „Odbiór towarów i usług” oraz wszystkie najnowsze ceny z rejestru „Ceny towarów”. Wartości nieodnalezionych rekordów zarówno w pierwszej, jak i drugiej tabeli będą równe NULL.
WEWNĘTRZNE POŁĄCZENIE
Różnica między INNER JOIN a FULL JOIN polega na tym, że jeśli w przynajmniej jednej z tabel nie zostanie znaleziony rekord, zapytanie w ogóle go nie wyświetli. W rezultacie wybrane zostaną tylko te pozycje pozycji z dokumentu „Odbiór towarów i usług”, dla których istnieją zapisy w rejestrze informacyjnym „Ceny pozycji”, jeśli w poprzednim przykładzie „PEŁNE” zastąpimy „WEWNĘTRZNY”.
GRUPUJ WEDŁUG
Grupowanie w zapytaniach 1C umożliwia zwijanie wierszy tabeli (grupowanie pól) według określonego wspólną cechą(pola zgrupowane). Pola grupujące można wyświetlić wyłącznie przy użyciu funkcji agregujących.
Wynikiem poniższego zapytania będzie lista typów produktów wraz z maksymalnymi cenami dla nich.
WYBIERAĆ
,
MAX(Cena.Cena) AS Cena
Z
GRUPUJ WEDŁUG
Ceny.Nomenklatura.Rodzaj nomenklaturyWYNIKI
W przeciwieństwie do grupowania, w przypadku korzystania z sum wyświetlane są wszystkie rekordy i dodawane są do nich wiersze sumy. Grupowanie wyświetla tylko uogólnione rekordy.
Wyniki można sumować dla całej tabeli (słowo kluczowe „OGÓLNE”), dla kilku pól, dla pól o strukturze hierarchicznej (słowa kluczowe „HIERARCHY”, „TYLKO HIERARCHIA”). Przy podsumowywaniu wyników nie ma konieczności stosowania funkcji agregujących.
Przyjrzyjmy się przykładowi podobnemu do powyższego, używając grupowania. W takim przypadku wynik zapytania zwróci nie tylko zgrupowane pola, ale także szczegółowe rekordy.
WYBIERAĆ
Ceny.Nomenklatura.Rodzaj nomenklatury AS Rodzaj nomenklatury,
Ceny. Cena AS Cena
Z
Rejestr informacji Ceny nomenklatury Migawka najnowszych cen AS
WYNIKI
MAKSYMALNA (Cena)
PRZEZ
TypNomenklaturaMAJĄCY
Operator ten jest podobny do operatora WHERE, ale jest używany tylko w przypadku funkcji agregujących. Pozostałe pola, poza tymi używanymi przez ten operator, należy zgrupować. Operator WHERE nie ma zastosowania do funkcji agregujących.
W poniższym przykładzie wybierane są ceny maksymalne artykułu, jeśli przekraczają 1000, pogrupowane według rodzaju artykułu.
WYBIERAĆ
MAX(Cena.Cena) AS Cena
Z
Rejestr informacji Ceny nomenklatury Migawka najnowszych cen AS
GRUPUJ WEDŁUG
Ceny.Nomenklatura.Rodzaj nomenklatury
MAJĄCY
MAKSYMALNE(Ceny.Cena) > 1000SORTUJ WEDŁUG
Operator ORDER BY sortuje wynik zapytania. Aby mieć pewność, że rekordy są wyświetlane w spójnej kolejności, używana jest funkcja AUTO ORDER. Typy pierwotne są sortowane według zwykłych zasad. Typy odwołań są sortowane według identyfikatora GUID.
Przykład uzyskania listy pracowników posortowanej według nazw:
WYBIERAĆ
Pracownicy.Nazwa AS Nazwa
Z
Katalog.Pracownicy JAK Pracownicy
SORTUJ WEDŁUG
Nazwa
AUTOMATYCZNE ZAMÓWIENIEInne konstrukcje języka zapytań 1C
- ŁĄCZYĆ– wyniki dwóch zapytań w jedno.
- POŁĄCZ WSZYSTKO– podobnie jak COMBINE, ale bez grupowania identycznych wierszy.
- PUSTY STOLIK– czasami używane podczas łączenia zapytań w celu określenia pustej zagnieżdżonej tabeli.
- MIEJSCE– tworzy tabelę tymczasową w celu optymalizacji złożonych zapytań 1C. Takie żądania nazywane są żądaniami wsadowymi.
Funkcje języka zapytań
- PODCIĄG obcina ciąg znaków od określonej pozycji do określonej liczby znaków.
- ROK... DRUGI pozwalają uzyskać wybraną wartość typu numerycznego. Parametrem wejściowym jest data.
- POCZĄTEK OKRESU i KONIEC OKRESU używane podczas pracy z datami. Rodzaj okresu (DZIEŃ, MIESIĄC, ROK itp.) wskazywany jest jako dodatkowy parametr.
- DODATK.DATA pozwala na dodanie lub odjęcie od daty określonego czasu określonego typu (DRUGA, MINUTA, DZIEŃ itp.).
- RÓŻNICA określa różnicę pomiędzy dwiema datami, wskazując rodzaj wartości wyjściowej (DZIEŃ, ROK, MIESIĄC itp.).
- ISNULL zastępuje brakującą wartość określonym wyrażeniem.
- REPREZENTACJA i LINKI REPREZENTACYJNE uzyskać ciąg znaków reprezentujący określone pole. Zastosuj odpowiednio do dowolnych wartości i tylko wartości referencyjnych.
- TYP, WARTOŚCI TYPU służą do określenia typu parametru wejściowego.
- POŁĄCZYĆ jest logicznym operatorem porównania dla typu wartości atrybutu.
- WYRAZIĆ używany do konwersji wartości na żądany typ.
- DATA CZAS pobiera wartość typu „Data” z wartości numerycznych (rok, miesiąc, dzień, godzina, minuta, sekunda).
- OZNACZAJĄCY w żądaniu 1C służy do wskazania predefiniowanych wartości - katalogów, wyliczeń, planów typów cech. Przykład użycia: " Gdzie osoba prawna = wartość (wyliczenie. osoba prawna. osoba fizyczna)«.
Konstruktor zapytań
Do tworzenia zapytań za pomocą 1C istnieje bardzo wygodny wbudowany mechanizm - projektant zapytań. Zawiera następujące główne zakładki:
- „Tabele i pola” – zawiera pola do wybrania oraz ich źródła.
- „Połączenia” – opisuje warunki struktury POŁĄCZENIE.
- „Grupowanie” – zawiera opis struktur grupujących oraz zsumowanych na ich podstawie pól.
- „Warunki” – odpowiada za wybór danych w zapytaniu.
- „Zaawansowane” – dodatkowe parametry zapytania, takie jak słowa kluczowe dla komendy „WYBIERZ” itp.
- „Złączenia/Aliasy” - wskazane są możliwości łączenia tabel i określone aliasy (konstrukcja „JAK”).
- „Zamówienie” odpowiada za sortowanie wyników zapytań.
- „Sumy” – podobne do zakładki „Grupowanie”, ale używane w konstrukcji „SUMY”.
Treść samego żądania można wyświetlić, klikając przycisk „Zapytanie” w lewym dolnym rogu. W tej formie można go poprawić ręcznie lub skopiować.
Poproś o konsolę
Aby szybko wyświetlić wynik zapytania w trybie korporacyjnym lub debugować złożone zapytania, użyj . Zawiera tekst żądania, ustawia parametry i wyświetla wynik.
Konsolę zapytań możesz pobrać na dysku ITS lub poprzez plik .