Korzystanie z mechanizmu udostępniania danych zamiast RLS. Korzystanie z mechanizmu udostępniania danych zamiast udostępniania danych RLS 1c

Atrybut współdzielony to atrybut dodawany do kilku obiektów konfiguracyjnych i może być również używany jako część specjalnego mechanizmu współdzielenia danych:

  • Wspólne rekwizyty dla wielu obiektów. Atrybut obecny w kilku obiektach konfiguracyjnych, w których ten atrybut zachowuje swoje znaczenie i typ. Przykład takiego zastosowania: atrybut „Organizacja” w regulowanych dokumentach księgowych w rozwiązaniu aplikacyjnym
  • Wspólny rekwizyt jako integralna część specjalnego mechanizmu udostępniania danych. Mechanizm ten pozwala na rozdzielenie pracy zastosowanego rozwiązania i wszystkich przechowywanych danych na osobne części. Jednocześnie dla wspólnego atrybutu włączona jest separacja danych.
    Przykład takiego zastosowania: W jednej fizycznej infobazie różni „właściciele” danych pracują niezależnie, natomiast każdy użytkownik takiego rozwiązania aplikacyjnego będzie miał dostęp tylko do swoich danych

Właściwość „separacja danych” wspólnego atrybutu

Jeśli ta właściwość jest ustawiona na "Nie używaj", to utworzony obiekt konfiguracyjny będzie używany tylko jako podpora będąca częścią kilku obiektów konfiguracyjnych.
Jeśli właściwość jest ustawiona na „Separate”, wspólny atrybut będzie używany jako separator danych

Kompozycja przedmiotów

Właściwość „Content” wspólnego atrybutu określa listę obiektów konfiguracyjnych, które zawierają ten wspólny atrybut.
Jeśli właściwość „Automatyczne użycie” jest ustawiona na „Nie używaj”, automatyczne dodawanie atrybut nie wystąpi, a aby wybrać obiekty, w których chcesz zawrzeć wspólny atrybut, należy użyć właściwości „Kompozycja”.
Również właściwość "Kompozycja" powinna być używana, jeśli podczas automatycznego użycia wspólnego atrybutu istnieją obiekty, w których wspólny atrybut nie powinien występować.

Korzystanie ze wspólnego rekwizytu

Dla każdego obiektu konfiguracyjnego kolumna Użycie może przyjąć jedną z trzech wartości:
  • Automatyczny – oznacza, że ​​przypisanie obiektu konfiguracyjnego do wspólnego atrybutu zależy od wartości właściwości „Auto-use”
  • Użyj - oznacza, że ​​obiekt konfiguracyjny jest częścią atrybutu ogólnego
  • Nie używaj - oznacza, że ​​obiekt konfiguracyjny nie jest częścią atrybutu ogólnego
Dzięki temu za pomocą edytora właściwości „Kompozycja” można selektywnie wykluczać niektóre obiekty z kompozycji wspólnego atrybutu, mimo że ustawiono dla niego „Auto-użycie”.

Obiekty konfiguracyjne

Wspólny atrybut (nie w trybie udostępniania danych) może zawierać następujące obiekty konfiguracyjne:
  • Leksykony
  • Dokumentacja
  • Dzienniki dokumentów
  • Plany typów charakterystyk
  • Plany obliczeniowe
  • Procesy biznesowe
  • Zadania
  • Rejestry informacyjne
  • Rejestry akumulacyjne
  • Rejestry księgowe
  • Plany wymiany
  • Zewnętrzne źródła danych

Osobliwości

Podczas pisania dokumentu ogólnemu atrybutowi czasopisma przypisywana jest wartość ogólnego atrybutu dokumentu lub NULL, jeśli dokument nie jest częścią ogólnego atrybutu
Atrybut general może być używany w ograniczeniach dostępu do danych. Włączać źródeł zewnętrznych dane do wspólnego atrybutu ma sens w przypadku, gdy wspólny atrybut jest separatorem.

RADA! Atrybutów ogólnych nie należy używać do opisywania danych, które są częścią logiki biznesowej określonych obiektów.

Kiedyś omówiliśmy mechanizmy ograniczania dostępu użytkowników w 1C, a w szczególności.

Pozwala na umożliwienie użytkownikowi pracy nie ze wszystkimi dokumentami, a tylko z tymi, w których wskazana jest konkretna organizacja lub magazyn. Selekcje dokonywane są dynamicznie, przez co obciążają bazę danych w pewnym stopniu.

Właściwość wspólnego separatora atrybutów - Separacja użytkowników 1C - pozwala ustawić dostępność listy użytkowników w zależności od użycia separatorów.

Jeśli separator jest włączony dla użytkownika, będzie widoczny na liście użytkowników w trybie 1C Enterprise - w przeciwnym razie nie będzie widoczny.

W ten sposób możesz organizować różne listy użytkowników dla różnych części bazy danych.

Właściwość wspólnego separatora atrybutów - Separacja uwierzytelniania 1C - pozwala tworzyć użytkowników o tych samych nazwach użytkowników dla różnych części bazy danych.

Podział warunkowy 1C

Separacja warunkowa 1C umożliwia włączanie i wyłączanie separatora na podstawie danych z bazy danych. W ten sposób możliwe jest tworzenie łańcuchów ograniczników zależnych od siebie, działających dynamicznie w takim czy innym przypadku.

Aby włączyć warunkową separację 1C - musisz określić we właściwości ogólnego atrybutu-separatora - Warunkowy podział 1C - który będzie odpowiedzialny za określenie, czy podział 1C jest włączony.

Możliwe jest użycie stałej o typie boolowskim lub atrybutu referencyjnego o typie boolowskim.

Ważne - musisz wyłączyć używanie tej stałej / tej książki informacyjnej (wybierz Nie używaj) jako części separatorów, tylko wtedy można ją wybrać.

Rekwizyty ogólne w 1C 8.3 to obiekt metadanych platformy, który pozwala na użycie jednego atrybutu dla wielu obiektów konfiguracyjnych (katalogi, dokumenty, plany kont itp.). Obiekt powstał głównie w celu ułatwienia pracy dewelopera i separacji danych.

Ogólne szczegóły zostały pierwotnie zaimplementowane w wersji 1C 7.7, ale programiści nie od razu włączyli ją do platformy 8 wersji. Mechanizm wspólnych szczegółów został wprowadzony przez programistów 1C dopiero w wersji 8.2.14.

Atrybuty ogólne są bardzo wygodne do dodania, aby nie zmieniać standardowych obiektów w konfiguracji, często używam ich razem z .

Po dodaniu wspólnego atrybutu można go używać w zapytaniach i wyświetlać w postaci obiektów − na zewnątrz nie różni się niczym od zwykłych rekwizytów.

Jedynym ograniczeniem wspólnych atrybutów jest to, że nie można ich używać w programie .

Rozważmy główne ustawienia i właściwości wspólnych atrybutów, które różnią się od innych obiektów konfiguracyjnych:

Pogarszać— lista obiektów, dla których będzie używany wspólny atrybut, ustawienie przypomina ustawienie planu wymiany.

Uzyskaj 267 lekcji wideo 1C za darmo:

Automatyczne użycie— ustawienie określa, czy wspólny atrybut będzie używany dla tych obiektów, które mają określony w kompozycji tryb użycia „Automatyczny”.

Separacja danych Rozważymy to ustawienie osobno.

Separacja danych w 1C za pomocą wspólnego atrybutu

Separacja danych- mechanizm podobny do mechanizmu. Jednak działanie tego mechanizmu jest wydajniejsze i łatwiejsze do skonfigurowania.

Mechanizm pozwala skonfigurować wyświetlanie tylko tych elementów, które użytkownik widzi. Na przykład można rozróżnić wszystkie obiekty (dokumenty, katalogi itp.), w których zainstalowano określoną organizację.

Konfigurowanie separacji danych przy użyciu typowych szczegółów 1C

Aby ustawić w atrybucie ogólnym, musisz określić separację danych − Dzielić. Natychmiast po kliknięciu system poprosi o utworzenie domyślnych parametrów księgowych:

W takim przypadku konieczne będzie określenie parametrów sesji podczas uruchamiania systemu, jak to zrobić, na przykładzie zostało to opisane w artykule.

Na tym kończy się ustawianie - użytkownik będzie miał dostęp tylko do informacji określonych w wybranych parametrach sesji.

Przykład użycia wspólnego atrybutu

Przeanalizujmy ustawienie ogólnych rekwizytów w 1C 8.3 na przykładzie konfiguracji szkieletowej i rekwizytów Organizacja:

W systemie znajdują się 3 dokumenty, w których należy wskazać wymaganą Organizację: są to Faktura Faktura, Faktura Wydatków, Lista Płac.

Konfiguracja jest prosta:

  1. Utwórz nowy atrybut Ogólne, określ typ — DirectoryLink.Organization.
  2. W składzie aranżujemy nasze dokumenty - Posługiwać się.

Wszystko, konfiguracja się skończyła!

Zobaczmy wynik:

System wyświetla wspólny atrybut „jako własny”: zarówno w żądaniach, jak iw atrybutach formularzy oraz w innych miejscach. To taka magia!

Ogólne rekwizyty 1C 8.3 nie są dodawane

1. Wstęp.

Zaistniała potrzeba zorganizowania księgowości dla dwóch organizacji w jednej IP. Sytuacja nie jest wyjątkowa, ale tak się złożyło, że nasz bardzo nietypowy 250 GB UPP działał dość wolno, więc zamiast RLS postanowiliśmy spróbować separacji danych. Co to jest opisane, na przykład lub. Krótko mówiąc, jeśli RLS uzupełnia warunki Zapytania SQL, wtedy separatorem danych jest dodatkowa kolumna w tabelach na poziomie DBMS, dzięki czemu mechanizm separacji powinien działać szybciej niż RLS.

Tak więc w bazie danych, w której przechowywano zapisy dla LLC nr 1, konieczne jest przeniesienie informacji z oddzielnej bazy danych LLC nr 2 i zorganizowanie wspólna praca. Tak jak na zdjęciu:

Zwykli śmiertelnicy pracują tylko ze swoją LLC, a główny księgowy czasami przegląda dane dotyczące dwóch podmiotów prawnych. W trybie dostępu do obu LLC można tylko odczytywać dane, więc główny księgowy powinien mieć możliwość interaktywnego przełączania się między trybami „odczytaj wszystko” / „zapis tylko dla jednej organizacji” i wybrać LLC (tzn. ustawić wartość wspólny atrybut) do przeprowadzenia np. kalkulacji kosztów.

2. Wdrożenie

Platforma 8.2.19.90, brak trybu zgodności. DBMS - Standard MSSQL Server 2008 R2.

Stworzyliśmy wspólny atrybut Organizacyjny Separator typu „liczba”, zgodził się z propozycją stworzenia parametrów sesji, uzupełniony składem atrybutu (zawarto kilka katalogów, wszystkie dokumenty, rejestry akumulacyjne, księgowe i kalkulacyjne). Separacja danych – „Samodzielnie i wspólnie”. Wartość parametru sesji jest ustawiana od Ustawienia domyślne użytkownika w procedurze SetSessionParameters w module sesji:

Organizacja = UserManagement.GetDefaultValue(glCurrentUser,"MainOrganization");
SessionParameters.OrgDelimiterValue = Organizacja.DelimiterValue;

W interfejsie głównego księgowego powstał formularz z możliwością przełączania między organizacjami oraz włączania/wyłączania trybu separacji:

Z wyłączonym podziałem, gdy SessionParameters.OrganizationSeparatorUsage = False, platforma odmawia pisania dokumentów, wyrzucając błędy, takie jak „Błąd SDBL: oczekiwane wyrażenie (pos=12)”, więc nie możesz pozwolić użytkownikowi na pisanie dokumentów w tej opcji. Dla niezawodności utworzyliśmy subskrypcje zdarzenia „Przed nagraniem” dla obiektów, które są częścią wspólnego atrybutu:

Jeśli SessionParameters.OrgDelimiterUse = False, to
#Jeśli klient, to
Warning("Nie można pisać, ponieważ udostępnianie danych jest wyłączone!");
#Koniec, jeśli
Odrzucenie = prawda;
EndIf;

Nasz plan działania był następujący: przygotowujemy konfigurację odbiornika IB nr 1, wpisujemy wartości wspólnego atrybutu = 1, ładujemy dane z IB nr 2, po załadowaniu dla wszystkich obiektów z pustym (równym 0) wartość separatora, ustaw separator organizacji = 2.

Konfiguracja została przygotowana, pojawiło się pytanie, jak ustawić wartość wspólnego atrybutu dla dokumentów i ich ruchów w zamkniętych okresach, szybko i bez ryzyka, że ​​liczby na saldzie będą latać? Przez model obiektowy 1C, nie da się napisać separatora oddzielnie od obiektu, więc musiałem zerwać umowę licencyjną, aby wyjść i napisać zapytanie dla MS SQL. Ponieważ wspólny atrybut zawiera wiele obiektów, a w kości policzkowej tych obiektów jest jeszcze więcej tabel, napisaliśmy przetwarzanie, które generuje zapytanie dla SQL (dla każdego obiektu metadanych, który jest częścią separatora, napisaliśmy „update” + DB_name + ".dbo._" + TableName + " set _" + Field GeneralAttribute + " = 1";)

Wartość została ustawiona, część danych została przeniesiona z IB nr 2 i rozpoczęto testowanie.

Wynik był rozczarowujący. Po pierwsze problemy z księgą rachunkową. Gdy separacja jest włączona, analityka nie jest widoczna:

Wynika to z faktu, że rejestr księgowy na poziomie SZBD przechowywany jest w postaci kilku tabel, a nie wszystkie tabele posiadały wartość atrybutu wspólnego (do podglądu struktury wykorzystano przetwarzanie).


Cóż, wpisujemy wartość separatora przez MS SQL, widzimy analitykę. Teraz raporty nie działają. Okazuje się, że występują problemy z zapytaniami do wirtualnych tabel rejestru księgowego „Obrót” i „ObrótDtKt”:

(Fld27033 jest po prostu powszechnym atrybutem w tabeli rejestru księgowego)

Separator jest ustawiony we wszystkich tabelach, widać to na poziomie DBMS, co może być błędem, nie jest jasne. Wdrażamy typowy pusty SCP, dokonujemy opisanych powyżej zmian konfiguracyjnych, wprowadzamy kilka dokumentów (w tej opcji sama platforma umieszcza wartość separatora we wszystkich tabelach rejestru księgowego), ale powtarzają się błędy. Źle, ale wyłączamy rejestry księgowe z wymagań ogólnych, kontynuujemy testowanie.

Ponadto okazuje się, że przestał działać mechanizm przemieszczania rejestrów obliczeniowych. Nie rozdzielaliśmy planów dla rodzajów obliczeń, staramy się szukać problemu w tabelach rejestru obliczeń iw przeliczeniach. Sprawdzamy, odkładamy wartość głównego atrybutu, robimy T&I - bezskutecznie.

Po drodze diagnozujemy problem przy zapisywaniu informacji do niezależnych rejestrów z formularza listy. W takim przypadku dane są rejestrowane, można je zobaczyć po ponownym uruchomieniu. Problem jest odtwarzany na bazie testowej:


Rejestry informacyjne nie mogły być "naprawione" przez manipulację SQL (wartość separatora jest ustawiona we wszystkich tabelach), więc zostały po prostu wyłączone z atrybutu general. Po kilku dniach eksperymentów, próby przywrócenia zdolności do pracy wysiedlenia również kończą się niepowodzeniem.

W tym momencie postanawiamy wyłączyć udostępnianie danych i nadal korzystać z RLS. Podczas ustawiania podziału na „nie używaj” napotykamy błędy „Dostawca Microsoft OLE DB dla SQL Server: CREATE UNIQUE INDEX został zakończony, ponieważ znaleziono zduplikowany klucz dla indeksu...”. Oznacza to, że powrót do stanu sprzed separacji nie jest tak łatwy. Problem z indeksami tabel przeliczeniowych, ustawieniami przechowywania sum i innymi. Faktem jest, że tabele przechowują identyczne wiersze, które różnią się tylko wartością wspólnego atrybutu. Podczas usuwania wspólnego atrybutu pojawiają się nieunikalne wpisy. Będziesz musiał usunąć niepotrzebne rekordy bezpośrednio w MS SQL, coś takiego (dla tabeli przeliczeń):

użyj bazy;
ALTER TABLE_CRgRecalc1399
DODAJ identyfikator INT IDENTITY(1,1);
IŚĆ
USUŃ Z_CRgRecalc1399
GDZIE id< (SELECT MAX(id)
OD _CRgRecalc1399 JAKO T1
WHERE _CRgRecalc1399._RecorderTRef = T1._RecorderTRef i
_CRgRecalc1399.[_RecorderRRef] = T1.[_RecorderRRef] i
_CRgRecalc1399.[_CalcKindRRef] = T1.[_CalcKindRRef] i
_CRgRecalc1399.[_Fld1400RRef] = T1.[_Fld1400RRef] i
_CRgRecalc1399.[_Fld1401RRef] = T1.[_Fld1401RRef] i
_CRgRecalc1399.[_Fld1402RRef] = T1.[_Fld1402RRef]
);
IŚĆ
ALTER TABLE_CRgRecalc1399
DROP COLUMN id;

I dopiero po wyczyszczeniu kilkudziesięciu tabel można wyłączyć partycjonowanie danych. Po wyłączeniu separacji nie ma problemów.

3. Wnioski.

Istniała nadzieja, że ​​problemy 8.3 zostały rozwiązane. Nie byliśmy zbyt leniwi, sprawdziliśmy na 8.3.4.482 (z wyłączonym trybem zgodności). Przyjrzeliśmy się niemal typowemu SCP-shke, ze zmianami w konfiguracji tylko dla ogólnych rekwizytów. Na tej podstawie testowej podział został włączony przed wprowadzeniem informacji, tj. platforma musiała poprawnie wpisać wartość separatora do wszystkich tabel, samodzielnie nie zapisywała niczego bezpośrednio do MS SQL.

Wynik:

    Odwzorowany został problem z zapytaniami do wirtualnych tabel „Obrót” i „ObrótDtKt”.

    Problem wywłaszczania jest powtarzalny.

    Odtwarzany jest problem z zapisem do niezależnych rejestrów informacyjnych.

    Problem z wyłączeniem separacji - nie uda się jej pozbyć jednym kliknięciem przycisku!

Tym samym nie udało nam się zastąpić RLS nowym mechanizmem. Mechanizm ten został najwyraźniej wymyślony dla usługi w chmurze, a w przypadku korzystania ze współdzielonych danych „niezależnie” może podział zadziała, ale potrzebujemy wspólnego NSI. Dopiero okaże się, kiedy 1C poprawi błędy, a jeszcze lepiej, zaimplementuje typowy mechanizm dzielenia przez organizacje w standardowych konfiguracjach.

W poprzednim artykule dodaliśmy wspólny atrybut do wszystkich katalogów naszej konfiguracji, aby wiedzieć, kto utworzył ten obiekt katalogu. Teraz utworzymy subskrypcję na wydarzenie i określimy, jakie informacje wypełnić w tym atrybucie.

W tym rankingu każdorazowo przed nagraniem obiektu będziemy prowadzić korespondencję z autorem obiektu, wskazane jest oczywiście wskazanie, a kiedy to nastąpi, dodamy również autorowi datę nagrania.

Procedura eksportu autozapisu przed zapisem (źródło, odrzucenie) // Wklej do próbnika.Źródło. AutorObject = NazwaUżytkownika() + " ; " + ciąg (bieżąca data() ) ; EndProcedure

Doskonale. Zastanówmy się teraz, gdzie jeszcze możesz użyć ogólnych szczegółów?

Po pierwsze, za pomocą ogólnych szczegółów możesz dodać atrybut „Komentarz”, atrybut „autor”, a także inne potrzebne szczegóły do ​​wszystkich dokumentów w konfiguracji.

Udostępnione rekwizyty mają jeszcze jeden interesujący parametr ” Separacja danych. Mechanizm ten pozwala nam zdefiniować dane, które chcemy pokazać użytkownikowi. Na przykład, aby żaden z menedżerów nie znał wszystkich klientów firmy, pokażemy mu tylko tych klientów, których wprowadził do bazy danych, z którymi współpracuje. Spróbujmy dodać tę funkcjonalność do bazy danych. Na początek będziemy musieli wskazać, że użyjemy partycjonowania danych, system automatycznie zaproponuje utworzenie domyślnych parametrów sesji.

Następnie pozostaje nam tylko ustawić parametry sesji w module sesji:

Podajmy przykład jak wygląda katalog kontrahentów bez użycia „Separacji danych” i z nią:

Brak separacji

Podział

Należy pamiętać, że atrybut „Odpowiedzialny” nie został znaleziony u pierwszego kontrahenta, ponieważ autorem tego atrybutu był ktoś inny.

Klasycznym przykładem rozdzielenia księgowości jest organizacja, pokazująca użytkownikom tylko te dokumenty, które odnoszą się do odpowiedniej organizacji.

Wykorzystaliśmy mechanizm parametrów sesji, zrozummy pokrótce, co to jest. Zasadniczo parametry sesji są zmiennymi globalnymi, które są ustawiane podczas uruchamiania systemu. Zwykle dzieje się to w „module sesji”, zauważ, że parametry sesji są tworzone czysto programistycznie.

Po ustawieniu „Parametrów sesji” możemy uzyskać dostęp do tego parametru z dowolnego modułu systemu za pomocą prostego

W związku z tym, aby zmienić parametry sesji, użytkownik musi wyjść i ponownie wejść do programu.