• Notatnik programisty. Używając dyrektywy „Dozwolone” 1s wybierz dozwolone

    21.06.2023

    20.09.2014

    W języku zapytań istnieje dyrektywa „Dozwolone”. Jest przeznaczony do użycia przez platformę do filtrowania rekordów, do których użytkownik nie ma uprawnień podczas ustawiania limitu poziomu rekordów w bazie danych.

    Wydawać by się mogło, że w zapytaniach lepiej zawsze używać tej dyrektywy. Będę argumentował, że tak nie jest. Ponadto będę argumentować, że jeśli to możliwe, należy go unikać, dlatego.

    Powiedzmy, że robimy raport o wzajemnych rozliczeniach osób fizycznych. Użytkownik ma uprawnienia do jednej organizacji, aw bazie danych jest więcej niż jedna organizacja, aw bazie danych jest włączone ograniczenie na poziomie rekordów. W bazie znajduje się również rejestr „Rozliczenia wzajemne” o wymiarach „Organizacja” i „Indywidualny”. Jeśli w systemie jest żądanie

    "Wybierać

    Organizacja,

    Indywidualny

    i zostanie wykonane w imieniu użytkownika z uprawnieniami do jednej organizacji, wówczas zapytanie zakończy się niepowodzeniem, jeśli w tym rejestrze znajdują się wpisy innych organizacji. Wystąpi błąd, a opis błędu będzie brzmiał: „Użytkownik nie ma wystarczających uprawnień do zrealizowania żądania!” i to prawda, platforma nie oszukuje, ponieważ nie ma praw do zapisów innych organizacji w tym rejestrze.

    Co zrobić w takim przypadku, użyć dyrektywy „Dozwolone”? Nie warto moim zdaniem. Wystarczy ustawić wybór według organizacji, a użytkownik będzie mógł wygenerować raport. Zapytanie o raport ze składem danych będzie wyglądać następująco

    "Wybierać

    Organizacja,

    Indywidualny

    (Wybierać

    Organizacja

    indywidualny)

    Z rejestru akumulacji Wzajemne rozliczenia

    (Gdzie

    Organizacja

    indywidualny)

    Jeżeli użytkownik wykona zapytanie na tabelę bez selekcji, to raport nie zostanie wygenerowany, a użytkownik nie rozpozna danych dla innych organizacji, a jeśli ustawi selekcję dla swojej organizacji, wygeneruje poprawne dane.

    Możesz zapytać ponownie - „Dlaczego nie powinieneś używać dyrektywy Dozwolone”, to natychmiast narzuca wybór, ratuje użytkownika przed wiadomościami, których nie potrzebuje!

    Odpowiedź na to pytanie będzie następująca - skąd w takim przypadku użytkownik będzie wiedział, że w raporcie znalazły się wszystkie niezbędne dane. Załóżmy, że wcześniej ten użytkownik pracował na pełnych prawach i popełnił błąd, wybierając w dokumencie osobę z innej organizacji. Może też zaistnieć sytuacja, że ​​dane były ładowane - aw dokumentach organizacji zarejestrowano oddział innej organizacji (w ZUP nałożone są na nich również ograniczenia dotyczące właściciela). W takim przypadku dyrektywa „Dozwolone” odetnie zabronione dane bez żadnych komunikatów dla użytkownika, a on nie będzie wiedział, że nie wszystko, co powinno znaleźć się w raporcie, zostało uwzględnione.

    Dlatego nie ma potrzeby masowego wpisywania tej dyrektywy do zapytań o typowe konfiguracje, uznając to za błąd. Zdecydowanie odradza się robienie tego w regulowanych żądaniach raportowania. Nie rób tego również w innych raportach i dokumentach, w których wymagana jest dokładność informacji.

    Ale jak można jeszcze uniknąć błędu „wpadnięcia” programu z brakiem uprawnień?

    Tak, to bardzo proste, musisz użyć polecenia „Spróbuj”, oto przykład:

    Próba

    Żądanie.Wykonaj();

    Wyjątek

    Raport(opis błędu());

    koniec próby;

    W raportach wykorzystujących ACS kod programu do wykonania raportu musi być napisany ręcznie, również poprzez próbę.

    W rezultacie użytkownik nie otrzyma nieprawidłowych danych i otrzyma rozsądny komunikat o błędzie.

    Możesz zapoznać się z niuansami ustawiania RLS w poszczególnych działach w naszym artykule.

    ). Użycie tego słowa kluczowego pozwala uniknąć błędu podczas pobierania 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 omówiono możliwe sytuacje i podano zalecenia, jak ich uniknąć.

    Problem możliwej zależności wyniku ograniczeń dostępu do danych od planu zapytań DBMS może pojawić się, gdy zapytanie do bazy danych jest wykonywane bez słowa kluczowego DOZWOLONY jeśli istnieją ograniczenia dostępu do danych dla bieżącego użytkownika, a zapytanie zawiera jedno lub więcej porównań formularza:

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

    Jeśli w tym przypadku < > (zapytanie w zapytaniu) korzysta z tabel bazy danych, które podlegają ograniczeniom dostępu, to możliwe jest, że zapytanie zostanie wykonane pomyślnie na niektórych SZBD, a na innych zostanie wystawiony komunikat, pod warunkiem, że dane w bazach danych są całkowicie identyczne .

    Zdobądź 267 lekcji wideo 1C za darmo:

    Przyczyna różnic

    Ewentualna różnica w zachowaniu wynika z implementacji ograniczeń dostępu do danych bez słowa kluczowego DOZWOLONY w 1C Enterprise 8.3.

    Zapytanie bez słowa kluczowego DOZWOLONY zostanie pomyślnie wykonany tylko wtedy, gdy w trakcie jego wykonywania nie nastąpi dostęp do zabronionych danych. Aby to zrobić, dodaje się do niego specjalne pole sygnału, które przyjmuje wartość PRAWDA dla tych rekordów, w tworzeniu których brały udział tylko dozwolone dane, oraz wartość Kłamstwo dla wszystkich innych wpisów. Jeśli co najmniej jeden rekord wyboru zawiera wartość Kłamstwo w polu sygnału, zapytanie kończy się nieprawidłowo.

    To samo pole sygnału jest dodawane 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ą DBMS. Jeżeli więc w trakcie wykonywania zapytania zagnieżdżonego nastąpił dostęp do zabronionych danych, to wykonanie zapytania powinno zakończyć się błędem Użytkownik nie ma wystarczających uprawnień do wykonania operacji na bazie danych.

    Jednak podczas budowania planu zapytań DBMS może nie otrzymać pełnego wyboru <Вложенным запросом> i pobierz tylko te rekordy, które są faktycznie potrzebne do sprawdzenia warunku W/NIE W. W takim przypadku zapytanie może się powieść, nawet jeśli <Вложенного запроса> dostęp do zabronionych danych może nastąpić w formie niezależnego żądania.

    Rozważmy prosty przykład. Niech na stole Katalog. Osoby fizyczne ograniczenia dostępu do danych. W tym przypadku żądanie jest następujące:

    Tabela.Indywidualne AS Indywidualne

    zostanie wykonany z błędem w wyniku próby dostępu do zabronionych danych. Jeśli to zapytanie bierze udział w porównaniu, na przykład:

    Tabela.Indywidualne AS Indywidualne

    Katalog.Osoby indywidualne AS Tabela)

    następnie, w zależności od planu zapytań wybranego przez DBMS, zapytanie może zostać wykonane pomyślnie lub z błędem. Takie zachowanie żądania nie jest błędne, ponieważ dostęp do zabronionych danych podczas wykonywania tego żądania może wystąpić lub nie. Aby uzyskać bardziej przewidywalny wynik, konieczne jest zbudowanie zapytania w taki sposób, aby zagnieżdżone zapytanie nie wykonywało dostępów do danych oczywiście niepotrzebnych. W szczególności, jeśli poprzednie zapytanie zostanie przepisane w następujący sposób:

    Umowa o dzieło z osobą.pracownikiem.osobą fizyczną

    Dokument Umowa o wykonanie pracy z osobą fizyczną JAKO Umowa o wykonanie pracy z osobą fizyczną

    Umowa o wykonanie pracy z osobą.pracownikiem.osobą B (

    Tabela.Indywidualne AS Indywidualne

    Directory.Individuals AS Tabela

    Język zapytań jest jednym z podstawowych mechanizmów 1C 8.3 dla programistów. Za pomocą zapytań można szybko uzyskać dowolne dane przechowywane w bazie danych. Jego składnia jest bardzo podobna do języka SQL, ale istnieją pewne różnice.

    Główne zalety języka zapytań 1C 8.3 (8.2) w porównaniu z SQL:

    • dereferencja pól referencyjnych (zamienianie jednej lub więcej kropek na atrybuty obiektów);
    • praca z wynikami jest bardzo wygodna;
    • możliwość tworzenia wirtualnych tabel;
    • wniosek może być napisany zarówno w języku angielskim, jak i rosyjskim;
    • możliwość blokowania danych w celu uniknięcia impasu.

    Wady języka zapytań w 1C:

    • w przeciwieństwie do SQL, w zapytaniach 1C nie pozwalają na zmianę danych;
    • brak procedur składowanych;
    • niemożność konwersji ciągu znaków na liczbę.

    Rozważ nasz mini samouczek na temat podstawowych konstrukcji języka zapytań 1C.

    Ze względu na fakt, że żądania w 1C pozwalają tylko na otrzymywanie danych, każde żądanie musi zaczynać się od słowa „WYBIERZ”. Po tym poleceniu wskazane są pola, z których chcesz uzyskać dane. W przypadku określenia „*” zostaną wybrane wszystkie dostępne pola. Miejsce, z którego będą pobierane dane (dokumenty, rejestry, katalogi itp.) jest wskazane po słowie „OD”.

    W poniższym przykładzie nazwy całej nomenklatury są wybrane z podręcznika „Nomenklatura”. Po słowie „JAK” wskazane są aliasy (nazwy) tabel i pól.

    WYBIERAĆ
    Nomenclature.Name AS NameNomenclature
    Z
    Katalog Nomenklatura AS Nomenklatura

    Obok polecenia „WYBIERZ” możesz określić słowa kluczowe:

    • RÓŻNY. Zapytanie wybierze tylko te wiersze, które różnią się co najmniej jednym polem (bez duplikatów).
    • PIERWSZY rz, Gdzie N– ilość wierszy od początku wyniku do wybrania. Najczęściej ta konstrukcja jest używana w połączeniu z sortowaniem (ORDER BY). Na przykład, gdy trzeba wybrać określoną liczbę najnowszych dokumentów według daty.
    • DOZWOLONY. Ten projekt pozwala wybrać z bazy danych tylko te rekordy, które są dostępne dla bieżącego użytkownika. W przypadku użycia tego słowa kluczowego użytkownik otrzyma komunikat o błędzie, jeśli spróbuje przeszukać rekordy, do których nie ma dostępu.

    Tych słów kluczowych można używać razem lub osobno.

    NA ZMIANĘ

    Ta klauzula blokuje dane, aby uniknąć konfliktów. Zablokowane dane nie zostaną odczytane z innego połączenia do czasu zakończenia transakcji. W tej klauzuli możesz określić konkretne tabele, które chcesz zablokować. W przeciwnym razie wszystkie zostaną zablokowane. Projekt dotyczy tylko trybu automatycznego blokowania.

    Najczęściej przy odbiorze sald stosowana jest klauzula „NA ZMIANĘ”. Rzeczywiście, gdy kilku użytkowników pracuje w programie w tym samym czasie, podczas gdy jeden otrzymuje salda, drugi może je zmienić. W takim przypadku wynikowe saldo nie będzie już prawidłowe. Jeśli zablokujesz dane za pomocą tej propozycji, to dopóki pierwszy pracownik nie otrzyma prawidłowego salda i nie wykona z nim wszystkich niezbędnych manipulacji, drugi pracownik będzie musiał czekać.

    WYBIERAĆ
    Wzajemne rozliczenia Pracownik,
    Wzajemne rozliczenia Kwota Wzajemne rozliczenia Saldo
    Z
    Rejestr akumulacyjny Wzajemne rozliczenia Z pracownikami Salda JAKO Wzajemne rozliczenia
    NA ZMIANĘ

    GDZIE

    Konstrukcja jest niezbędna do narzucenia dowolnej selekcji na wyładowanych danych. W niektórych przypadkach pozyskiwania danych z rejestrów bardziej zasadne jest zapisanie warunków selekcji w parametrach tablic wirtualnych. W przypadku użycia opcji „WHERE” wszystkie rekordy są uzyskiwane w pierwszej kolejności, a dopiero potem stosowana jest selekcja, co znacznie spowalnia zapytanie.

    Poniżej przykładowa prośba o pozyskanie osób kontaktowych na określone stanowisko. Parametr wyboru ma następujący format: &ParameterName (nazwa parametru jest dowolna).

    WYBÓR (PRZYKŁAD)

    Konstrukcja umożliwia określenie warunków bezpośrednio w treści żądania.

    W poniższym przykładzie pole „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
    GDY
    WTEDY „Dokument wysłany!”
    ELSE „Dokument nie został wysłany…”
    END AS Dodatkowe pole
    Z
    Dokument.Odbiór TowaruUsługi AS Odbiór OWU

    DOŁĄCZYĆ

    Łączy dwie tabele za pomocą określonego warunku połączenia.

    LEWY/PRAWY DOŁĄCZ

    Istotą LEFT join jest to, że pierwsza określona tabela jest zajęta w całości, a druga jest do niej dołączona przez warunek połączenia. Jeśli w drugiej tabeli nie ma rekordów odpowiadających pierwszej tabeli, to NULL jest zastępowane jako ich wartości. Mówiąc najprościej, główną tabelą jest pierwsza określona tabela, a dane z drugiej tabeli (jeśli istnieje) są już zastąpione jej danymi.

    Na przykład musisz uzyskać pozycje pozycji z dokumentów „Odbiór towarów i usług” oraz ceny z rejestru informacyjnego „Ceny pozycji”. W takim przypadku, jeśli cena dowolnej pozycji nie zostanie znaleziona, zamiast tego wstaw NULL. Wszystkie pozycje z dokumentu zostaną wybrane niezależnie od tego, czy mają cenę, czy nie.

    WYBIERAĆ
    Odbiór T&U Nomenklatura,
    Ceny.Cena
    Z
    Dokument.Odbiór TowarówUsługi.Towary AS Odbiór OWU
    POŁĄCZENIE WEWNĘTRZNE
    ON Odbiór pytań i odpowiedzi. Nomenklatura = Ceny. Nomenklatura

    W PRAWO wszystko jest dokładnie na odwrót.

    PEŁNE POŁĄCZENIE

    Ten typ łączenia różni się od poprzednich tym, że w wyniku zostaną zwrócone wszystkie rekordy zarówno pierwszej, jak i drugiej tabeli. Jeśli w pierwszej lub drugiej tabeli nie zostaną znalezione żadne rekordy dla określonego warunku połączenia, zamiast tego zostanie zwrócona wartość NULL.

    W przypadku korzystania z pełnego łączenia w poprzednim przykładzie zostaną wybrane wszystkie pozycje pozycji z dokumentu Przyjęcie towarów i usług oraz wszystkie najnowsze ceny z rejestru Ceny pozycji. Wartości nie znalezionych rekordów, zarówno w pierwszej, jak iw drugiej tabeli, będą miały wartość NULL.

    POŁĄCZENIE WEWNĘTRZNE

    Różnica między łączeniem INNER a łączeniem FULL polega na tym, że jeśli rekord nie zostanie znaleziony w co najmniej jednej z tabel, zapytanie w ogóle go nie wyświetli. W rezultacie zostaną wybrane tylko te pozycje towarowe z dokumentu PZ, dla których istnieją wpisy w rejestrze informacyjnym Ceny pozycji, jeśli w poprzednim przykładzie zamienimy PEŁNY na WEWNĘTRZNY.

    GRUPUJ WEDŁUG

    Grupowanie w zapytaniach 1C umożliwia zwijanie wierszy tabeli (grupowanie pól) zgodnie z pewną wspólną cechą (grupowanie pól). Pola grupowania mogą być wyświetlane tylko przy użyciu funkcji agregujących.

    Wynikiem następnego zapytania będzie lista typów artykułów wraz z ich maksymalnymi cenami.

    WYBIERAĆ
    ,
    MAX(cena.cena) jako cena
    Z

    GRUPUJ WEDŁUG
    Ceny. Nomenklatura. Typ Nomenklatura

    WYNIKI

    W przeciwieństwie do grupowania, podczas korzystania z sum wyświetlane są wszystkie rekordy, a wiersze sum są już do nich dodane. Grupowanie wyświetla tylko uogólnione rekordy.

    Wyniki można podsumować dla całej tabeli (wykorzystując słowo kluczowe „OGÓLNE”), dla kilku pól, dla pól o strukturze hierarchicznej (słowa kluczowe „HIERARCHY”, „TYLKO HIERARCHIA”). Podczas podsumowania nie jest konieczne stosowanie funkcji agregujących.

    Rozważmy przykład podobny do powyższego przy użyciu grupowania. W takim przypadku wynik zapytania zwróci nie tylko zgrupowane pola, ale także szczegółowe rekordy.

    WYBIERAĆ
    Ceny.Nomenklatura.Typ nomenklatury AS Rodzaj nomenklatury,
    Ceny.Cena AS Cena
    Z
    RegisterInformation.PricesNomenclature.SliceLast AS Ceny
    WYNIKI
    MAKSYMALNA (cena)
    PRZEZ
    Nazewnictwo typów

    MAJĄCY

    Ten operator jest podobny do operatora WHERE, ale jest używany tylko w przypadku funkcji agregujących. Pola inne niż używane przez tego operatora muszą być pogrupowane. Operator „WHERE” nie ma zastosowania do funkcji agregujących.

    W poniższym przykładzie wybierane są maksymalne ceny artykułów, jeśli przekraczają 1000, pogrupowane według typu artykułu.

    WYBIERAĆ

    MAX(cena.cena) jako cena
    Z
    RegisterInformation.PricesNomenclature.SliceLast AS Ceny
    GRUPUJ WEDŁUG
    Ceny. Nomenklatura. Typ Nomenklatura
    MAJĄCY
    MAX(ceny.cena) > 1000

    SORTUJ WEDŁUG

    Operator „ORDER BY” sortuje wynik zapytania. Aby upewnić się, że rekordy są wyprowadzane w spójnej kolejności, używana jest funkcja AUTO-ORDER. Typy pierwotne są sortowane zgodnie ze zwykłymi regułami. Typy odwołań są sortowane według identyfikatora GUID.

    Przykład pobrania listy pracowników posortowanej według nazwiska:

    WYBIERAĆ
    Pracownicy.Nazwisko AS Nazwisko
    Z
    Katalog Pracownicy AS Pracownicy
    SORTUJ WEDŁUG
    Nazwa
    AUTOMATYCZNE ZAMÓWIENIE

    Inne konstrukcje języka zapytań 1C

    • ZJEDNOCZYĆ- wyniki dwóch zapytań w jednym.
    • ZJEDNOCZCIE WSZYSTKICH– podobny do JOIN, ale bez grupowania identycznych wierszy.
    • PUSTY STOLIK- czasami używane podczas łączenia zapytań w celu określenia pustej tabeli zagnieżdżonej.
    • UMIEŚCIĆ- tworzy tymczasową tabelę w celu optymalizacji złożonych zapytań 1C. Takie żądania są nazywane żądaniami wsadowymi.

    Funkcje języka zapytań

    • PODŁAŃCUCH obcina ciąg z określonej pozycji o określoną liczbę znaków.
    • ROK… DRUGI pozwalają uzyskać wybraną wartość typu numerycznego. Parametrem wejściowym jest data.
    • POCZĄTEK I KONIEC OKRESU są używane podczas pracy z datami. Typ okresu (DZIEŃ, MIESIĄC, ROK itp.) jest określany jako dodatkowy parametr.
    • DODAJ pozwala dodawać lub odejmować od daty określony czas określonego typu (SEKUNDA, MINUTA, DZIEŃ itp.).
    • RÓŻNICA DATY określa różnicę między dwiema datami, określając typ wartości wyjściowej (DZIEŃ, ROK, MIESIĄC itp.).
    • JEST NULL zastępuje brakującą wartość określonym wyrażeniem.
    • PREZENTACJA i PREZENTACJALINKI pobierz ciąg reprezentujący określone pole. Są one używane odpowiednio dla dowolnych wartości i tylko wartości referencyjnych.
    • TYP, TYP WARTOŚCI służą do określenia typu parametru wejściowego.
    • POŁĄCZYĆ jest logicznym operatorem porównania dla typu wartości atrybutu.
    • WYRAZIĆ służy do konwersji wartości na żądany typ.
    • DATA GODZINA pobiera wartość typu „Data” z wartości liczbowych (Rok, Miesiąc, Dzień, Godzina, Minuta, Sekunda).
    • OZNACZAJĄCY w żądaniu 1C służy do określenia predefiniowanych wartości - katalogów, wyliczeń, planów typów cech. Przykład użycia: " Gdzie LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

    Konstruktor zapytań

    Aby tworzyć zapytania za pomocą 1C, istnieje bardzo wygodny wbudowany mechanizm - projektant zapytań. Zawiera następujące główne zakładki:

    • „Tabele i pola” – zawiera pola do wyboru oraz ich źródła.
    • „Linki” — opisuje warunki konstrukcji CONNECTION.
    • „Grupowanie” – zawiera opis konstrukcji grupowania oraz podsumowane przez nie pola.
    • „Warunki” – odpowiada za wybór danych w zapytaniu.
    • „Zaawansowane” – dodatkowe parametry zapytania, takie jak słowa kluczowe polecenia „WYBIERZ” itp.
    • „Joins / Aliases” - wskazane są możliwości łączenia tabel i ustawiane aliasy (konstrukcja „JAK”).
    • „Kolejność” – odpowiada za sortowanie wyniku zapytania.
    • „Suma” – podobna do zakładki „Grupowanie”, ale służy do konstrukcji „SUMY”.

    Tekst samego żądania można wyświetlić, klikając przycisk „Zapytaj” w lewym dolnym rogu. W tej postaci można go poprawić ręcznie lub skopiować.


    Konsola zapytań

    Aby szybko wyświetlić wynik zapytania w trybie „Enterprise” lub debugować złożone zapytania, użyj . W nim zapisywany jest tekst zapytania, ustawiane są parametry i wyświetlany jest jego wynik.

    Konsolę zapytań można pobrać na dysk ITS lub przez .

    Obiekt konfiguracyjny „role” nadaje zestaw uprawnień do operacji (akcji) na obiektach konfiguracyjnych.

    Rola „Pełne prawa”.

    Jest to po prostu rola (nie predefiniowana), która ma pola wyboru dla wszystkich rodzajów praw na wszystkich obiektach konfiguracyjnych.

    Różni się od innych ról obecnością prawa „Administracja”.

    Jeżeli zostanie utworzony co najmniej jeden użytkownik, system rozpocznie sprawdzanie uprawnień „Administracja” - co najmniej jeden użytkownik musi je posiadać.

    Ogranicz dostęp na poziomie rekordu

    Zabezpieczenia na poziomie wiersza (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 również na poziomie obiektów bazodanowych. Następujące obiekty mogą służyć do ograniczania dostępu do danych:

    • role,
    • opcje sesji,
    • opcje funkcjonalne,
    • uprzywilejowane moduły wspólne,
    • słowo kluczowe DOZWOLONE w języku zapytań.

    Mechanizm ma na celu ograniczenie dostępu do rekordów tabeli obiektów metadanych według dowolnych warunków nałożonych na wartości pól wierszy tych tabel. Na przykład, aby zobaczyć rekordy tylko dla „swoich” kontrahentów, organizacji itp.

    Techniczna realizacja 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 to żądanie jest wysyłane do DBMS, wyodrębnione dane są zwracane do klienta 1C.


    Ten mechanizm zadziała na każde żądanie klienta:

    • w raportach
    • w listach dynamicznych i zwykłych formularzach list
    • w losowych żądaniach.

    Taka implementacja mechanizmu znacznie wpływa na wydajność.

    Sposoby ominięcia ograniczeń dostępu.

    W dużych operacjach wymagających dużej ilości zasobów (na przykład przetwarzanie dokumentów ponownego wysyłania) część kodu można przenieść do uprzywilejowanych modułów.

    A) moduł uprzywilejowany to współdzielony moduł z flagą „Uprzywilejowany” we właściwościach.

    Jego specyfika polega na tym, że zawarty w nim kod jest wykonywany bez żadnej kontroli 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, flag

    • Tryb uprzywilejowany podczas trzymania
    • Tryb uprzywilejowany podczas anulowania harmonogramu


    C) Metoda SetPrivilegedMode()

    Polecenie systemowe, które umożliwia uprzywilejowanie części kodu dowolnego modułu.

    Od następnego wiersza kodu będzie obowiązywał uprzywilejowany tryb wykonywania.

    Będzie działać do linii wyłączenia tego trybu lub do zakończenia procedury/funkcji

    (PRAWDA);

    // dowolny kod tutaj zostanie wykonany bez kontroli uprawnień i RLS

    Ustaw tryb uprzywilejowany(Kłamstwo ); // lub koniec procedury / funkcji

    Liczba aktywacji trybu uprzywilejowanego musi odpowiadać liczbie dezaktywacji. Jeśli jednak tryb uprzywilejowany został włączony (raz lub więcej) wewnątrz procedury lub funkcji, ale nie został wyłączony, system automatycznie zamknie system tyle razy, ile było oczekujących aktywacji w procedurze lub funkcji, która została porzucona.

    Jeśli w procedurze lub funkcji wywołania metody Ustaw tryb uprzywilejowany(Fałsz) więcej niż wykonane wywołania metod Ustaw tryb uprzywilejowany(true), wtedy zostanie zgłoszony wyjątek

    Funkcjonować Tryb uprzywilejowany() zwraca True, jeśli tryb uprzywilejowany jest nadal włączony, i False, jeśli tryb uprzywilejowany jest całkowicie wyłączony. Nie analizuje liczby ustawień trybu uprzywilejowanego w danej funkcji.

    Wszystkie wywoływane procedury i funkcje będą również wykonywane w trybie uprzywilejowanym.


    Możliwe jest również uruchomienie sesji uprzywilejowanej. Jest to sesja, w której tryb uprzywilejowany jest ustawiony od samego początku systemu. W tym samym czasie 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ąć tylko użytkownik z uprawnieniami administratora (prawo Administracja). Sesję można uruchomić za pomocą przełącznika wiersza poleceń do uruchamiania aplikacji klienckiej UsePrivilegedMode lub parametru ciągu połączenia bazy danych prmod .


    Naturalnie pojawia się pytanie: po co w ogóle wprowadzać ograniczenia dostępu, skoro można je tak łatwo ominąć?

    Tryb bezpieczeństwa.

    Tak, możliwe jest zapisywanie zewnętrznego przetwarzania z uprzywilejowanym trybem wykonywania oraz usuwanie/uszkodzenie danych. Aby temu zapobiec, system posiada metodę globalnego kontekstu

    Ustaw tryb awaryjny().

    Tryb awaryjny, między innymi, ignoruje tryb uprzywilejowany.

    Należy go ustawić przed programowym wywołaniem zewnętrznych programów obsługi lub eksportowaniem procedur i funkcji z ich modułów.

    Zgłasza wyjątek podczas wykonywania zabronionych operacji w czasie wykonywania.

    Dodatkowo dla użytkowników można wyłączyć możliwość interaktywnego uruchamiania zewnętrznych raportów i przetwarzania na poziomie ustawień roli.

    Ustawienie ograniczenia dostępu

    RLS można skonfigurować tylko dla uprawnień:

    • czytanie (wybierz)
    • dodawanie (wstawianie)
    • zmiana (aktualizacja)
    • usunięcie (usunięcie)

    Do operacji odczytu i usunięcia, obiekt w bazie danych musi być zgodny z ograniczeniem dostępu do danych.

    Do 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 pasować do obiektu zarówno przed zmianą (aby obiekt był odczytywany), jak i po zmianie (aby obiekt był zapisywany).

    W przypadku wszystkich innych praw ta opcja nie jest dostępna.

    Dodajmy nowe ograniczenie dotyczące prawa do „czytania” podręcznika „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 pól zaznaczonych, ograniczenie zadziała, a jeśli spróbujesz uzyskać dostęp do pól niezaznaczonych, ograniczenie nie zadziała.

    Jeśli wybierzesz flagę Inne pola”, ograniczenie zostanie ustawione dla wszystkich pól tabeli, z wyjątkiem pól, dla których ograniczenia są ustawione jawnie.


    *Funkcja: dla praw do dodawania, zmiany, usuwania:

    • Ograniczenie można skonfigurować tylko dla wszystkich pól.
    • Granica może być tylko jedna.

    Dla prawa „Odczyt” możesz ustawić kilka warunków, zostaną one połączone operatorem logicznym „AND”.

    W ograniczeniach dotyczących obiektów bazy danych następujących typów nie wszystkie pola głównego obiektu danych ograniczenia mogą być używane:

    • w rejestrach akumulacji ograniczenia dostępu mogą zawierać tylko pomiary głównego przedmiotu ograniczenia;
    • w księgach rachunkowych w ograniczeniach można stosować tylko pomiary bilansowe głównego przedmiotu ograniczenia

    Jeżeli w warunkach ograniczonego dostępu do danych rejestru obrotów akumulacji wykorzystywane są pomiary nieuwzględnione w sumach, to przy dostępie do wirtualnej tabeli obrotów nie są wykorzystywane zapisane sumy i zapytanie jest wykonywane całkowicie zgodnie z do stołu ruchu.

    Mechanizm nakładania ograniczeń dostępu.

    Każda operacja na danych przechowywanych w bazie danych w 1C:Enterprise ostatecznie skutkuje uzyskaniem dostępu do bazy danych z żądaniem odczytu lub modyfikacji danych. Podczas wykonywania zapytań do bazy danych wewnętrzne mechanizmy 1C:Enterprise nakładają ograniczenia dostępu. W której:

    • Powstaje lista praw(odczyt, dodawanie, aktualizacja, usuwanie), listę tabel bazy danych oraz listę pól używanych przez to zapytanie.
    • Ze wszystkich ról bieżącego użytkownika wybierz ograniczenia dostępu do danych dla wszystkich praw, tabel i pól objętych żądaniem. Ponadto, jeśli jakakolwiek rola nie zawiera ograniczeń dostępu do danych dowolnej 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, że ​​istnieje ograniczenie WHERE True.
    • Uzyskaj aktualne wartości wszystkich parametrów sesji i opcji funkcjonalnych uczestniczenie w wybranych ograniczeniach.

    Pobranie wartości parametru sesji lub opcji funkcjonalnej nie wymaga od bieżącego użytkownika posiadania uprawnień do uzyskania tej wartości. Jeżeli jednak wartość jakiegoś parametru sesji nie została ustawiona, to wystąpi błąd i zapytanie do bazy danych nie zostanie wykonane.

    Ograniczenia pochodzące z tej samej roli są łączone za pomocą operacji AND.

    Ograniczenia otrzymane z różnych ról są łączone z operacją LUB.

    Skonstruowane warunki są dodawane do zapytań SQL, za pomocą których 1C:Enterprise uzyskuje dostęp do DBMS. Podczas dostępu do danych od strony warunków ograniczenia dostępu nie jest przeprowadzane sprawdzanie uprawnień (ani do obiektów metadanych, ani do obiektów bazy danych). Ponadto mechanizm dodawania warunków zależy od wybranego trybu działania ograniczeń „wszystkie” lub „dozwolone”.


    *Funkcja: Jeżeli użytkownik ma dostęp do kilku ról ze skonfigurowanymi ograniczeniami na poziomie rekordów do jednego obiektu, to w tym przypadku warunki ograniczeń są dodawane przez operację logiczną „LUB”. Innymi słowy, uprawnienia użytkownika kumulują się.

    Prowadzi to do następującego wniosku: nie należy dopuszczać do przekroczenia warunku ograniczenia dostępu do jednego obiektu w różnych rolach, ponieważ w takim przypadku tekst zapytania znacznie się skomplikuje, co wpłynie na wydajność.

    Całą drogę.

    W przypadku nałożenia ograniczeń metodą „wszystko” do zapytań SQL dodawane są warunki i pola, dzięki czemu 1C:Enterprise może uzyskać informacje o tym, czy dane, które są zabronione dla danego użytkownika, zostały użyte w procesie wykonywania zapytania do bazy danych, czy też nie . Jeśli użyto zabronionych danych, żądanie zostanie przerwane z powodu naruszenia zasad dostępu.

    Nakładanie ograniczeń dostępu metodą „wszyscy” schematycznie pokazano na rysunku:


    Metoda „dozwolona”.

    W przypadku nałożenia ograniczeń metodą „dozwoloną” do zapytań SQL dodawane są takie warunki, aby wpisy zabronione dla bieżącego użytkownika nie miały wpływu na wynik zapytania. Innymi słowy, w przypadku nałożenia ograniczeń w trybie „dozwolone”, rekordy zabronione dla tego użytkownika są uważane za brakujące i nie wpływają na wynik operacji, co schematycznie pokazano na rysunku:


    Ograniczenia dostępu do danych są nakładane na obiekty bazy danych, gdy 1C:Enterprise uzyskuje dostęp do bazy danych.

    W wersji klient-serwer 1C:Enterprise na serwerze 1C:Enterprise stosowane są ograniczenia.

    Jednak ta opcja (ALLOWED) nie zadziała, jeśli w zapytaniu odwołujemy się do tabeli, dla której nie skonfigurowano ograniczeń dostępu, ale w której znajdują się odnośniki do wierszy tabeli ze skonfigurowanymi ograniczeniami. W takim przypadku wynikiem zapytania będzie „<Объект не найден>…..." zamiast wartości pola referencyjnego.


    Jeśli opracowujesz raport lub przetwarzasz przy użyciu ogólnych lub niestandardowych zapytań konfiguracyjnych, zawsze sprawdzaj flagę „Dozwolone”. aby raport zadziałał pod dowolnym użytkownikiem z dowolnym zestawem praw.

    W przypadku obiektu odczytującego dane z bazy nie ma możliwości ustawienia flagi „Allowed”. Dlatego jest to konieczne skonfiguruj wybory do odczytu obiektów, biorąc pod uwagę możliwe ograniczenia praw dostępu dla użytkownika. W technologii obiektowej nie ma możliwości pozyskania tylko dozwolonych danych.

    Ważne jest, aby jeśli w zapytaniu nie określono słowa kluczowego ALLOWED, wszystkie filtry określone w tym zapytaniu nie mogły kolidować z żadnymi ograniczeniami dotyczącymi odczytu obiektów bazy danych użytych w zapytaniu. Ponadto, jeśli w zapytaniu używane są tabele wirtualne, to odpowiednie filtry muszą zostać nałożone na same tabele wirtualne.

    Ćwiczenie 1. Konstruktor zapytań w ustawieniach RLS.

    Skomponujmy tekst sekcji „WHERE” w zapytaniu do katalogu. Możesz użyć konstruktora zapytań.
    Konstruktor jest obcięty.


    Zakładka „Tabele”

    Tabela główna będzie tabelą obiektu, dla którego konfigurowane jest ograniczenie.

    Możesz także wybrać inne tabele i ustawić różne relacje między nimi w zakładce „Relacje”.

    Zakładka Warunki

    Tutaj możesz skonfigurować rzeczywiste warunki ograniczenia dostępu.

    Dodajmy warunki dla atrybutu „Cena” katalogu giełdowego na prawo „odczytu” do wszystkich pól tabeli.

    "Nomenklatura GDZIE Nomenklatura. Cena > 500"

    Zobaczmy, jak działa ta prosta zasada. Tabela referencyjna zawiera następujące elementy:


    Po ustawieniu ograniczenia dostępu w tabeli pojawią się tylko elementy spełniające warunek:


    Zniknęły także grupy. Zmień tekst ograniczenia

    "Nomenklatura GDZIE Nomenklatura. Cena > 500

    LUB Nazewnictwo. To jest grupa”

    Cóż, oto czego potrzebujesz.


    Jeśli usuniesz wyświetlanie pola „kod” w ustawieniach listy, zostaną wyświetlone wszystkie elementy katalogu, tj. ograniczenie nie zadziałało. Jeśli ustawisz wyświetlanie pola „Kod”, ograniczenie będzie działać.


    Jednocześnie, mimo że element odnośnika jest widoczny w polu listy, nie można otworzyć jego formularza, ponieważ nastawiono ograniczenie na atrybut. To samo w przypadku dowolnego żądania: przy próbie uzyskania atrybutu „zastrzeżonego” wystąpi błąd dostępu.


    Jeśli spróbujesz programowo uzyskać „ograniczone” rekwizyty, zostanie również zgłoszony błąd dostępu.


    Co więcej, nie będzie można uzyskać dostępu do żadnych pól obiektu przez link, ponieważ po odebraniu linku system odczyta cały obiekt, a jeśli ma „ograniczone” szczegóły, obiekt nie zostanie odczytany.

    Dlatego podczas programowej pracy z obiektami bazy danych należy pamiętać o ewentualnych ograniczeniach na poziomie rekordu i uzyskać wszystkie niezbędne dane obiektu za pomocą zapytania, 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ń - zmienił kolor na szary i pojawiła się ikona.

    Ograniczenia konfiguracji dostępu (RLS).

    • Brak sekcji Podsumowanie;
    • Nie możesz uzyskać dostępu do tablic rejestrów wirtualnych;
    • Nie można jawnie używać parametrów;
    • Podkwerendy mogą używać any>/span> funkcje języka zapytań, z wyjątkiem:
      • operator W HIERARCHII;
      • oferuje WYNIKI;
      • zagnieżdżone wyniki zapytania nie może zawierać części tabelarycznych>/span>;
      • wirtualne stoły, w szczególności Salda i Obroty

    Praktyka 2. Nazewnictwo z aktualną ceną.

    Wprowadź ograniczenie dostępu, jeśli chcesz wyświetlić przedmiot z aktualną ceną wyższą niż określona wartość, na przykład 100.

    Rozwiązanie:

    Dodajemy nową regułę ograniczenia dostępu do podręcznika „Nomenklatura” dla prawa „odczytu”.
    Wybierz „inne pola”.
    W konstruktorze dodaj zagnieżdżone zapytanie. Wybierz w nim tabelę rejestru informacji „Ceny artykułów”.
    Nie ma zakładki „kolejność” - jest to funkcja konstruktora zapytań do budowania zapytania o ograniczenie dostępu.
    W zakładce „Zaawansowane” ustaw „pierwsze 999999999”, pojawiła się zakładka „zamówienie”.
    Ustaw kolejność według pola „Okres” w kolejności malejącej.
    Następnie ustawiamy połączenie tabeli głównej z podzapytaniem przez referencję.


    Szablony ograniczeń dostępu.

    Praktyka 3. Ograniczenie „kontrahentów” przez wartość w stałej.

    Skonfiguruj ograniczenie dostępu do katalogu Kontrahenci według wartości przechowywanej w Stałej.

    Ponadto musisz ustawić ograniczenie dla wszystkich obiektów, które korzystają z katalogu „Kontrahenci” w szczegółach.

    Rozwiązanie

    Dla podręcznika „Konta”, dla prawa „odczyt”, ustawimy ograniczenie, dodając zagnieżdżone zapytanie do stałej w sekcji „Warunki”. Nie zapomnij o tej grupie.

    Widzimy problem, katalog Kontrahenci jest poprawnie filtrowany i wyświetlane są wszystkie dokumenty z atrybutem „Kontrahent”, niektóre z „zepsutymi” linkami w atrybucie „Kontrahent”.

    Teraz musisz skonfigurować ograniczenia dostępu dla wszystkich obiektów za pomocą linku do „Kont”. Znajdźmy je za pomocą usługi „szukaj linków do obiektu”.

    Skopiujmy i nieco zmodyfikujmy tekst warunku RLS z katalogu „Kontrahenci”. Należy to zrobić tyle razy, ile jest znalezionych obiektów.

    Lub użyj wzorca ograniczenia dostępu, aby uniknąć problemów z powielaniem kodu.

    Szablony ograniczeń dostępu są konfigurowane na poziomie roli i mogą być używane dla dowolnego obiektu w ramach edytowanej roli.

    Do szablonu możesz wstawić dowolny fragment tekstu ograniczenia dostępu. Szablon jest wywoływany przez symbol „#”. Na przykład #TemplateContractor.

    Przez # w 1C instrukcje są zapisywane do preprocesora. Platforma w kontekście wykonania ustawień ograniczeń dostępu zastępuje tekst wywołania szablonu tekstem szablonu.

    Przenieśmy tekst po słowie WHERE do szablonu „TemplateContractor”, z wyjątkiem tekstu o ThisGroup.

    Parametry w szablonach ograniczeń dostępu.

    Kontynuujmy rozwiązywanie zadania 2.

    Problem polega teraz na tym, że główna tabela w katalogu nosi nazwę „kontrahent”, w dokumencie „Faktura”. Zaznaczone pole w katalogu nosi nazwę „link”, w dokumencie - „Kontrahent”.

    Zmień nazwę tabeli głównej w tekście szablonu na „#CurrentTable”

    „#CurrentTable” to predefiniowany parametr.

    A przez kropkę wskazujemy numer parametru wejściowego - „.#Parameter(1)

    „#Parametr” jest również predefiniowaną wartością. Może zawierać dowolną liczbę parametrów wejściowych. Są one określane przez numer seryjny.

    W treści ograniczenia dostępu do katalogu wskazujemy, co następuje:

    W przypadku dokumentu:

    „Sprzedaż towarów GDZIE #TemplateContractor(„Kontrahent”)”

    Podczas wywoływania szablonu ograniczeń dostępu parametry należy przekazywać do niego tylko jako String, czyli w cudzysłowie.

    Tabela główna - Nazewnictwo

    Tekst szablonu to:

    #AktualnaTabela GDZIE #AktualnaTabela.#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 znaku „#” może wystąpić:

    • Jedno ze słów kluczowych:
      • Parametr, po którym następuje numer parametru w szablonie w nawiasach;
      • CurrentTable - oznacza wstawienie do tekstu pełnej nazwy tabeli, dla której budowane jest ograniczenie;
      • BieżącaNazwaTabeli– oznacza wstawienie w tekst pełnej nazwy tabeli (jako wartość łańcuchowa, w cudzysłowach), do której odnosi się instrukcja, w aktualnej wersji języka wbudowanego;
      • NazwaAktualne uprawnienie– zawiera nazwę uprawnienia, dla którego wykonywane jest bieżące ograniczenie: ODCZYTAJ/ODCZYTAJ, DODAJ/WSTAW, ZMIEŃ/AKTUALIZUJ, USUŃ/USUŃ;
    • nazwa parametru szablonu – oznacza wstawienie do tekstu ograniczenia odpowiedniego parametru szablonu;
    • symbol „#” – oznacza wstawienie do tekstu pojedynczego znaku „#”.

    Wyrażenie ograniczenia dostępu może zawierać:

    • Wzorzec ograniczenia dostępu, który jest określony w formacie #TemplateName("Wartość parametru szablonu 1", "Wartość parametru szablonu 2",...). Każdy parametr szablonu jest ujęty w podwójne cudzysłowy. Jeśli musisz podać znak podwójnego cudzysłowu w tekście parametru, użyj dwóch podwójnych cudzysłowów.
    • Funkcja StrContains(gdzie szukamy, czego szukamy). Funkcja służy do wyszukiwania wystąpienia ciągu WhatLooking for w ciągu WhereLooking for. Zwraca True, jeśli dopasowanie zostało znalezione, False w przeciwnym razie.
    • Operator + dla konkatenacji łańcuchów.

    Dla wygody edytowania 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ą zestawParametr() lub coś podobnego.

    W tym przypadku parametry to:

    • Opcje sesji
    • Opcje funkcjonalne

    Odczyt parametrów sesji w żądaniu ograniczenia dostępu odbywa się w trybie uprzywilejowanym, tj. bez kontroli uprawnień do operowania nimi.

    Praktyka 4. Dostęp do „swoich” kontrahentów

    Konieczne jest ustawienie ograniczenia dostępu bieżącego użytkownika do „swoich” kontrahentów.

    Istnieje katalog „Użytkownicy”, katalog „Kontrahenci”, dokumenty z wymaganym „Kontrahentem”.

    Aktualny użytkownik powinien widzieć dane tylko dla tych kontrahentów, dla których zostało z nim nawiązane połączenie.

    Należy również skonfigurować komunikację.

    Możliwe opcje:

    Nawiązywanie powiązań użytkownik + kontrahent

    • Szczegóły w katalogu kontrahentów
    • Rejestr informacji

    Możliwe rozwiązania problemu:

    • Przechowywanie użytkownika w stałej jest złym rozwiązaniem, stała jest dostępna dla wszystkich użytkowników.
    • Trzymanie stałej tablicy kontrahentów bieżącego użytkownika w parametrach sesji nie jest dobrym rozwiązaniem, kontrahentów może być wielu
    • Zapisz w parametrach sesji bieżącego użytkownika, a następnie poproś o listę „jego” kontrahentów – dopuszczalna opcja.
    • Inne opcje.

    Rozwiązanie.

    Stwórzmy nowy parametr sesji „CurrentUser” i zapiszmy jego wypełnienie w module session.

    Stwórzmy rejestr informacji „Korespondencja menedżerów i kontrahentów”

    Stwórzmy nową rolę, a w niej nowe ograniczenie dostępu do dokumentu „Faktura Paragonowa”.

    W treści zapytania połączymy tabelę główną z rejestrem informacyjnym przez Kontrahenta = Kontrahenta i Kierownika = &CurrentUser. Rodzaj połączenia Wewnętrzne.

    W miarę możliwości lepiej unikać zagnieżdżonych zapytań 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.

    Sprawdzamy - ograniczenia działają

    * Cecha: W przypadku zmiany listy kontrahentów użytkownika w rejestrze, ograniczenia dostępu zaczną obowiązywać natychmiast, bez restartowania sesji użytkownika.

    Praktyka 5. Brak daty zmiany.

    Konieczne jest wcześniejsze wdrożenie ograniczenia edycji danych niż data ustalona dla zakazu zmian.
    Użytkownicy muszą być ograniczeni.

    Utwórzmy rejestr informacyjny „ChangeBarDateDate” z wymiarem User, RestrictedDate zasób.

    Zbudujmy logikę rozwiązania w ten sposób:

    • jeśli użytkownik nie jest określony, wówczas ban dotyczy wszystkich użytkowników
    • jeśli jest ograniczenie dla wszystkich użytkowników i ograniczenie dla konkretnego użytkownika, to jest ograniczenie dla konkretnego użytkownika, a dla pozostałych według ogólnej zasady.

    Oczywiście taki limit można skonfigurować dla obiektów bazy danych, które mają określoną pozycję na osi czasu. To może być

    • Dokumentacja
    • Okresowe rejestry informacji

    Utwórzmy nową rolę „RestrictionsBy ChangeProhibitionDate”.

    W nim dla dokumentu „Rachunek Faktury” za odpowiednią „zmianę” dodamy nowe ograniczenie dostępu.

    Ustawienie jest określone dla wszystkich pól.

    Tekst ograniczenia to:

    Faktura pokwitowania Z dokumentu Faktura pokwitowania jako faktura Faktura

    ChangeProhibitionDates.ProhibitionDate AS ProhibitionDate
    Z

    POŁĄCZENIE WEWNĘTRZNE (WYBIERZ
    MAXIMUM(ChangeProhibitionDate.User) jako użytkownik
    Z
    Rejestr Informacji Daty Zakazu Zmian JAKO Data Zakazu Zmian
    GDZIE
    (ChangeProhibitionDates.User = &CurrentUser
    ORChangeProhibitionDate.User = VALUE(Reference.users.NullReference))) AS OT_User
    BYChangeProhibitedDate.User = OT_User.User) AS Podzapytanie
    Faktura Faktura.Data > NestedRequest.BanDate

    Sprawdzamy - ograniczenie działa.

    Korzystanie z instrukcji preprocesora

    #Jeśli Warunek1 #Wtedy

    Fragment żądania 1

    #ElseWarunek 2 #Wtedy

    Fragment żądania 2

    #W przeciwnym razie

    Fragment żądania 3

    #KoniecJeśli

    W warunkach można korzystać z operacji logicznych (i. lub, nie, itp.) oraz dostępu do parametrów sesji.

    Takie podejście w kontekście ograniczeń dostępu do budynków jest wygodne, ponieważ w zależności od warunków zostanie skompilowany krótszy tekst zapytania. Prostsze żądanie mniej obciąża system.

    Wadą jest to, że konstruktor zapytań nie będzie działał z takim tekstem.

    * Osobliwość:

    W przeciwieństwie do instrukcji dla preprocesora 1C:Enterprise w tekstach ograniczeń dostępu, poprzedź operatora Then znakiem krzyżyka — #Then

    Ćwicz 6. Przełącz „Użyj RLS”

    Uzupełnijmy nasz system ograniczeń o przełącznik, który włącza/wyłącza korzystanie z ograniczenia na poziomie rekordu.

    Aby to zrobić, dodaj stałą i parametr sesji o nazwie „UseRLS”.

    Wpiszmy w module Session ustawiając wartość parametru sesji z wartości stałej.

    Dodaj następujący kod do wszystkich tekstów ograniczeń dostępu:

    „#Jeśli &UżytkownicyRLS #Wtedy….. #ZakończJeżeli”

    Sprawdzamy - wszystko działa.

    Jednak teraz, po włączeniu flagi „użyj radaru”, zmiany nie zaczną obowiązywać natychmiast. Dlaczego?

    Ponieważ parametr sesji jest ustawiany w momencie rozpoczęcia sesji.

    Możliwe jest zresetowanie parametru sesji podczas zapisywania nowej wartości stałej, ale będzie to działać tylko dla bieżącej sesji użytkownika. Inni użytkownicy muszą zostać poproszeni o ponowne uruchomienie systemu.


    Koniec pierwszej części.

       

    17 zasad kompilowania optymalnego ŻĄDANIA do danych bazy danych 1C

    Do tworzenia i wykonywania zapytań do tabel baz danych na platformie 1C używany jest specjalny obiekt języka programowania. Wniosek. Ten obiekt jest tworzony przez wywołanie konstrukcji Nowa prośba. Wygodne jest użycie zapytania, gdy trzeba uzyskać złożony wybór danych, pogrupowanych i posortowanych w razie potrzeby. Klasycznym przykładem zastosowania zapytania jest uzyskanie podsumowania stanu rejestru akumulacji w określonym momencie. Również mechanizm zapytań ułatwia uzyskiwanie informacji w różnych przedziałach czasowych.

    Tekst żądania jest instrukcją, zgodnie z którą żądanie ma zostać wykonane. Treść żądania opisuje:

    • tabele bazy danych używane jako źródła danych zapytań;
    • pola tabeli, które mają zostać przetworzone w zapytaniu;
    • zasady grupowania;
    • sortowanie wyników;
    • itp.

    Instrukcja jest skompilowana w specjalnym języku - języku zapytań i składa się z oddzielnych części - sekcji, zdań, słów kluczowych, funkcji, operatorów arytmetycznych i logicznych, komentarzy, stałych i parametrów.

    Język zapytań platformy 1C jest bardzo podobny do składni innych języków SQL, ale istnieją różnice. Głównymi zaletami wbudowanego języka zapytań są: dereferencje pól, wirtualne tabele, wygodna praca z sumami, nietypowane pola w zapytaniach.

    Zalecenia dotyczące pisania zapytań do bazy danych w języku zapytań platformy 1C:

    1) Treść żądania może zawierać predefiniowane dane konfiguracyjne, takie jak:

    • wartości wyliczeniowe;
    • predefiniowane dane:
    • katalogi;
    • plany typów cech;
    • plany kont;
    • plany rodzajów obliczeń;
    • puste linki;
    • wartości waypointów procesów biznesowych.

    Ponadto tekst żądania może zawierać systemowe wartości wyliczeniowe, które można przypisać do pól w tabelach bazy danych: AccumulationMotionType, AccountType, AccountingMovementType. Żądania odwołują się do predefiniowanych danych konfiguracyjnych i systemowych wartości wyliczeniowych za pomocą literału typu funkcji WARTOŚĆ. Ten literał poprawia czytelność zapytania i zmniejsza liczbę parametrów zapytania.

    Przykład użycia literału OZNACZAJĄCY:

    • WHERE Miasto = WARTOŚĆ(katalog.Miasta.Moskwa)
    • GDZIE Miasto = WARTOŚĆ(Referencja.Miasto.PusteReferencja)
    • WHEREItemType = WARTOŚĆ(Wyliczenie.TypyProduktu.Usługa)
    • WHEREMMovementType = VALUE(MovementTypeAccumulation.Income)
    • WHERE RoutePoint = WARTOŚĆ (Proces Biznesowy. Proces Biznesowy 1. Punkt Trasy. Akcja 1

    2) Korzystanie z instrukcji AUTOMATYCZNE ZAMÓWIENIE w zapytaniu czas wykonania zapytania może być bardzo długi, więc jeśli sortowanie nie jest wymagane, to lepiej go w ogóle nie używać. W większości przypadków najlepszym sposobem zastosowania sortowania jest instrukcja SORTUJ WEDŁUG.

    Automatyczne układanie działa według następujących zasad:

    • Jeżeli w zapytaniu podano klauzulę ORDER BY, to każde odwołanie do tabeli w tej klauzuli zostanie zastąpione polami, po których domyślnie sortowana jest tabela (w przypadku katalogów jest to kod lub nazwa, w przypadku dokumentów data dokumentu). Jeżeli pole porządkujące odnosi się do katalogu hierarchicznego, to zastosowane zostanie sortowanie hierarchiczne według tego katalogu.
    • Jeśli w zapytaniu nie ma klauzuli ORDER BY, ale jest klauzula TOTALS, to wynik zapytania zostanie posortowany według pól znajdujących się w klauzuli RESULTS po słowie kluczowym BY, w tej samej kolejności, a jeśli sumy zostały obliczone przez pola - łącza, następnie według pól sortowania domyślnie tabel, do których się odwoływano.
    • Jeżeli w zapytaniu nie ma klauzul ORDER BY i TOTAL, ale występuje klauzula GROUP BY, to wynik zapytania zostanie posortowany według pól występujących w zdaniu w tej samej kolejności, a jeśli grupowanie zostało przeprowadzone według pól - linków, a następnie domyślnie sortuje tabele pól, do których się odwoływano.
    • Jeśli zapytanie nie zawiera klauzul ORDER BY, TOTAL i GROUP BY, wynik zostanie uporządkowany według domyślnych pól sortowania dla tabel, z których wybierane są dane, w kolejności, w jakiej pojawiają się w zapytaniu.
    • Jeśli zapytanie zawiera klauzulę TOTAL, każdy poziom sum jest porządkowany oddzielnie.

    3) Aby uniknąć ponownego zapytania do bazy danych podczas wyświetlania użytkownikowi wyniku zapytania (na przykład podczas tworzenia zapytania lub wyświetlania wyniku zapytania za pomocą dokumentu arkusza kalkulacyjnego), warto użyć instrukcji LINKI DO PREZENTACJI A, który pozwala uzyskać reprezentację wartości odniesienia. Przykład:

    Możliwe jest również skorzystanie z instrukcji WYDAJNOŚĆ- zaprojektowany, aby uzyskać łańcuchową reprezentację wartości dowolnego typu. Różnica między tymi instrukcjami polega na tym, że w pierwszym przypadku, jeśli instrukcje przekażą referencję, wynikiem będzie łańcuch, w innych przypadkach wynikiem będzie wartość przekazanego parametru. W drugim przypadku wynikiem instrukcji zawsze będzie napis!

    4) Jeżeli zapytanie zawiera pole o typie złożonym, to dla takich pól konieczne staje się rzutowanie wartości pól na określony typ za pomocą instrukcji WYRAZIĆ, co pozwoli usunąć zbędne tabele z lewego połączenia z polem o złożonym typie danych i przyspieszyć zapytanie. Przykład:

    Istnieje rejestr gromadzenia Pozostałości towarów, w którym pole Rejestrator ma typ złożony. We wniosku wybierane są Data i Numer dokumentów PZ, natomiast dostęp do szczegółów dokumentu poprzez pole Rejestrator nie powoduje wielu lewych powiązań tabeli rejestru akumulacji z tabelami dokumentów ewidencyjnych.

    Kod 1C v 8.x WYBIERZ
    EXPRESS (pozostałości towarów. Rejestrator AS Dokument. Odbiór towarów). Numer AS Numer paragonu,
    EXPRESS (pozostałości towaru. Rejestrator AS Dokument. Odbiór towarów). Data AS Data odbioru
    Z
    Rejestr Kumulacyjny. Pozostałości Towarowe AS Pozostałości Towarowe

    Jeśli rzutowanie jest uważane za niewykonalne, wynikiem rzutowania jest wartość ZERO.

    5) Nie zapomnij o instrukcjach DOZWOLONY, co oznacza, że ​​zapytanie wybierze tylko te rekordy, do których bieżący użytkownik ma uprawnienia. Jeśli to słowo nie zostanie podane, to w przypadku, gdy zapytanie wybierze rekordy, do których użytkownik nie ma uprawnień, zapytanie zadziała z błędem.

    6) Jeżeli zapytanie wykorzystuje unię, aw niektórych częściach unii znajdują się zagnieżdżone tabele (dokument z częścią tabelaryczną), aw niektórych nie ma potrzeby uzupełniania listy wyboru polami - puste tabele zagnieżdżone. Odbywa się to za pomocą słowa kluczowego PUSTY STÓŁ, po czym aliasy pól, z których będzie się składać tabela zagnieżdżona, są podane w nawiasach. Przykład:

    Kod 1C v 8.x // Wybierz pola Liczba i Skład
    // z wirtualnej tabeli Document.Invoice
    WYBIERZ Numer referencyjny, PUSTA TABELA.(Nom, Tov, Ilość) JAKO SKŁAD
    Z Dokument.Faktura
    ZJEDNOCZCIE WSZYSTKICH
    SELECT Link.Numer, Skład.(LiniaNumer, Produkt, Ilość)
    Z Dokument.Faktura Dokument.Faktura.Skład.*

    7) Aby uniknąć powielania linii w wyniku zapytania, należy skorzystać z instrukcji RÓŻNY, bo jest coraz wyraźniej i instrukcja GRUPUJ WEDŁUG służy do grupowania przy użyciu funkcji agregujących. Nawiasem mówiąc, podczas korzystania z funkcji agregujących zdanie GRUPUJ WEDŁUG może w ogóle nie zostać określony, podczas gdy wszystkie wyniki zapytania zostaną zgrupowane w jednym wierszu. Przykład:

    Kod 1C v 8.x // Konieczne jest ustalenie, którzy kontrahenci
    // towary zostały wysłane w okresie.
    Wybierz Różne
    Dokument.Faktura.Kontrahent

    8) Instrukcja GRUPUJ WEDŁUG umożliwia dostęp do pól najwyższego poziomu bez grupowania wyników według tych pól, jeśli funkcje agregujące są stosowane do pól zagnieżdżonej tabeli. Chociaż jest to napisane w pomocy 1C, podczas grupowania wyników zapytania funkcje agregujące muszą być wskazane na liście pól wyboru, a oprócz funkcji agregujących na liście wyboru można wskazać tylko pola, według których przeprowadzane jest grupowanie pola. Przykład:

    Kod 1C v 8.x WYBIERZ
    Odbiór towarów i usług Towary (SUMA (ilość), nomenklatura),
    Odbiór Towarów i Usług Link,
    Odbiór towarów i usług Kontrahent
    Z
    Dokument Odbiór towarów i usług AS Odbiór towarów i usług
    GRUPUJ WEDŁUG
    Odbiór towarów i usług Towary (Nomenklatura)

    9) Instrukcja JEST NULL mający na celu zastąpienie wartości ZERO na inną wartość, ale nie zapominaj, że drugi parametr zostanie przekonwertowany na typ pierwszego, jeśli typem pierwszego parametru jest ciąg znaków lub liczba.

    10) Odnosząc się do tabeli głównej, możesz odwołać się do danych tabeli podrzędnej w warunku. Ta funkcja jest nazywana dereferencją pól tabeli podrzędnej.

    Przykład (wyszukiwanie dokumentów zawierających określony produkt w sekcji tabelarycznej):

    Zaletą tego zapytania w stosunku do zapytania w podtabeli Przychodzące.Towary jest to, że jeśli w dokumentach występują duplikaty, wynik zapytania zwróci tylko unikalne dokumenty bez użycia słowa kluczowego DISTINCT.

    11) Ciekawym wariantem operatora B jest sprawdzenie występowania uporządkowanego zbioru w zbiorze takich zbiorów (Pole1, Pole2, ... , PoleN) B (Pole1, Pole2, ... , PoleN).

    Kod 1C v 8.x WYBIERZ
    Wykonawcy. Link
    GDZIE
    (Kontrahenci.Link, Towary.Link)
    (WYBIERZ Sprzedaż.Klient, Sprzedaż.Produkt
    Z Rejestru akumulacji Sprzedaż AS Sprzedaż)
    Z
    Katalog Kontrahenci,
    Katalog.Produkty

    12) W miarę możliwości używaj wirtualnych tabel zapytań. Podczas tworzenia zapytania system udostępnia jako źródła danych szereg wirtualnych tabel – są to tabele będące jednocześnie wynikiem zapytania, które system generuje w momencie wykonania odpowiedniej sekcji kodu.

    Deweloper może samodzielnie pozyskać te same dane, które dostarcza mu system w postaci wirtualnych tabel, jednak algorytm pozyskiwania tych danych nie zostanie zoptymalizowany, ponieważ:

    Wszystkie wirtualne tabele są sparametryzowane, tzn. programista ma możliwość ustawienia pewnych parametrów, których system użyje podczas generowania żądania utworzenia wirtualnej tabeli. W zależności od tego, jakie parametry wirtualnej tabeli określi programista, system może ją wygenerować RÓŻNY zapytań, aby uzyskać tę samą wirtualną tabelę i zostaną zoptymalizowane pod kątem przekazywanych parametrów.

    Nie zawsze programista ma możliwość uzyskania dostępu do danych, do których ma dostęp system.

    13) W trybie pracy klient-serwer funkcja PODŁAŃCUCH() realizowane za pomocą funkcji SUBSTRING() odpowiedniej instrukcji SQL przekazywanej do serwera bazy danych SQL Server, który oblicza typ wyniku funkcji SUBSTRING() według złożonych reguł zależnych od typu i wartości jej parametrów, a także w zależności od kontekstu, w jakim jest używany. W większości przypadków te reguły nie mają wpływu na wykonanie zapytania, ale są przypadki, w których maksymalna długość ciągu wynikowego obliczona przez SQL Server jest niezbędna do wykonania zapytania. Należy pamiętać, że w niektórych kontekstach podczas korzystania z funkcji SUBSTRING() maksymalna długość jej wyniku może być równa maksymalnej długości łańcucha o ograniczonej długości, który w SQL Server wynosi 4000 znaków. Może to prowadzić do nieoczekiwanej awarii podczas wykonywania zapytania:

    Dostawca Microsoft OLE DB dla programu SQL Server: Ostrzeżenie: Procesor kwerend nie może utworzyć planu kwerend z optymalizatora, ponieważ łączna długość wszystkich kolumn w klauzuli GROUP BY lub ORDER BY przekracza 8000 bajtów.

    HRESULT=80040E14, SQLSTATE=42000, rodzimy=8618

    14) Używaj ostrożnie LUB w budowie GDZIE, ponieważ użycie warunku z LUB może znacznie „obciążyć” zapytanie. Problem można rozwiązać za pomocą projektu ZJEDNOCZCIE WSZYSTKICH. Przykład:

    Kod 1C v 8.x WYBIERZ

    Z

    GDZIE
    _DemoContractors.Link =Link1
    ZJEDNOCZCIE WSZYSTKICH
    WYBIERAĆ
    _Demo Kontrahenci.NazwaPełna
    Z
    Directory._DemoContractors JAK _DemoContractors
    GDZIE
    _DemoContractors.Link =Link2

    15) Stan NIE W w budowie GDZIE zwiększa czas wykonania żądania, ponieważ jest to swego rodzaju NIE (LUB1 LUB2 ... LUBn), więc w przypadku dużych tabel spróbuj użyć LEFT JOIN z warunkiem IS NULL. Przykład:

    Kod 1C v 8.x WYBIERZ
    _DemoContractors.Link
    Z
    Directory._DemoContractors JAK _DemoContractors
    LEFT JOIN Document._DemoBuyerOrder AS _DemoBuyerOrder
    Oprogramowanie _DemoContractors.Link = _BuyerDemoOrder.Contractor
    GDZIE
    _Demonstracyjne zamówienie kupującego. Kontrahent ma wartość NULL

    16) Podczas używania Stoły tymczasowe musisz zindeksować warunek i połączyć pola w tych tabelach, ALE podczas korzystania z indeksów zapytanie może działać jeszcze wolniej. Dlatego konieczne jest przeanalizowanie każdego zapytania z indeksem i bez niego, zmierzenie szybkości wykonania zapytania i podjęcie ostatecznej decyzji.

    Jeśli umieścisz dane w tabeli tymczasowej, która jest początkowo indeksowana w niektórych polach, nie będzie już indeksu tych pól w tabeli tymczasowej.

    17) Jeśli nie używasz Menedżer tabeli tymczasowej, to nie ma potrzeby jawnego usuwania tabeli tymczasowej, zostanie ona usunięta po zakończeniu wykonania zapytania wsadowego, w przeciwnym razie należy usunąć tabelę tymczasową w jeden z następujących sposobów: poleceniem ZNISZCZYĆ w żądaniu wywołaj metodę Menedżer tabel tymczasowych. Zamknij ().

    A oprócz wideo od Evgeny Gilev: Typowe błędy podczas pisania próśb o 1C:

    Podobne artykuły