41
Recent am făcut un raport cu un număr nedefinit de coloane. Am fost reticent să mă încurc cu codul, am decis să o fac pe ACS. Nu a existat nicio problemă cu acest lucru, a fost necesar să întindeți rezultatul pe un aspect arbitrar (propriul dvs. titlu + ... 27
Deși cursanții ACS întâlnesc acest lucru în prima sau a doua zi, ar trebui să fie în secțiunea FAQ. Un exemplu simplu de redare programatică a unui raport pe un aspect utilizând setările implicite. // Obțineți schema de la ... 18
Când generați rapoarte pe ACS, în mod implicit, toate grupările sunt extinse, dar se întâmplă ca este necesar să se afișeze un raport cu grupurile prăbușite imediat după generare! Acest cod din modulul de raport vă permite să restrângeți ... 10
În această filă, puteți specifica ce conexiuni se fac între două sau mai multe seturi de date, în funcție de parametrii și condițiile..png 1. „Sursă de comunicare” - indică primul set de date, din ... 9
Că la elaborarea rapoartelor, este necesar ca pentru un utilizator cu drepturi limitate, raportul să fie generat complet fără a verifica drepturile! Mai ales dacă RLS este configurat. Există mai multe modalități de a face acest lucru: 1. Instalați ...

Uneori se întâmplă ca datele dintr-un raport să nu poată fi recuperate folosind o interogare sau o combinație de interogări. Trebuie să utilizați un fel de procedură pentru a colecta date, iar datele sunt plasate într-un tabel de valori. Se pune întrebarea - aceste date pot fi utilizate în schema de compunere a datelor? La urma urmei, SKD este un instrument puternic și convenabil. Se pare că utilizarea datelor dintr-un tabel de valori ca sursă de date pentru un raport într-un ACS este posibilă și nu este deloc dificilă. Acest articol vă va arăta cum să creați un astfel de raport pentru formulare obișnuite.
Deci, cum puteți crea un raport ACS utilizând datele dintr-un tabel de valori? Totul în ordine.
În primul rând, deschideți configuratorul și creați un nou raport extern.

Deschideți modulul obiect și creați o procedură predefinită OnCompositionResult (ResultDocument, DecodingData, StandardProcessing)

În cadrul acestei proceduri, vom colecta date și vom genera un raport.
În procedura OnCompositionResult, dezactivați procesarea standard. StandardProcessing \u003d False;
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:


Să adăugăm trei linii de date ca exemplu. Apoi, pas cu pas, creați un rezultat de raport.

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

  • Trimitem datele de decriptare variabilei corespunzătoare.

  • Modelăm aspectul folosind constructorul de layout.

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

  • Compunem folosind procesorul de compoziție. Pentru a face acest lucru, executăm metoda Initialize () a procesorului de compoziție a datelor. Ca parametri, trecem șablonul de compoziție a datelor, seturi de date externe (tip: Structură, cheia de structură trebuie să se potrivească cu numele obiectului din schema de compoziție a datelor, valoarea este tabelul de valori generat), date de decriptare.

  • Ștergem câmpul documentului de foaie de calcul.

  • Afișăm rezultatul într-un document de foaie de calcul.
Rezultatul este următorul cod:
DataCompositionSchema \u003d GetLayout ( „BasicDataCompositionSchema”); // Settings \u003d DataCompositionSchema.Default Settings; // - 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 Setări \u003d Setări Linker. GetSettings (); DecodeData \u003d NewDataCompositionDecryptionData; Layout Composer \u003d New DataComposition Layout Composer; LayoutLayout \u003d LayoutLayout. Executați (schema DataComposition, Setări, DecodingData); ExternalDataset \u003d Structură nouă ( ExampleValuesTable, TZVyvod); DataCompositionProcessor \u003d Procesor DataComposition nou; Procesor DataComposition. Initialize (LayoutDataset, ExternalDataSet, Decryption Data); DocumentResult. Clar (); OutputProcessor \u003d Nou OutputProcessorDataCompositionResultInTableDocument; Procesor de ieșire. InstallDocument (DocumentResult); Procesor de ieșire. Ieșire (procesor DataComposition); Adăugați aspectul schemei 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 tipul obiectului. În câmpul Nume al obiectului care conține datele, puneți numele pe care l-am specificat ca cheie atunci când creați structura ExternalDataSet. Apoi adăugăm câmpurile. Numele trebuie să se potrivească exact cu numele coloanelor din tabelul de valori. În continuare, putem specifica valori valide, formate etc.

Adăugați resurse dacă este necesar. Rezultatele vor fi luate în considerare asupra lor. În cazul nostru, acestea sunt câmpurile Cantitate și Sumă.

În fila Setări, folosind designerul de setări, creăm versiunea implicită a raportului

Salvăm raportul nostru. O lansăm în client și o formăm. Un exemplu de rularea raportului ACS folosind datele din tabelul de valori este prezentat în imagine.


Asta e tot. Destul de simplu, nu-i așa?

Raportul rezultat pentru un exemplu poate fi descărcat

Când deschideți noi sucursale ale companiei, pentru a calcula sarcina pe serverul 1C: Enterprise și alte sarcini, poate fi necesar să vedeți dinamica activității utilizatorului în baza de date sub formă de diagramă.

Dinamica trebuie afișată pentru perioada selectată de utilizator. Datele afișate vor fi numărul de acțiuni asupra acestor utilizatori în contextul orelor. 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 să folosim un set de date extern pentru a-l construi pe sistemul de compoziție a datelor.

Citim jurnalul de înregistrare

Astfel, vom construi raportul despre SKD. Vom primi date nu utilizând o cerere din baza de date, ci din jurnal. Am scris despre modul în care platforma stochează jurnalul în articolul anterior.

În conformitate cu perioada specificată în raport, trebuie să obținem toate acțiunile utilizatorului cu datele din baza de date. Grupați tabelul rezultat după utilizator și afișați-l ca o diagramă (consultați captura de ecran de mai sus).

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

Procedură OnCompositionResult (ResultDocument, DecodeData, StandardProcessing) StandardProcessing \u003d False; // dezactivați ieșirea standard a raportului - vom ieși programatic // Obțineți setările raportului, incl. perioadă Setări \u003d Setări Linker. GetSettings (); // Obțineți setările raportului ParameterPeriod \u003d Compositor de setări. GetSettings (). Parametrii de date. Elemente. Găsiți („Perioada”). Valoare; ZhurTab \u003d Nou tabel de valori; Selecția revistei \u003d Cadru nou; // Creați o structură pentru selectarea jurnalului de bord // Completați selecția după perioadă Selecția jurnalului. Insert ("Data de începere", ParameterPeriod. Data de începere); Selecția jurnalului. Insert ("EndDate", ParameterPeriod. EndDate); // Setați selecția pentru evenimente Matrice de evenimente \u003d Matrice nouă; Matrice de evenimente. Adăugați („_ $ Data $ _ ... Șterge... Nou"); Matrice de evenimente. Adăugați (" _ $ Date $ _ ... Post"); Matrice de evenimente. Adăugați (" _ $ Date $ _ ... TotalsPeriodUpdate"); Matrice de evenimente. Adăugați (" _ $ Date $ _ ... Unpost"); Matrice de evenimente. Adăugați (" _ $ Date $ _ ... Actualizați"); SelectLog. Insert (" Eveniment ", matrice de evenimente); // Descărcați jurnalul UnloadRegisterJournal (ZhurTab, Array of Events); // Creați și completați date pentru a fi trimise în raport ZhurTab. Coloane. Adăugați („Ora”); ZhurTab. Coloane. Adăuga (" Numărul de evenimente"); Pentru fiecare pagină din ciclul LogTabs Durată pagină \u003d Oră (Data paginii); Număr pagină de evenimente \u003d 1; Sfârșitul ciclului; // Grupați rezultatul ZhurTab. Restrânge („ Nume utilizator, ora" , " Numărul de evenimente" ) ; // ..............

Primul parametru al metodei "UnloadLogRegister" stabilește tabelul de valori în care va fi descărcat rezultatul selecției din jurnalul de bord. Al doilea parametru este setarea filtrului pentru înregistrările selectate. Un filtru este o structură, tastele în care sunt câmpurile prin care este setat filtrul. 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 matricei corespund acțiunilor asupra datelor din baza de date.

Puteți citi mai multe despre utilizarea metodei "UnloadLogRegister" în helper-ul de sintaxă.

Transferăm tabelul valorilor către ACS

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 schema de aspect și setați câmpurile sale.
2) În codul de program al modulului "AtCompositionResult", scrieți transferul tabelului de valori către ACS.

// Grupați rezultatul ZhurTab. Restrânge („ Nume utilizator, ora" , " Numărul de evenimente"); DecryptionData \u003d NewDataCompositionDecryptionData; // Creați date de decriptare Layout Composer \u003d New DataComposition Layout Composer; // Creați un compozitor de aspect // Inițializați aspectul utilizând schema de compoziție a datelor // și setările create anterior și datele de decriptare DataCompositionSchema \u003d GetLayout (" Aspect BasicData"); LayoutComposer \u003d LayoutComposer. Execute (DataCompositionSchema, Settings, DecodingData); // Construiește rezultatul Procesor de compoziție \u003d nou procesor de compunere a datelor; Aspecte procesor. Inițializați (Layout Layout, // !!! Transferăm tabelul „ZhurTab” în procesorul de aspect !!! Structură nouă („ LogRegistration", ZhurTab), Date de decriptare); DocumentResult. Clear (); // Afișați rezultatul într-un document de foaie de calcul OutputProcessor \u003d Nou OutputProcessorDataCompositionResultInTableDocument; Procesor de ieșire. InstallDocument (DocumentResult); Procesor de ieșire. Ieșire (procesor de aspect); Sfârșitul procedurii

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

Aceasta completează setările raportului și îl putem rula în modul enterprise.

Rezultat

O sursă de date externă din ACS ne permite să folosim date în rapoarte de la aproape orice sursă, inclusiv cele ale căror date nu le putem primi 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ă schimbe rezultatul raportului, structura acestuia. Toate capacitățile sistemului de compoziție a datelor vor fi utilizate pe deplin pentru astfel de surse.

Puteți descărca raportul din exemplu urmând linkul.

Salut!
Astăzi vreau să descriu un subiect pe care nu-l poți da seama fără echipament de scufundare :);)

Scufundarea înseamnă că scufundarea este destul de profundă. Există puține referințe la acest subiect în literatură și până nu „mâncărim” nu îl veți înțelege. Nici măcar nu va apărea un mesaj pentru o astfel de acțiune;) Apropo, documentația spune foarte rău și inconsecvent despre acest lucru, trebuie să apelați la literatura terță parte.

De exemplu, recomand cu tărie „Dezvoltarea rapoartelor complexe în„ 1C: Enterprise 8.2 ”. Sistem 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 (acest lucru nu contează, nu este o sursă de date, ci un handler pentru datele existente). Vezi imaginea 1:


Deci, dacă mai mult sau mai puțin înțelegem cum să lucrăm cu o sursă (set) de date de tipul „Cerere”, atunci există dificultăți în ceea ce privește setul de date „Obiect”.

În primul rând, voi descrie ce vrem să obținem la ieșire:

Raportați, utilizatorul a dat clic pe „ Pentru a forma”Și a fost afișată lista articolelor (vezi Fig. 2):

Da, am făcut o inexactitate și anume: nu există buton “ Pentru a forma", Dar există un buton" acțiune nouă"(Voi explica puțin mai târziu de ce s-a întâmplat acest lucru;)

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

Decizie:

  1. Creăm un raport extern;
  2. Adăugați aspectul ACS, să-l numim „MainData Layout Scheme”;
  3. Adăugați setul de date „Obiect”, atribuiți-i numele „NomenclatureList” (ar trebui să fie același ca în Fig. 3);
  4. Nu experimentăm prea multe în setările raportului, să o simplificăm (vezi fig. 4)

Ok, jumătate din muncă este terminată;)

Acum să generăm formularul principal de raport (da, încă un moment! 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 intervine problema! Dacă facem clic pe butonul „generați” (Fig. 5.), atunci vom vedea o eroare!


Am dedicat acest articol rezolvării acestei probleme!

Nu a fost posibil să interceptăm evenimentul butonului „Generați”, prin urmare, am decis să folosesc o cârjă. Am început configurația în modul de depanare și am încercat să găsesc același buton „generați”.

Am inserat procedura „Generați” în formular, dar nu există apeluri în acesta, a trebuit să redefinesc acțiunea butonului „generați” înainte de a deschide formularul:


În fig. 8, pe lângă schimbarea acțiunii formularului, este oferit un exemplu de cerere, procesarea și transmiterea datelor generate către ACS. Să o examinăm mai atent:

  1. Generăm date de intrare pentru ACS;
  2. Inițializăm ACS;
  3. Afișăm rezultatul PE FORMULAR (acordați atenție și acestui lucru!).

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

Schema de compunere a datelor într-un raport extern este disponibilă ca obiect global într-o metodă de formular Schema de compunere a datelor.De asemenea, puteți face referire la acesta după nume, trecându-l la metodă Obțineți aspectul(vezi Fig. 8)

Piesa principală de cod este prezentată mai jos:

Cerere \u003d Cerere nouă; Request.Text \u003d "SELECT | Nomenclature.Name as Nomenclature | FROM | Reference.Nomenclature AS Nomenclature"; NomenclatureList \u003d Query.Run (). Unload (); Seturi de date \u003d Structură nouă ("NomenclatureList", NomenclatureList); // ACS \u003d GetLayout ("MainDataCompositionSchema"); ACS \u003d Schema de compunere a datelor; LayoutComp \u003d nou LayoutComposerDataComposition; layoutComp \u003d LayoutComp.Run (SKD, SKD.Setări implicite); DataComposition Processor \u003d nou procesor DataComposition; ProcessorCompData.Initialize (layoutComp, seturi de date); output \u003d newDataCompositionOutputProcessorIn TabularDocument; output.SetDocument (FormElements.Result); output.Offer (ProcessorCompData, adevărat);

Da! Iată încă un moment frumos !!!

În acest exemplu, după cum puteți vedea (a se vedea Fig. 2), ieșirea se efectuează în formă și nu în tabel. document! Și acest lucru este foarte bun, deoarece putem lucra cu formularul (interceptăm programatic evenimentele elementului formular, facem tot felul de trucuri de drag and drop și așa mai departe;)

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

Vedeți sistemul de ajutor " Câmp document pentru foaie de calcul „Și voi da doar un extras din documentația încorporată a sistemului 1c Enterprise 8.2:

„Câmpul unui document de foaie de calcul este un document de foaie de calcul plasat în formular. Împreună cu varietatea posibilităților de proiectare ale documentului de foaie de calcul, aceasta vă permite să organizați procesarea evenimentelor care apar atunci când selectați celule, imagini și alte controale situate în câmpul documentului de foaie de calcul. "

Bine, așa cum se spune, succes în luptă;)

În ultimul meu articol am scris deja că 1C este o platformă paradoxală. Sistemul de aranjare a datelor este unul dintre astfel de paradoxuri. ACS este destinat construcției de rapoarte complexe și presupune înlocuirea programării „manuale” a rapoartelor prin proiectare într-un set de instrumente multifuncțional. Capacitatea de a utiliza ACS a apărut în cea de-a opta versiune, dar a durat mult până când versiunea 8.2 să apară, astfel încât 1C să o poată utiliza î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, ACS are un prag de intrare destul de ridicat, este foarte dificil să-l studiezi și să începi să-l folosești dintr-o clipă, deoarece interfața nu este complet intuitivă, iar cele mai complete ghiduri de utilizare sunt disponibile numai sub formă de literatură plătită.

În cursul studiului meu despre SCA, a apărut o problemă. Este necesar să se obțină date dintr-un tabel de valori terță parte folosind limbajul de interogare și apoi să se opereze cu aceste date ca și cu date analoage din tabelele bazei de date (operații rezumative, grupare etc.). În formatul clasic, am compune o interogare care primește informații din tabelul transmis la interogare ca parametru ide.

Cerere \u003d Cerere nouă (
"SELECTAȚI
| Tabel. Nomenclatură,
| Tabel.Depozit
| FROM
| & TK AS Table ");
Request.SetParameter ("TK", TK);

Dar cu ACS, nu este atât de simplu. Din păcate, operația descrisă mai sus nu poate fi realizată în sistemul de stocare a datelor. Cu toate acestea, este implementată capacitatea de a încărca tabele de valori externe în sistem.

Merită să faci o mică digresiune lirică aici și să vorbești despre seturi de date. Seturile de date sunt surse de informații din care ACS primește date, pe care ulterior le asamblează într-un raport. Seturile de date sunt împărțite în tipuri, utilizând în principal tipul „Cerere”, în corpul căruia programatorul scrie o interogare în baza de date. Tipul „Obiect” este utilizat pentru a încărca date de la obiecte externe. În ambele cazuri, la ieșire, avem un anumit set de câmpuri obținut ca urmare a executării unei cereri sau a încărcării unui obiect extern. Ulterior, aceste câmpuri pot fi operate în fila „Setări”, împreună cu o setare detaliată a structurii raportului. Pentru relația diferitelor seturi din ACS, este posibilă specificarea legăturilor seturilor de date în fila cu același nume. Aceste legături sunt un analog direct al aderării din stânga la interogarea clasică. Cu toate acestea, rețineți că interogările din orice set de date nu „știu” despre existența altor seturi de date; în cele din urmă, legăturile setului de date vor afecta compoziția datelor în conformitate cu structura specificată în fila „Setări”.

Să detaliați sarcina la un exemplu. Există un raport standard Declarații de calcul ale organizării configurației ZiK 8. Este necesar ca tipurile de calcule din raport să fie grupate în unele grupuri. Corespondențele grup-tip de decontare sunt stocate într-un tabel de valori extern. Pentru a-l încărca în schema principală de compunere a datelor, creați un „obiect set de date” numit „Grupuri” (Figura 2). Conexiunea se realizează cu „setul de date de interogare” - „Acumulări” după tipul de calcul (Figura 3). În „setul de date de interogare” - „Acumulări” există informații despre grupuri, ștergem toate aparițiile. După aceea, î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 raportului, suplimentăm încărcarea datelor externe.

Funcția GenerateReport (Rezultat \u003d Nedefinit, Decodare date \u003d Nedefinit, OutputToReportForm \u003d True) Export

// obținerea sau formarea tabelului necesar pentru valorile „Grup” și scrierea acestuia în variabila cu același nume

ExternalData \u003d New Structure (); // creați și completați structura de date externe
ExternalData.Insert (Grupuri);

UserPanelValue \u003d Exemple de rapoarte.GetUserPanelSettingsObjectObject (ThisObject);
Setare implicită \u003d Setări Linker.GetSettings ();
TypicalReport.GetAppliedSetting (ThisObject);
Rapoarte tipice. Generați un raport tipic (ThisObject, Result, Decoding Data, Output To Report Form, ExternalData);
Setări Linker.LoadSettings (Setare implicită);
Rezultatul de returnare;

EndFunction

Dacă ar fi să creăm un raport „de la zero”, codul pentru a începe generarea raportului ar arăta astfel:

ExternalDatasets \u003d Structură nouă;
ExternalDatasets.Insert ("Grupuri", Grupuri); // Grupuri - tabelul de valori dorit
DataCompositionSchema \u003d GetLayout ("MainDataCompositionSchema"); // aspectul nostru cu schema de setare a datelor
Setări \u003d DataCompositionScheme.Default Settings;
Layout Composer \u003d New DataComposition Layout Composer;
LayoutComposer \u003d LayoutComposer.Run (schema DataComposition, Setări);
DataCompositionProcessor \u003d Procesor DataComposition nou;
DataCompositionProcessor.Initialize (LayoutDataSets);
TabDoc \u003d Document Tabular nou;
OutputProcessor \u003d Nou OutputProcessorDataCompositionResultInTableDocument;
Procesor de ieșire.InstallDocument (TabDok);
OutputProcessor.Output (DataComposition Processor);

Citit 9660 timp