1c separarea datelor. Utilizarea unui mecanism de partajare a datelor în loc de RLS

1.Preambul.

Era nevoie de organizarea contabilității pentru două organizații într-un singur sistem de securitate a informațiilor. Situația nu este unică, dar s-a întâmplat ca unitatea noastră USB foarte neobișnuită de 250 de gigabyte să funcționeze destul de lent, așa că în loc de RLS am decis să încercăm separarea datelor. Ce este este descris, de exemplu, sau. Pe scurt, dacă RLS completează cu condiții interogări SQL, atunci separatorul de date este o coloană suplimentară în tabele la nivel DBMS, datorită căreia mecanismul de separare ar trebui să funcționeze mai rapid decât RLS.

Deci, în baza de date în care s-au păstrat înregistrările pentru SRL nr. 1, este necesar să se transfere informații din baza de date separată a SRL nr. 2 și să se organizeze munca comună. Exact ca in poza:

Simplii muritori lucrează doar cu propriul lor SRL, iar contabilul șef se uită uneori la date pentru două persoane juridice. În modul de acces la ambele SRL, puteți citi doar datele, astfel încât contabilul șef ar trebui să poată comuta interactiv între modurile „citește tot”/„scrie o singură organizație” și selectează LLC (adică, setează valoarea pentru detaliile comune) pentru a efectua, de exemplu, calcularea costurilor.

2. Implementare

Platforma 8.2.19.90, fără modul de compatibilitate. DBMS - MSSQL Server 2008 R2 Standard.

Am creat atributul general OrganizationSeparator de tip „număr”, am fost de acord cu propunerea de a crea parametri de sesiune, am completat compoziția detaliilor (inclusiv mai multe directoare, toate documentele, registre de acumulare, contabilitate și calcul). Separarea datelor - „Independent și comun”. Valoarea parametrului de sesiune este setată de la setări standard utilizator în procedura SettingSessionParameters din modulul de sesiune:

Organization = UserManagement.GetDefaultValue(chCurrentUser,"PrimaryOrganization");
SessionParameters.OrganizationSeparatorValue = Organization.SeparatorValue;

În interfața contabilului șef, au creat un formular cu capacitatea de a comuta între organizații și de a activa/dezactiva modul de separare:

Când separarea este dezactivată, când SessionParameters.OrganizationSeparatorUsage = False, platforma refuză să scrie documente, blocându-se cu erori precum „Eroare SDBL: expresie așteptată (pos=12)”, deci nu poți permite utilizatorului să scrie documente în această opțiune. Pentru fiabilitate, am creat abonamente la evenimentul „Înainte de înregistrare” pentru obiectele care fac parte din atributul general:

IfSessionParameters.OrganizationSeparatorUsage = False Atunci
#Dacă client Atunci
Avertisment ("Nu se poate scrie deoarece partajarea datelor este dezactivată!");
#EndIf
Refuza = Adevărat;
endIf;

Planul nostru de acțiune a fost următorul: pregătiți configurația receptorului IS nr. 1, setați valorile atributului general = 1, încărcați datele din IS nr. 2, după încărcare, pentru toate obiectele cu un gol (egal cu 0 ) valoarea separatorului, setați OrganizationSeparator = 2.

Configurația a fost pregătită, a apărut întrebarea: cum să setați valoarea detaliilor generale pentru documente și mișcările acestora în perioade închise, rapid și fără riscul ca numerele din bilanţ să zboare? Este imposibil să scriu un separator separat de obiect prin modelul de obiect 1C, așa că a trebuit să sparg acord de licențiere ieșiți și scrieți o interogare pentru MS SQL. Deoarece sunt multe obiecte în atributul general și există și mai multe tabele în tabel pentru aceste obiecte, am scris o procesare care generează o interogare pentru SQL (pentru fiecare obiect de metadate inclus în separator, am scris „update” + DB_Name + ".dbo._" + TableName + "set _" + FieldGeneralAttributes + "= 1";)

Am introdus valoarea, am transferat unele dintre date de la IS nr. 2 și am început testarea.

Rezultatul a fost dezamăgitor. În primul rând, probleme cu registrul contabil. Când separarea este activată, analistul nu este vizibil:

Acest lucru se datorează faptului că registrul contabil la nivel de SGBD este stocat ca mai multe tabele, iar nu toate tabelele aveau valoarea atributului general introdusă (procesarea a fost folosită pentru vizualizarea structurii).


Bine, să introducem valoarea separatorului folosind MS SQL și vom vedea analiza. Rapoartele nu mai funcționează. Se dovedește că există probleme cu interogările la tabelele virtuale ale registrului contabil „Cifra de afaceri” și „Cifra de afaceriDtKt”:

(Fld27033 este doar un atribut general în tabelul registrului contabil)

Separatorul este instalat în toate tabelele, acest lucru este vizibil la nivel DBMS, nu este clar care poate fi eroarea. Implementăm un SCP standard gol, facem modificările de configurare descrise mai sus, introducem câteva documente (în această opțiune, platforma însăși introduce valoarea separatorului în toate tabelele de registru contabil), dar erorile sunt reproduse. Este rău, dar excludem registrele contabile din detaliile generale și continuăm testarea.

În plus, se dovedește că mecanismul de deplasare al registrelor de calcul a încetat să funcționeze. Nu am separat planurile pentru tipuri de calcul, încercăm să căutăm problema în tabelele registrului de calcul și în recalculări. Verificăm, introducem valoarea detaliilor principale, facem T&I - fără niciun rezultat.

Pe parcurs, diagnosticăm problema când scriem informații din formularul de listă în registre independente. În acest caz, datele sunt înregistrate și pot fi văzute după o repornire. Problema este reprodusă și pe baza de teste:


Nu a fost posibilă „repararea” registrelor de informații prin manipulare cu SQL (valoarea separatorului în toate tabelele este setată), așa că pur și simplu le-am exclus din atributele generale. După câteva zile de experimentare, încercările de a restabili funcționalitatea preempționării se dovedesc, de asemenea, a nu reuși.

În acest moment, decidem să dezactivăm separarea datelor și să folosim RLS. Când setăm partiția la „nu utilizați”, întâlnim erorile „Microsoft OLE DB Provider forSQL Server: CREATE UNIQUE INDEX terminat deoarece a fost găsită o cheie duplicată pentru index...”. Adică nu este atât de ușor să te întorci la stat înainte de divizare. Problemă cu indici ai tabelelor de conversie, setări pentru stocarea totalurilor și altele. Faptul este că tabelele stochează rânduri identice, diferind doar prin valoarea atributului general. Când ștergeți un atribut comun, apar înregistrări neunice. Va trebui să ștergeți înregistrările inutile direct în MS SQL, ceva de genul acesta (pentru tabelul de conversie):

Utilizați baza;
ALTER TABLE_CRgRecalc1399
ADD id INT IDENTITY(1,1);
MERGE
DELETE FROM_CRgRecalc1399
UNDE id< (SELECT MAX(id)
DIN _CRgRecalc1399 AS 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]
);
MERGE
ALTER TABLE_CRgRecalc1399
DROP COLUMN id;

Și numai după curățarea mai multor zeci de mese este posibilă dezactivarea separării datelor. După oprirea separării nu există probleme.

3. Concluzii.

A existat o licărire de speranță că problemele au fost rezolvate în 8.3. Nu am fost prea leneși, am verificat-o pe 8.3.4.482 (cu modul de compatibilitate dezactivat). Ne-am uitat la o unitate de control aproape standard, cu modificări în configurație doar pentru detalii generale. Pe această bază de testare, separarea a fost activată înainte ca informațiile să fie introduse, de exemplu. platforma a trebuit să scrie corect valoarea separatorului în toate tabelele; ei nu au scris nimic direct în MS SQL ei înșiși.

Rezultat:

    Problema cu interogările la tabelele virtuale „Turnover” și „TurnoverDtKt” este reprodusă.

    Problema represiunii este reprodusă.

    Problema cu scrierea în registre independente de informații este reprodusă.

    Problema cu dezactivarea separării este că nu puteți scăpa de ea cu un singur clic pe buton!

Astfel, nu am putut înlocui RLS cu un nou mecanism. Acest mecanism a fost aparent conceput pentru servicii cloud, iar în opțiunea de utilizare a datelor partajate „independent”, poate că diviziunea va funcționa, dar avem nevoie de date de bază comune. Trebuie doar să așteptăm ca 1C să corecteze erorile, sau chiar mai bine, să implementeze un mecanism standard de separare după organizare în configurații standard.

Odată am discutat despre mecanismele de restricționare a accesului utilizatorilor în 1C și în special.

Permite utilizatorului să lucreze nu cu toate documentele, ci doar cu cele care indică o anumită organizație sau depozit. Selectările sunt făcute dinamic și, prin urmare, impun o anumită sarcină asupra funcționării bazei de date.

Proprietatea atributului separator general – 1C user separation – vă permite să setați disponibilitatea listei de utilizatori în funcție de utilizarea separatoarelor.

Dacă separatorul este activat pentru un utilizator, atunci acesta va fi vizibil în lista de utilizatori în modul 1C Enterprise - altfel nu va fi vizibil.

În acest fel, puteți organiza diferite liste de utilizatori pentru diferite părți ale bazei de date.

Proprietatea atributului separator general – separare autentificare 1C – vă permite să creați utilizatori cu aceleași nume de utilizator pentru diferite părți ale bazei de date.

Diviziunea condiționată 1C

Separarea condiționată 1C vă permite să activați sau să dezactivați separatorul pe baza datelor bazei de date. În acest fel, puteți crea lanțuri de separatoare care sunt dependente unul de celălalt și acționează dinamic într-un anumit caz.

Pentru a activa diviziunea condiționată 1C - trebuie să specificați în proprietatea atributului separator general - Diviziunea condiționată 1C - care va fi responsabilă pentru determinarea faptului de activare a diviziunii 1C.

Este posibil să se folosească o constantă cu tip boolean sau un atribut de director cu tip boolean.

Important - trebuie să dezactivați utilizarea acestei constante/acestei cărți de referință (selectați Nu folosiți) ca parte a delimitatorilor, numai atunci poate fi selectată.

Detalii generale în 1C 8.3 este un obiect de metadate de platformă care vă permite să utilizați un singur atribut pentru mai multe obiecte de configurare (directoare, documente, planuri de conturi etc.). Obiectul a fost creat în principal pentru a ușura munca dezvoltatorului și pentru a separa datele.

Detaliile generale au fost implementate inițial în versiunea 1C 7.7, dar dezvoltatorii nu l-au inclus imediat în versiunea 8 a platformei. Mecanismul detaliilor generale a fost introdus de dezvoltatorii 1C numai în versiunea 8.2.14.

Este foarte convenabil să adăugați detalii generale pentru a nu schimba obiectele standard în configurație; le folosesc adesea împreună cu .

După adăugarea unui atribut general, acesta poate fi utilizat în interogări și afișat pe formularul obiectului - În exterior, nu este diferit de recuzita obișnuită.

Singura limitare a detaliilor generale este incapacitatea de a le folosi în .

Să ne uităm la setările de bază și proprietățile detaliilor generale care diferă de alte obiecte de configurare:

Compus— o listă de obiecte la care vor fi folosite detaliile generale; setarea amintește de stabilirea unui plan de schimb.

Obțineți 267 de lecții video pe 1C gratuit:

Utilizare automată— setarea determină dacă elementele de recuzită generale vor fi folosite pentru acele obiecte care au modul de utilizare „Automat” specificat.

Separarea datelor— vom lua în considerare această setare separat.

Separarea datelor în 1C folosind detalii comune

Separarea datelor- un mecanism similar cu mecanismul. Cu toate acestea, performanța acestui mecanism este mai eficientă și este mai ușor de configurat.

Mecanismul vă permite să configurați afișarea numai a elementelor pe care utilizatorul le poate vedea. De exemplu, puteți distinge între toate obiectele (documente, directoare etc.) în care este instalată o anumită organizație.

Configurarea separării datelor folosind detalii generale 1C

Pentru a configura detaliile generale, trebuie să specificați separarea datelor - Divide. Imediat după ce faceți clic, sistemul vă va oferi să creeze parametri contabili impliciti:

În acest caz, va fi necesar să specificați parametrii de sesiune la pornirea sistemului; cum să faceți acest lucru a fost descris cu un exemplu în articol.

Aceasta completează configurarea - utilizatorul va avea acces doar la informațiile specificate în parametrii de sesiune selectați.

Exemplu de utilizare a recuzitei obișnuite

Să ne uităm la configurarea elementelor de recuzită generale în 1C 8.3 folosind exemplul unei configurații de cadru și elemente de recuzită Organizare:

Există 3 documente în sistem în care este necesar să se indice detaliile Organizației: acestea sunt Factura de chitanță, Factura de cheltuieli și Statul de plată.

Configurarea este simplă:

  1. Creăm un nou atribut General, specificăm tipul - DirectoryLink.Organization.
  2. În compoziția aranjam documentele noastre - Utilizare.

Gata, configurarea este finalizată!

Sa vedem rezultatul:

Sistemul afișează detalii generale „ca și cum ar fi ale tale”: în cereri, în detalii de formular și în alte locuri. Asta este o magie! 🙂

Cerințele generale 1C 8.3 nu sunt adăugate

Un atribut comun este un atribut care este adăugat la mai multe obiecte de configurare și poate fi folosit și ca componentă mecanism special de separare a datelor:

  • Recuzită comună pentru mai multe obiecte. Un atribut care este prezent în mai multe obiecte de configurare în care acest atribut își păstrează sensul și tipul. Un exemplu de astfel de utilizare: Atributul „Organizare” în documentele contabile reglementate într-o soluție de aplicație
  • Atribute generale ca parte integrantă a unui mecanism special de separare a datelor. Acest mecanism vă permite să împărțiți lucrarea în părți separate soluție de aplicareși toate datele stocate. În acest caz, separarea datelor este activată pentru atributul general.
    Exemplu de astfel de utilizare: Într-un singur fizic baza de informatii Diferiți „proprietari” de date lucrează independent, iar fiecare utilizator al unei astfel de soluții de aplicație va avea acces doar la datele sale

Proprietatea „Separarea datelor” a atributului general

Dacă această proprietate este setată la „Nu folosi”, atunci obiectul de configurare creat va fi folosit doar ca atribut inclus în mai multe obiecte de configurare.
Dacă proprietatea este setată la „Separat”, atributul comun va fi folosit ca separator de date

Compoziția obiectelor

Proprietatea „Compoziție” a unui atribut general determină lista obiectelor de configurare care includ acest atribut general.
Dacă proprietatea „Utilizare automată” este setată la „Nu utilizați”, adăugarea automată a elementelor de recuzită nu va avea loc și pentru a selecta obiectele în care doriți să includeți elemente de recuzită obișnuite, ar trebui să utilizați proprietatea „Compoziție”.
De asemenea, proprietatea „Compoziție” ar trebui utilizată dacă, la utilizarea automată a atributului comun, există obiecte în care atributul comun nu ar trebui să fie prezent.

Folosind recuzită obișnuită

Pentru fiecare obiect de configurare, coloana Utilizare poate lua una dintre cele trei valori:
  • Automat – înseamnă că atribuirea unui obiect de configurare unui atribut general depinde de valoarea proprietății „Utilizare automată”
  • Utilizare - înseamnă că obiectul de configurare face parte din atributul general
  • Neutilizat - înseamnă că obiectul de configurare nu face parte din atributul general
Astfel, folosind editorul de proprietăți „Compoziție”, puteți exclude selectiv unele obiecte din compoziția elementelor de recuzită generale, în ciuda faptului că „Utilizare automată” este setată pentru aceasta.

Obiecte de configurare

Atributul general (nu în modul de partajare a datelor) poate include următoarele obiecte de configurare:
  • Directoare
  • Documentație
  • Jurnalele documentelor
  • Planuri de tip caracteristic
  • Planuri de tip calcul
  • Procesele de afaceri
  • Sarcini
  • Registre de informații
  • Registre de acumulare
  • Registre contabile
  • Schimb de planuri
  • Surse de date externe

Particularități

La înregistrarea unui document, atributului jurnal general i se atribuie valoarea atributului general al documentului sau valoarea NULL dacă documentul nu face parte din atributul general.
Atributele generale pot fi utilizate în restricțiile de acces la date. Este logic să includeți surse de date externe ca parte a unui atribut comun atunci când atributul comun este un separator.

SFAT! Nu ar trebui să utilizați atribute generale pentru a descrie datele care fac parte din logica de afaceri a obiectelor specifice.

Acțiune