1s 8 încărcați ACS în tabelul de valori. ACS și surse de date externe

Când deschideți noi filiale ale unei companii, pentru a calcula sarcina pe serverul 1C:Enterprise și alte sarcini, poate fi necesar să vă uitați la dinamica lucrului utilizatorului în baza de informații sub forma unei diagrame.

Dinamica trebuie afișată pentru perioada selectată de utilizator. Datele afișate vor fi numărul de acțiuni întreprinse de acești utilizatori pe oră. Informațiile pentru un astfel de raport pot fi obținute din jurnalul de bord.

Să luăm în considerare crearea pas cu pas a unui astfel de raport și, folosind un set de date extern, să-l construim pe un sistem de compunere a datelor.

Citirea jurnalului de înregistrare

Și așa, vom construi raportul despre sistemul de control al accesului. Vom primi date nu folosind o interogare din baza de date, ci din jurnalul de înregistrare. Am scris despre modul în care platforma stochează jurnalul într-un articol anterior.

În conformitate cu perioada specificată în raport, trebuie să obținem toate acțiunile utilizatorului asupra datelor din baza de informații. Grupați tabelul rezultat în funcție de utilizator și afișați-l sub formă de diagramă (vezi captura de ecran de mai sus).

Pentru a obține informații din jurnalul de înregistrare, vom folosi metoda contextului global „UnloadRegistrationLog()”. În evenimentul „On Result Layout” al raportului creat, adăugați următorul cod de program:

Procedura la alcătuirea rezultatului (DocumentResult, Date de decriptare, StandardProcessing) StandardProcessing = False ; // dezactivează ieșirea raportului standard - o vom scoate în mod programatic // Obține setările raportului, inclusiv. perioadă Settings = SettingsComposer. GetSettings() ; // Obține setările de raport ParameterPeriod = LinkerSettings. GetSettings() . Parametrii datelor. Elemente. Găsiți ("Perioada"). Sens; ZhurTab = New ValueTable; LogSelection = Structură nouă; // Creați o structură de selecție a jurnalului // Completați selecția după perioadă Selectia jurnalului. Insert("StartDate", ParameterPeriod.StartDate) ; Selectia jurnalului. Insert("EndDate", ParameterPeriod.EndDate) ; // Setați selecția pentru evenimente EventArray = Matrice nouă; EventArray. Adăugați(" _$Date$_ . Șterge. Nou" ); Matrice de evenimente. Adăugați(" _$Data$_ . Post" ); Matrice de evenimente. Adăugați(" _$Data$_ . TotalsPeriodUpdate" ); Matrice de evenimente. Adăugați(" _$Data$_ . Anulează postarea" ); Matrice de evenimente. Adăugați(" _$Data$_ . Actualizați"); Selectare jurnal. Insert(" Eveniment ", EventArray); // Încărcați jurnalul UnloadRegistrationLog(JourTab, EventArray) ; // Creați și completați datele pentru ieșire în raport ZhurTab. Coloane. Adăugați ("Ora"); ZhurTab. Coloane. Adăuga(" Numărul de evenimente" ) ; Pentru fiecare pagină din ciclul jurnalului Ora paginii = Ora (Data paginii) ; Numărul paginii de evenimente = 1 ; Sfârșitul ciclului ; // Grupați rezultatul ZhurTab. Colaps(" Nume de utilizator, Ora" , " Numărul de evenimente" ) ; // ..............

Primul parametru al metodei „UploadRegistrationLog” stabilește un tabel de valori în care va fi încărcat rezultatul eșantionării din jurnalul de înregistrare. Al doilea parametru este setarea unui filtru pentru înregistrările selectate. Un filtru este o structură, ale cărei chei sunt câmpurile prin care se stabilește selecția. Folosim câmpurile „Data de început” și „Data de încheiere” pentru a seta perioada de analiză a jurnalului, precum și câmpul „Eveniment”, în care trecem o serie de șiruri (nume de evenimente). Evenimentele adăugate la matrice corespund acțiunilor asupra datelor din baza de date.

Puteți citi mai multe despre utilizarea metodei „UploadRegistrationLog” în asistentul de sintaxă.

Transferăm tabelul de valori în sistemul de control al accesului

Pentru ca ACS să poată lucra cu tabelul de valori rezultat, trebuie să faceți următoarele:

1) Creați un set de date în diagrama de aspect și setați câmpurile acestuia.
2) În codul de program al modulului „Când se compune rezultatul”, înregistrați transferul tabelului de valori către sistemul de control al accesului.

// Grupați rezultatul ZhurTab. Colaps(" Nume de utilizator, Ora" , " Numărul de evenimente" ) ;DecryptionData = NewDataCompositionDecryptionData; // Creați date de decriptare LayoutLinker = newDataLayoutLayoutLinker; // Creați un constructor de layout // Inițializați layout-ul folosind schema de layout de date // și setările create anterior și datele de decriptare DataLayoutSchema = GetLayout(" MainData Layout Schema" ) ; Layout Layout = Layout Linker. Execută (Schema de aspect de date, Setări, Date de decriptare); // Compune rezultatul CompositionProcessor = newDataCompositionProcessor; ProcesorLayout. Initialize(LayoutLayout, // !!! Transferăm tabelul „ZhurTab” în procesorul de layout!!! Structură nouă(" JournalRegistration", JournalTab), Date de decriptare); DocumentResult. Clear(); // Afișează rezultatul într-un document de foaie de calcul OutputProcessor = Nou OutputProcessorDataCompositionResultInTabularDocument; Procesor de ieșire. SetDocument(DocumentResult) ; Procesor de ieșire. Ieșire (LayoutProcessor) ; Sfârșitul procedurii

3) Configurați resursele și structura raportului (pentru mai multe detalii, consultați fișierul raportului, al cărui link este dat la sfârșitul articolului).

În acest moment, setările raportului sunt finalizate și îl putem rula în modul întreprindere.

Concluzie

O sursă de date externă în sistemul de control al accesului ne permite să folosim date din aproape orice sursă în rapoarte, inclusiv cele ale căror date nu le putem obține prin interogări.

Utilizarea ACS pentru astfel de surse vă permite să creați rapoarte cu un sistem flexibil de setări și, de asemenea, permite utilizatorului să modifice rezultatul raportului și structura acestuia. Toate capabilitățile sistemului de compunere a datelor vor fi utilizate pe deplin pentru astfel de surse.

Puteți descărca raportul din exemplu la urmatorul link.

În ultimul meu articol, am scris deja că 1C este o platformă paradoxală. Sistemul de compunere a datelor este unul dintre aceste paradoxuri. SKD este conceput pentru proiectarea rapoartelor complexe și implică înlocuirea programării „manuale” a rapoartelor cu proiectarea într-un set de instrumente multifuncțional. Capacitatea de a utiliza sisteme de control al accesului a apărut în cea de-a opta versiune, dar a durat mult până să apară versiunea 8.2 pentru ca 1C să o poată folosi în produsele sale standard. Pe de o parte, ACS este un set de instrumente multifuncțional, cu ajutorul căruia puteți crea rapoarte foarte complexe fără o singură linie de cod. Cu toate acestea, sistemul de control al accesului are o barieră destul de ridicată la intrare; învățarea și începerea utilizării pe deplin a acestuia „din mers” este foarte dificilă, deoarece interfața nu este complet intuitivă, iar cele mai complete manuale de utilizare sunt disponibile numai în formă de literatură plătită.

În procesul studiului meu despre SKD, a apărut o problemă. Este necesar să obțineți date dintr-un tabel de valori terță parte folosind un limbaj de interogare și apoi să operați aceste date ca și cu date similare din tabelele bazei de date (operații de reducere, grupare și așa mai departe). În formatul clasic, am crea o interogare care primește informații din tabelul trecut la interogare ca parametru.

Solicitare = Solicitare nouă(
"ALEGE
| Tabel.Nomenclatură,
| Masa.Depozit
|DIN
| &TK AS Tabel");
Request.SetParameter("TZ", TZ);

Dar cu SKD totul nu este atât de simplu. Din păcate, este imposibil să se efectueze operația descrisă mai sus în sistemul de compunere a datelor. Cu toate acestea, sistemul a implementat capacitatea de a încărca tabele externe de valori.

Aici merită să facem o scurtă digresiune și să vorbim despre seturi de date. Seturile de date sunt surse de informații de la care sistemul de management al datelor primește date pe care ulterior le compila într-un raport. Seturile de date sunt împărțite în tipuri, folosind în principal tipul „Interogare”, în corpul căruia programatorul scrie o interogare în baza de date. Tipul „Obiect” este folosit pentru a încărca date de la obiecte externe. În ambele cazuri, rezultatul este un anumit set de câmpuri obținute ca urmare a executării unei cereri sau a încărcării unui obiect extern. Ulterior, aceste câmpuri pot fi manipulate în fila „Setări”, împreună cu setări detaliate pentru structura raportului. Pentru a interconecta diferite seturi, ACS oferă posibilitatea de a indica conexiuni între seturi de date în fila cu același nume. Aceste conexiuni sunt un analog direct al uniunii din stânga într-o interogare clasică. Cu toate acestea, trebuie luat în considerare faptul că interogările din orice set de date nu „știu” despre existența altor seturi de date; în cele din urmă, relațiile dintre seturile de date vor afecta aspectul datelor conform structurii specificate în „ fila Setări”.

Să detaliem problema până la un exemplu. Există un raport standard: Declarații de plată pentru organizarea configurației ZiK 8. Este necesar ca tipurile de calcule din raport să fie grupate în anumite grupuri. Calcul Corespondențele Vizualizare-Grup sunt stocate într-un tabel de valori extern. Pentru a-l încărca în schema principală de aspect al datelor, creăm un „obiect de set de date” cu numele „Grupuri” (Figura 2). Facem o conexiune cu „setul de date de interogare” - „Angajări” după tip de calcul (Figura 3). În „Setul de date solicitate” - „Angajări” există informații pentru grupuri, ștergem toate intrările. Ulterior, în fila „Setări” putem folosi câmpul „Grup”, a cărui valoare este încărcată dintr-o sursă de date externă (Figura 4). În funcția de generare a rapoartelor, suplimentăm încărcarea datelor externe.

Funcția GenerateReport(Rezultat = Nedefinit, Date de decriptare = Nedefinit, OutputInReportForm = True) Export

//obținerea sau formarea tabelului necesar de valori „Grupuri” și scrierea acestuia în variabila cu același nume

ExternalData = New Structure();//creează și completează structura de date externe
ExternalData.Insert(Grupuri);

UserPanelValue = TypicalReports.GetUserPanelSettingsValuesofObject(ThisObject);
DefaultSettings = SettingsComposer.GetSettings();
TypicalReports.GetAppliedSetting(ThisObject);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, ExternalData);
SettingsLinker.LoadSettings(DefaultSetting);
Rezultat returnat;

EndFunction

Dacă am face un raport de la zero, codul de lansare pentru generarea raportului ar arăta astfel:

ExternalDataSets = Structură nouă;
ExternalDataSets.Insert(„Grupuri”, Grupuri); //Grupuri - tabelul de valori dorit
DataCompositionSchema = GetLayout("MainDataCompositionSchema"); //aspectul nostru cu diagrama fluxului de date
Settings = DataCompositionScheme.DefaultSettings;
LayoutLinker = newDataLayoutLayoutLinker;
LayoutLayout = LayoutComposer.Execute(DataLayoutSchema, Settings);
DataCompositionProcessor = newDataCompositionProcessor;
DataCompositionProcessor.Initialize(LayoutLayout, ExternalDataSets);
TabDoc = New TabularDocument;
OutputProcessor = Nou OutputProcessorDataCompositionResultInTabularDocument;
OutputProcessor.SetDocument(TabDoc);
OutputProcessor.Output(DataCompositionProcessor);

Citit 9660 o singura data

Buna ziua!
Astăzi vreau să vă descriu un subiect pe care nu îl puteți înțelege fără echipament de scuba :) ;)

Scufundarea înseamnă că scufundarea este destul de adâncă. Există puține referințe la acest subiect în literatură și nu îl veți înțelege până când nu veți simți nevoia. Nici măcar nu va exista un mesaj pentru o astfel de acțiune ;) Apropo, documentația vorbește despre acest lucru foarte slab și inconsecvent; trebuie să apelați la literatura de la terți.

De exemplu, recomand cu căldură „Dezvoltarea de rapoarte complexe în 1C: Enterprise 8.2”. Sistemul de compunere a datelor", (mai precis, vezi paginile 224, 267 și 473)

În ACS există 2 tipuri de surse de date: Interogare, obiect și unire (acesta chestie nu contează, nu este o sursă de date, ci un procesor de date existente). A se vedea figura 1:


Deci, dacă înțelegem mai mult sau mai puțin cum să lucrăm cu o sursă (set) de date de tip „Interogare”, atunci există dificultăți cu setul de date „Obiect”.

Mai întâi, voi descrie ceea ce dorim să obținem ca rezultat:

Raportați, utilizatorul a făcut clic pe „ Formă» și a fost afișată o listă de articole (vezi Fig. 2):

Da, am făcut o inexactitate, și anume: nu există niciun buton „ Formă", dar există un buton " noua actiune„(Voi explica puțin mai târziu de ce s-a întâmplat asta;)

Da Da! Un alt punct: întreaga listă este derivată din setul de date „Obiect”:

Soluţie:

  1. Crearea unui raport extern;
  2. Adăugați un aspect ACS, să-l numim „Schema principală de aranjare a datelor”;
  3. Adăugăm setul de date „Obiect”, îi atribuim numele „Lista de nomenclatură” (ar trebui să fie la fel ca în Fig. 3);
  4. Nu experimentăm prea mult cu setările raportului, lăsați totul să fie simplu (vezi Fig. 4)

Ok, jumătate din treabă gata ;)

Acum haideți să generăm formularul principal de raport (da, încă ceva! Configurația mea funcționează pe o interfață obișnuită, dar cred că veți găsi o soluție pentru formularele gestionate;) Deci, formularul:

Aici apare problema! Dacă facem clic pe butonul „generare” (Fig. 5.), vom vedea o eroare!


Am dedicat acest articol rezolvarii acestei probleme!

Nu a fost posibil să interceptăm evenimentul butonului „Generare”, așa că am decis să folosesc o cârjă. Am lansat configurația în modul de depanare și am încercat să găsesc butonul „generare”.

Am introdus procedura „Generare” în formular, dar nu există intrări în ea, a trebuit să redefinim acțiunea butonului „formular” înainte de a deschide formularul:


În fig. Pe lângă modificarea acțiunii formularului, Figura 8 prezintă un exemplu de cerere, procesarea acesteia și transmiterea datelor generate către sistemul de control al accesului. Să o studiem mai atent:

  1. Generăm date de intrare pentru sistemul de control acces;
  2. Initializam sistemul de control acces;
  3. Afișăm rezultatul PE FORMULAR (atenție și la asta!).

Să ne amintim diagrama de interacțiune a obiectelor sistemului de compoziție a datelor:

Schema de prezentare a datelor dintr-un raport extern este disponibilă ca obiect global într-o metodă de formular Schema de compoziție a datelor. De asemenea, îl puteți accesa după nume trecându-l la metodă GetLayout(vezi Fig. 8)

Piesa principală de cod este mai jos:

Solicitare = Solicitare nouă; Query.Text = "SELECT | Nomenclature.Name as Nomenclature |FROM | Directory.Nomenclature AS Nomenclature"; NomenclatureList = Request.Run().Upload(); DataSets = New Structure("NomenclatureList", NomenclatureList); //SKD = ​​​​GetLayout ("MainData LayoutScheme"); SKD = ​​​​DataCompositionScheme; LayoutComp = nou DataLayoutComposer; layoutComp = LayoutComp.Run(SKD, SKD.DefaultSettings); CompDataProcessor = nou DataCompositionProcessor; ProcessorCompData.Initialize(layoutComp, DataSets); output = new DataCompositionResultOutputProcessorInTabularDocument; output.SetDocument(FormElements.Result); output.Output(ProcessorCompData, true);

Da! Iată un alt moment frumos!!!

În acest exemplu, după cum puteți vedea (vezi Fig. 2), ieșirea este realizată într-un formular, și nu într-un tabel. document! Și acest lucru este foarte bine, pentru că putem lucra cu formularul (interceptați programatic evenimentele elementului de formular, facem tot felul de trucuri cu drag and drop etc.;)

Într-un document foaie de calcul, putem pur și simplu să afișăm pe ecran datele procesate și să transferăm controlul documentului către utilizator și nu putem influența în niciun fel procesul ulterioar de editare a acestui conținut!

Vezi sistemul de ajutor " Câmpul documentului tabelar „, și voi oferi doar un extras din documentația încorporată a sistemului 1c Enterprise 8.2:

„Un câmp de document de foaie de calcul este un document de foaie de calcul plasat într-un formular. Împreună cu varietatea de capabilități de proiectare ale unui document de foaie de calcul, acest lucru vă permite să organizați procesarea evenimentelor care apar atunci când selectați celule, imagini, precum și alte controale plasate într-un câmp al unui document de foaie de calcul.”

Bine, după cum se spune, mult noroc în luptă;)

41
Am făcut recent un raport cu un număr nedefinit de coloane. Nu am vrut să schimb codul, așa că am decis să o fac pe sistemul de control al accesului. Nu a fost nicio problemă cu aceasta, a fost necesar să se extindă rezultatul pe un aspect arbitrar (propriul antet +... 27
Chiar dacă studenții CDS întâlnesc acest lucru în prima sau a doua zi, ar trebui să fie în secțiunea Întrebări frecvente. Un exemplu simplu de ieșire programatică a unui raport pe un aspect, folosind setările implicite. //Obțineți diagrama de la... 18
La generarea rapoartelor asupra sistemului de control al accesului, implicit toate grupările sunt extinse, dar uneori este necesar să afișați un raport cu grupările restrânse imediat după generare! Acest cod din modulul de raport vă permite să restrângeți... 10
Pe această filă puteți specifica ce conexiuni se fac între două sau mai multe seturi de date, în funcție de ce parametri și condiții..png 1. „Sursa conexiunii” - indică primul set de date, de la... 9
Ceea ce este necesar la elaborarea rapoartelor este ca pentru un utilizator cu drepturi limitate, raportul să fie generat complet fără drepturi de verificare! Mai ales dacă RLS este configurat. Există mai multe moduri de a face acest lucru: 1. Instalați...

Uneori se întâmplă ca datele dintr-un raport să nu poată fi obținute folosind o interogare sau o combinație de interogări. Trebuie să utilizați unele proceduri pentru a colecta date, iar datele sunt plasate într-un tabel de valori. Se pune întrebarea - pot fi utilizate aceste date într-o schemă de compunere a datelor? La urma urmei, instrumentul SKD este puternic și convenabil. Se pare că este posibil să folosiți datele din tabelul de valori ca sursă de date pentru un raport în sistemul de control al accesului și nu este deloc dificil de făcut. Acest articol vă va arăta cum să creați un astfel de raport pentru formularele obișnuite.
Deci, cum creați un raport ACS folosind date dintr-un tabel de valori? Să începem cu începutul.
Mai întâi de toate, deschideți configuratorul și creați un nou raport extern.

Deschideți modulul obiect și creați o procedură predefinită la compunerea rezultatului (DocumentResult, Decriptare Date, StandardProcessing)

În cadrul acestei proceduri vom colecta date și vom genera un raport.
În procedura Când se compune rezultatul, dezactivăm procesarea standard. StandardProcessing = Fals;
Apoi formăm un tabel de valori într-un mod arbitrar. Numele coloanelor din tabelul de valori trebuie să se potrivească cu câmpurile viitoare ale setului de date din ACS:


De exemplu, să adăugăm trei rânduri de date. Apoi, creăm rezultatul raportului pas cu pas.

  • Din diagramă obținem setările implicite.

  • Trimitem datele de decriptare variabilei corespunzătoare.

  • Cream layout-ul folosind generatorul de layout.

  • Transferăm diagrama, setările și datele de decodare în aspectul aspectului.

  • Efectuăm layout-ul folosind procesorul de layout. Pentru a face acest lucru, executați metoda Initialize() a procesorului de compoziție de date. Ca parametri trecem aspectul compoziției datelor, seturi de date externe (tip: Structură, cheia de structură trebuie să se potrivească cu numele obiectului din schema de compunere a datelor, valoarea este tabelul de valori generat), datele de decriptare.

  • Ștergeți câmpul din foaia de calcul.

  • Afișăm rezultatul într-o foaie de calcul.
Rezultatul este următorul cod:
DataLayoutSchema = GetLayout( „MainDataCompositionSchema”); //Settings = DataCompositionScheme.DefaultSettings; // - Dacă procedați așa cum se arată mai sus (recomandat pentru unele resurse), atunci când modificați setările în modul client // nu veți vedea aceste modificări, deoarece setările vor fi întotdeauna implicite. Cum se face corect - opțiunea de mai jos Settings = SettingsComposer. GetSettings(); DecryptionData = newDataCompositionDecryptionData; LayoutLinker = newDataLayoutLayoutLinker; LayoutLayout = LayoutLocker. Execute(DataCompositionScheme, Settings, DecryptionData); ExternalDataSet = Structură nouă( „Exemplu tabel cu valori”, TZOoutput); DataCompositionProcessor = newDataCompositionProcessor; DataCompositionProcessor. Initialize(LayoutLayout, ExternalDataSet, DecryptionData); DocumentResult. Clar(); OutputProcessor = Nou OutputProcessorDataCompositionResultInTabularDocument; Procesor de ieșire. SetDocument(DocumentResult); Procesor de ieșire. Ieșire(DataCompositionProcessor); Adăugarea unui aspect diagramă de aspect. Putem lăsa numele ca implicit.

Creăm un set de date. Pentru a face acest lucru, adăugați un nou set de date de tip Object. În câmpul Nume al obiectului care conține datele plasăm numele pe care l-am specificat ca cheie la crearea structurii External DataSet. Apoi adăugăm câmpuri. Numele trebuie să se potrivească exact cu numele coloanelor din tabelul cu valori. Apoi, putem specifica valori acceptabile, formate etc.

Adăugați resurse dacă este necesar. Rezultatele vor fi calculate pe baza acestora. În cazul nostru, acestea sunt câmpurile Cantitate și Cantitate.

În fila Setări, folosind designerul de setări, creăm o opțiune implicită de raport

Ne salvăm raportul. Îl lansăm în client și îl creăm. Un exemplu de rulare a unui raport ACS folosind date din tabelul de valori este prezentat în imagine.


Asta e tot. Destul de simplu, nu?

Exemplul de raport rezultat poate fi descărcat