Folosind un mecanism de partajare a datelor în loc de RLS. Utilizarea unui mecanism de partajare a datelor în loc de partajarea datelor RLS 1c

Un atribut partajat este un atribut adăugat la mai multe obiecte de configurare și poate fi folosit și ca parte a unui mecanism special de partajare 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
  • Cerință comună ca parte integrantă a unui mecanism special de partajare a datelor. Acest mecanism vă permite să separați munca soluției aplicate și toate datele stocate în părți separate. În același timp, separarea datelor este activată pentru atributul comun.
    Un exemplu de astfel de utilizare: într-o bază de informații fizice, diferiți „proprietari” de date lucrează independent, în timp ce fiecare utilizator al unei astfel de soluții de aplicație va avea acces doar la datele sale

Proprietatea „Separarea datelor” a unui atribut comun

Dacă această proprietate este setată la „Nu folosi”, atunci obiectul de configurare creat va fi folosit doar ca o prop care face parte din mai multe obiecte de configurare.
Dacă proprietatea este setată la „Separat”, atributul comun va fi folosit ca separator de date

Compoziția obiectelor

Proprietatea „Conținut” a unui atribut comun determină lista de obiecte de configurare care includ acest atribut comun.
Dacă proprietatea „Utilizare automată” este setată la „Nu utilizați”, adăugare automată nu va apărea și pentru a selecta obiecte în care doriți să includeți un atribut comun, ar trebui să utilizați proprietatea „Compoziție”.
De asemenea, proprietatea „Compoziție” ar trebui utilizată dacă, în timpul utilizării automate a unui atribut comun, există obiecte în care atributul comun nu ar trebui să fie prezent.

Folosind o recuzită comună

Pentru fiecare obiect de configurare, coloana Utilizare poate lua una dintre cele trei valori:
  • Automatic – înseamnă că atribuirea unui obiect de configurare unui atribut comun depinde de valoarea proprietății „Auto-use”
  • Utilizare - înseamnă că obiectul de configurare face parte din atributul general
  • Nu utilizați - î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 unui atribut comun, în ciuda faptului că „Utilizare automată” este setată pentru acesta.

Obiecte de configurare

Un atribut comun (nu în modul de partajare a datelor) poate include următoarele obiecte de configurare:
  • Carti de referinta
  • Documentele
  • Jurnalele de documente
  • Planuri de tipuri de caracteristici
  • Planuri de tip de calcul
  • Procesele de afaceri
  • Sarcini
  • Registre de informații
  • Registre de acumulare
  • Registre contabile
  • Planuri de schimb
  • Surse de date externe

Particularități

La scrierea unui document, atributului general al jurnalului i se atribuie valoarea atributului general al documentului sau NULL dacă documentul nu face parte din atributul general.
Atributul general poate fi utilizat în restricțiile de acces la date. Porniți surse externe datele într-un atribut comun are sens în cazul în care atributul comun este un delimitator.

SFAT! Atributele generale nu trebuie folosite pentru a descrie datele care fac parte din logica de afaceri a obiectelor specifice.

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

Vă permite să permiteți utilizatorului să lucreze nu cu toate documentele, ci doar cu cele în care este indicată o anumită organizație sau depozit. Selecțiile se fac dinamic, deci impun o anumită încărcare bazei de date.

Proprietatea atributului-separator comun - Separarea utilizatorilor 1C - vă permite să setați disponibilitatea listei de utilizatori în funcție de utilizarea separatoarelor.

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

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

Proprietatea separatorului-atribut comun - Separarea autentificării 1C - vă permite să creați utilizatori cu acelaș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 și să dezactivați separatorul pe baza datelor din baza de date. Astfel, este posibil să se creeze lanțuri de delimitatori care sunt dependenți unul de celălalt, acționând dinamic într-un caz sau altul.

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

Este posibil să se folosească o constantă cu tip boolean sau un atribut de referință 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 separatoarelor, numai atunci poate fi selectată.

Recuzită generală î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 facilita munca dezvoltatorului și separarea datelor.

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

Atributele generale sunt foarte convenabile de adăugat pentru a nu schimba obiectele standard din configurație, le folosesc adesea împreună cu .

După adăugarea unui atribut comun, acesta poate fi folosit în interogări și afișat sub formă de obiecte − în exterior, nu este diferit de recuzita obișnuită.

Singura limitare a atributelor comune este că nu pot fi utilizate în .

Să luăm în considerare setările și proprietățile principale ale atributelor comune care sunt diferite de alte obiecte de configurare:

Compus— o listă de obiecte pentru care va fi folosit atributul comun, setarea seamănă cu setarea planului de schimb.

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

Utilizare automată— setarea determină dacă va fi folosit un atribut comun pentru acele obiecte care au modul de utilizare „Automat” specificat în compoziție.

Separarea datelor Vom lua în considerare această setare separat.

Separarea datelor în 1C folosind un atribut comun

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 comune 1C

Pentru a seta în atributul general, trebuie să specificați separarea datelor − Divide. Imediat după ce faceți clic, sistemul vă va solicita să creați parametri contabili impliciti:

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

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

Un exemplu de utilizare a unui atribut comun

Să analizăm setarea elementelor de recuzită generale în 1C 8.3 folosind exemplul unei configurații wireframe și elemente de recuzită Organizare:

Există 3 documente în sistem, unde este necesar să se indice Organizația necesară: acestea sunt Factură, Factură de cheltuieli, Stat de plată.

Configurarea este simplă:

  1. Creați un nou atribut General, specificați tipul — DirectoryLink.Organization.
  2. În compoziția aranjam documentele noastre - Utilizare.

Totul, configurarea s-a terminat!

Sa vedem rezultatul:

Sistemul afișează atributul comun „ca propriu”: atât în ​​cereri, cât și în atribute de formular, precum și în alte locuri. Asta-i magie! 🙂

Recuzitele generale 1C 8.3 nu sunt adăugate

1. Preambul.

Era nevoie de organizarea contabilității pentru două organizații într-un singur IB. Situația nu este unică, dar s-a întâmplat că UPP-ul nostru foarte neobișnuit de 250 GB a funcționat 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ă condițiile interogări SQL, atunci separatorul de date este o coloană suplimentară în tabele la nivel SGBD, 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 dintr-o bază de date separată a SRL nr. 2 și să se organizeze munca în comun. Exact ca in poza:

Simplii muritori lucrează doar cu SRL-ul lor, iar contabilul-șef se uită uneori la date despre două entități juridice. În modul de acces la ambele SRL-uri, puteți citi doar date, astfel încât contabilul șef trebuie să poată comuta interactiv între modurile „citește tot” / „scrie doar pentru o singură organizație” și selectează SRL-ul (adică să seteze valoarea atribut comun) pentru a efectua, de exemplu, calculul costurilor.

2. Implementare

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

Am creat un atribut comun Organization Separator de tip „număr”, de acord cu propunerea de a crea parametri de sesiune, completat în compoziția atributului (inclus mai multe directoare, toate documentele, registre de acumulare, contabilitate și calcul). Separarea datelor - „Independent și în comun”. Valoarea parametrului de sesiune este setată de la setări implicite utilizator în procedura SetSessionParameters din modulul de sesiune:

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

Î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:

Cu divizarea dezactivată, când SessionParameters.OrganizationSeparatorUse = False, platforma refuză să scrie documente, aruncând erori precum „Eroare SDBL: expresie așteptată (pos=12)”, deci nu poți lăsa utilizatorul să scrie documente în această opțiune. Pentru fiabilitate, am creat abonamente la evenimentul „Înainte de înregistrare” pentru obiectele care fac parte din atributul comun:

Dacă SessionParameters.OrgDelimiterUse = False, atunci
#Dacă client Atunci
Avertisment ("Nu se poate scrie deoarece partajarea datelor este dezactivată!");
#EndIf
Respingere = adevărat;
EndIf;

Planul nostru de acțiune a fost următorul: pregătim configurația receptorului IB nr. 1, punem în jos valorile atributului comun = 1, încărcăm datele din IB nr. 2, după încărcarea pentru toate obiectele cu un gol (egal cu 0) valoarea separatorului, setați Separatorul organizației = 2.

Configurația a fost pregătită, a apărut întrebarea, cum să setați valoarea atributului general pentru documente și mișcările acestora în perioade închise și rapid și fără riscul ca numerele din balanță să zboare? Prin model de obiect 1C, este imposibil să scriu separatorul separat de obiect, așa că a trebuit să încalc acordul de licență pentru a ieși și a scrie o interogare pentru MS SQL. Deoarece sunt multe obiecte în atributul comun și există și mai multe tabele în pomeți pentru aceste obiecte, am scris o procesare care generează o interogare pentru SQL (pentru fiecare obiect de metadate care face parte din separator, am scris „actualizare” + DB_name + ".dbo._" + TableName + " set _" + Field GeneralAttribute + " = 1";)

Valoarea a fost setată, unele dintre date au fost transferate de la IB nr. 2 și au început testarea.

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

Acest lucru se datorează faptului că registrul contabil la nivel de SGBD este stocat ca mai multe tabele, și nu toate tabelele aveau valoarea unui atribut comun (procesarea a fost folosită pentru vizualizarea structurii).


Ei bine, punem jos valoarea separatorului prin MS SQL, vedem analitica. Acum rapoartele nu funcționează. Se dovedește că există probleme cu interogările la tabelele virtuale ale registrului contabil „Turnovers” și „TurnoversDtKt”:

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

Separatorul este setat in toate tabelele, se vede la nivel DBMS, ce ar putea fi o eroare, nu este clar. Implementăm un SCP gol tipic, facem modificările de configurare descrise mai sus, introducem câteva documente (în această opțiune, platforma însăși setează valoarea separatorului în toate tabelele de registru contabil), dar erorile sunt reproduse. E rău, dar excludem registrele contabile din cerințele generale, continuăm testarea.

În plus, se dovedește că mecanismul de deplasare pentru registrele de calcul a încetat să funcționeze. Nu am separat planuri pentru tipuri de calcul, încercăm să căutăm o problemă în tabelele registrului de calcul și în recalculări. Verificăm, punem în jos valoarea atributului principal, facem T&I - fără niciun rezultat.

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


Registrele de informații nu au putut fi „reparate” prin manipularea SQL (valoarea separatorului este setată în toate tabelele), așa că pur și simplu au fost excluse din atributul general. După câteva zile de experimentare, încercările de a restabili capacitatea de lucru a deplasării sunt, de asemenea, fără succes.

În acest moment, decidem să dezactivăm partajarea datelor și să folosim în continuare RLS. Când setați împărțirea la „nu utilizați”, întâlnim erori „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 statul de dinaintea despărțirii. Problemă cu indici ai tabelelor de recalculare, setări pentru stocarea totalurilor și altele. Faptul este că tabelele stochează rânduri identice care diferă doar prin valoarea atributului comun. Când ștergeți un atribut comun, apar intrări neunice. Va trebui să ștergeți înregistrările inutile direct în MS SQL, ceva de genul acesta (pentru tabelul de recalculare):

baza de utilizare;
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 tabele, este posibil să dezactivați partiționarea datelor. După oprirea separării, nu există probleme.

3. Concluzii.

Era speranța că 8.3 probleme au fost rezolvate. Nu am fost prea leneși, am verificat pe 8.3.4.482 (cu modul de compatibilitate dezactivat). Ne-am uitat la un SCP-shke aproape tipic, cu modificări în configurație doar pentru recuzita generală. Pe această bază de testare, împărțirea a fost activată înainte ca informațiile să fie introduse, de exemplu. platforma a trebuit să scrie corect valoarea separatorului în toate tabelele, nu au scris nimic direct în MS SQL pe cont propriu.

Rezultat:

    Problema cu interogările la tabelele virtuale „Turnovers” și „TurnoversDtKt” este reprodusă.

    Problema de preempțiune este reproductibilă.

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

    Problema cu oprirea separării - nu va funcționa pentru a scăpa de ea cu un singur clic al butonului!

Astfel, nu am reușit să înlocuim RLS cu un nou mecanism. Acest mecanism a fost conceput, aparent, pentru servicii cloud, iar în cazul utilizării datelor partajate „indiferent”, poate divizia va funcționa, dar avem nevoie de un INS comun. Rămâne de așteptat ca 1C să corecteze erorile și chiar mai bine să implementeze un mecanism tipic de împărțire pe organizații în configurații standard.

În articolul anterior, am adăugat un atribut comun tuturor directoarelor configurației noastre pentru a ști cine a creat acest obiect director. Acum vom crea un abonament la eveniment și vom specifica ce informații să completăm acest atribut.

În acest rang, de fiecare dată înainte de a înregistra un obiect, vom corespunde cu autorul obiectului, este indicat să indicăm, desigur, iar când s-a întâmplat acest lucru, vom adăuga autorului și data înregistrării.

AutoSaveAuthorBeforeWrite(Sursa, Respingere) Procedura de export // Lipiți în sampler. Sursă. AuthorObject = UserName() + " ; " + șir (data curentă() ); EndProcedure

Minunat. Acum să ne gândim unde mai poți folosi detaliile generale?

În primul rând, cu ajutorul detaliilor generale, puteți adăuga atributul „Comentariu”, atributul „autor” și alte atribute de care aveți nevoie la toate documentele din configurație.

Recuzitele partajate au un alt parametru interesant " Separarea datelor. Acest mecanism ne permite să definim datele pe care dorim să le arătăm utilizatorului. De exemplu, pentru ca niciunul dintre manageri să nu cunoască toți clienții companiei, îi vom arăta doar acei clienți pe care i-a introdus în baza de date, cu care lucrează. Să încercăm să adăugăm această funcționalitate la baza de date. Pentru început, va trebui să indicăm că vom folosi partiționarea datelor, sistemul va oferi automat crearea parametrilor impliciti de sesiune.

După aceea, trebuie să setăm doar parametrii de sesiune în modulul de sesiune:

Să dăm un exemplu despre cum arată directorul contrapărților fără a utiliza „Separarea datelor” și odată cu acesta:

Fără separare

Despică

Vă rugăm să rețineți că atributul „Responsabil” nu a fost găsit în prima contraparte, deoarece autorul acestui atribut a fost altcineva.

Un exemplu clasic de separare a contabilității este pe organizație, arătând utilizatorilor doar acele documente care se referă la organizația corespunzătoare.

Am folosit mecanismul Session Parameters, să înțelegem pe scurt ce este. În esență, parametrii de sesiune sunt variabile globale care sunt setate la pornirea sistemului. De obicei, acest lucru se întâmplă în „Modulul de sesiune”, rețineți că parametrii de sesiune sunt creați pur programatic.

După ce am setat „Parametrii sesiunii”, putem accesa acest parametru din orice modul al sistemului cu un simplu

În consecință, pentru a modifica parametrii sesiunii, utilizatorul trebuie să iasă și să intre din nou în program.