Un esempio di utilizzo di un'origine dati esterna in un sistema di archiviazione. Set di dati Tabella dei valori dell'oggetto set di dati SKD

Nel mio ultimo articolo ho già scritto che 1C è una piattaforma paradossale. Il sistema di composizione dei dati è uno di questi paradossi. SKD è progettato per la progettazione di report complessi e prevede la sostituzione della programmazione “manuale” dei report con la progettazione in un toolkit multifunzionale. La possibilità di utilizzare i sistemi di controllo degli accessi è apparsa nell'ottava versione, ma ci è voluto molto tempo prima che apparisse la versione 8.2 in modo che 1C potesse utilizzarla nei suoi prodotti standard. Da un lato, ACS è un toolkit multifunzionale, con il quale è possibile creare report molto complessi senza una sola riga di codice. Tuttavia, il sistema di controllo accessi presenta una barriera all’ingresso abbastanza elevata; apprenderlo ed iniziare ad utilizzarlo completamente “al volo” è molto difficile, perché l’interfaccia non è del tutto intuitiva, ed i manuali d’uso più completi sono disponibili solo nella versione forma di letteratura a pagamento.

Nel corso del mio studio sulla SKD è sorto un problema. È necessario ottenere dati da una tabella di valori di terze parti utilizzando un linguaggio di query e quindi utilizzare questi dati come con dati simili provenienti da tabelle di database (operazioni di riduzione, raggruppamento e così via). Nel formato classico, creeremmo una query che riceve informazioni dalla tabella passata alla query come parametro.

Richiesta = Nuova richiesta(
"SCEGLIERE
| Tabella.Nomenclatura,
| Tavolo.Magazzino
|DA
| &TK Tabella AS");
Richiesta.SetParameter("TZ", TZ);

Ma con SKD tutto non è così semplice. Purtroppo, è impossibile eseguire l'operazione sopra descritta nel sistema di composizione dei dati. Tuttavia, il sistema ha implementato la possibilità di caricare tabelle di valori esterne.

Qui vale la pena fare una breve digressione e parlare di Dataset. I set di dati sono fonti di informazioni da cui il sistema di gestione dei dati riceve dati che successivamente compila in un report. I set di dati sono suddivisi in tipi, principalmente utilizzando il tipo “Query”, nel corpo del quale il programmatore scrive una query al database. Il tipo "Oggetto" viene utilizzato per caricare dati da oggetti esterni. In entrambi i casi, l'output è un determinato insieme di campi ottenuti come risultato dell'esecuzione di una richiesta o del caricamento di un oggetto esterno. Successivamente, questi campi possono essere manipolati nella scheda "Impostazioni", insieme alle impostazioni dettagliate per la struttura del report. Per interconnettere insiemi diversi, l'ACS offre la possibilità di indicare le connessioni tra insiemi di dati nella scheda omonima. Queste connessioni sono un analogo diretto del join sinistro in una query classica. Tuttavia, va tenuto presente che le query in qualsiasi set di dati non “conoscono” l’esistenza di altri set di dati, in definitiva, le relazioni tra i set di dati influenzeranno il layout dei dati secondo la struttura specificata nel “; scheda Impostazioni”.

Dettagliamo il problema con un esempio. Esiste un rapporto standard: Estratti conto salari per l'organizzazione della configurazione ZiK 8. È necessario che i tipi di calcoli nel rapporto siano raggruppati in determinati gruppi. Le corrispondenze vista-gruppo di calcolo vengono archiviate in una tabella di valori esterni. Per caricarlo nello schema di layout dei dati principale, creiamo un “oggetto set di dati” con il nome “Gruppi” (Figura 2). Effettuiamo una connessione con il “set di dati della query” - “Accruals” per tipo di calcolo (Figura 3). Nel "set di dati della richiesta" - "Accruals" ci sono informazioni per i gruppi, eliminiamo tutte le voci. Successivamente, nella scheda “Impostazioni” possiamo utilizzare il campo “Gruppo”, il cui valore viene caricato da una fonte dati esterna (Figura 4). Nella funzione di generazione del report integriamo il caricamento di dati esterni.

Funzione GeneraReport(Risultato = Non definito, Dati di decrittografia = Non definito, OutputInReportForm = True) Esporta

//ottenendo o formando la tabella richiesta dei valori “Gruppi” e scrivendola nella variabile con lo stesso nome

DatiEsterni = Nuova Struttura();//crea e riempie la struttura dei dati esterni
DatiEsterni.Insert(Gruppi);

UserPanelValue = TipicoReports.GetUserPanelSettingsValuesofObject(ThisObject);
DefaultSettings = ImpostazioniComposer.GetSettings();
TipiciReports.GetAppliedSetting(ThisObject);
TipiciReports.GenerateTypicalReport(ThisObject, Risultato, Dati di decrittografia, OutputToReportForm, Dati Esterni);
ImpostazioniLinker.LoadSettings(DefaultSetting);
Risultato restituito;

EndFunction

Se stessimo creando un report da zero, il codice di avvio della generazione del report sarebbe simile a questo:

ExternalDataSets = nuova struttura;
ExternalDataSets.Insert("Gruppi", Gruppi); //Gruppi: la tabella dei valori desiderata
SchemaComposizioneDati = GetLayout("SchemaComposizioneDatiMain"); //il nostro layout con il diagramma del flusso di dati
Impostazioni = DataCompositionScheme.DefaultSettings;
LayoutLinker = newDataLayoutLayoutLinker;
LayoutLayout = LayoutComposer.Execute(DataLayoutSchema, Impostazioni);
DataCompositionProcessor = nuovoDataCompositionProcessor;
DataCompositionProcessor.Initialize(LayoutLayout, ExternalDataSets);
TabDoc = Nuovo TabularDocument;
OutputProcessor = Nuovo OutputProcessorDataCompositionResultInTabularDocument;
OutputProcessor.SetDocument(TabDoc);
OutputProcessor.Output(DataCompositionProcessor);

Leggere 9660 una volta

41
Recentemente ho realizzato un report con un numero indefinito di colonne. Non volevo armeggiare con il codice, quindi ho deciso di farlo sul sistema di controllo degli accessi. Non c'era nessun problema con questo, era necessario allungare il risultato su un layout arbitrario (la tua intestazione +... 27
Anche se gli studenti CDS lo riscontrano il primo o il secondo giorno, dovrebbe essere nella sezione FAQ. Un semplice esempio di output programmatico di un report su un layout, utilizzando le impostazioni predefinite. //Prendi il diagramma da... 18
Quando si generano report sul sistema di controllo accessi, per impostazione predefinita tutti i raggruppamenti vengono espansi, ma a volte è necessario mostrare un report con i raggruppamenti compressi subito dopo la generazione! Questo codice nel modulo di report ti consente di comprimere... 10
In questa scheda puoi specificare quali connessioni vengono effettuate tra due o più set di dati, in base a quali parametri e condizioni..png 1. “Origine della connessione” - indica il primo set di dati, da... 9
Ciò che è necessario quando si sviluppano i report è che per un utente con diritti limitati, il report venga generato completamente senza verificare i diritti! Soprattutto se RLS è configurato. Esistono diversi modi per farlo: 1. Installa...

A volte, per ottenere un determinato risultato di layout, è necessario creare collegamenti tra i set di dati nel sistema di controllo degli accessi. Cercheremo di parlare di quando è necessario e come farlo nel nostro articolo.

Lo schema di layout dei dati implementato in 1C supporta tre tipi di origini dati (Fig. 1)

Origine dei dati

L'origine dati più ovvia e utilizzata dagli sviluppatori è la Query.

Il query designer implementato nella versione 8 di 1C è molto comodo e, nella maggior parte dei casi, è possibile collegare insieme più tabelle ed effettuare direttamente al suo interno i raggruppamenti e le selezioni necessarie.

In casi complessi, quando è richiesto o più opportuno ricorrere all'esecuzione di qualche codice (ad esempio, caricamento di dati da un file di terze parti) o quando non è possibile utilizzare una query, viene utilizzata la sorgente dati “Oggetto”. il salvataggio. Il codice arbitrario eseguito nel modulo deve avere una determinata struttura in uscita a cui il sistema di controllo accessi può accedere.

La terza fonte dati è “Unione”. In effetti, questa fonte può essere considerata come uno dei tipi di comunicazione. Combina (riduce più tabelle in una), senza corrispondenza, ma con la coincidenza di determinati campi. Cioè, se due tabelle unite hanno rispettivamente 3 e 4 righe, l'origine dati risultante avrà 7 righe.

Formulazione del problema

Come banco di prova sceglieremo la base UPP, versione 1.3.92.3, funzionante in modalità di applicazione normale.

Ci è stato affidato il seguente compito: utilizzando solo il sistema di controllo degli accessi, creare un report che visualizzi una tabella degli articoli acquistati dal documento, con i prezzi presi dal file inviato dalla controparte.

Quindi dobbiamo:

  1. Prendere la parte tabellare del documento di ricevuta;
  2. Carica il file nell'origine dati "Oggetto";
  3. Collega queste due fonti tramite un determinato parametro (nel nostro caso sarà codice);
  4. Visualizza la tabella risultante.

Processo di esecuzione

Esaminiamo tutti i passaggi elencati:

  • Creiamo una query per la parte tabellare del documento di ricevuta (Fig. 2)

Fig.2

  • Creare un oggetto set di dati (Fig. 3);

Fig.3

Qui è importante prestare attenzione al “Nome dell'oggetto contenente i dati”; questo è il nome che dovremo specificare nel codice del modulo di report.

  • Andiamo al modulo report e lì creiamo la procedura “Quando si compone il risultato” (Fig. 4);


Fig.4

Non descriveremo la procedura per ottenere i dati da un file esterno; presteremo attenzione a quella parte di codice che deve essere presente nel layout affinché si possano ottenere i dati per il “Data Set 2” (Fig. 5).

Fig.5

Importante! Quando si crea un "Oggetto" nel codice della procedura durante il collegamento, il valore del parametro StandardProcessing deve essere False.

Vai alla scheda "Collegamenti set di dati".

Collegamento di insiemi

Vai alla scheda corrispondente del diagramma (Fig. 6).

Vediamo una parte di tabella che è molto simile alla parte di tabella presente in Progettazione query, con alcune eccezioni. Per l'insieme di origine della comunicazione e l'insieme di destinazione della comunicazione, non è possibile selezionare la casella di controllo "Tutto", ma sono state aggiunte diverse colonne aggiuntive.

Nelle relazioni tra set di dati è possibile stabilire solo una relazione simile al left external join del costruttore della query.

Prima di creare una connessione, decidiamo lo scopo delle colonne:

  1. La sorgente del collegamento è il primo set di dati da cui verranno presi tutti i valori disponibili;
  2. Ricevitore della comunicazione – un insieme di dati da cui verranno selezionati i valori corrispondenti alla nostra condizione;
  3. Espressione di origine: un campo o un'espressione del primo set di dati rispetto al quale verrà effettuato il confronto;
  4. L'espressione di destinazione è un campo o un'espressione dell'insieme dipendente;
  5. Parametro – se si specifica il nome del parametro in questo campo, la comunicazione con il ricevitore verrà effettuata solo in base al valore specificato nel parametro;
  6. Lista di parametri – determina la possibilità di utilizzare una lista di valori come parametro;
  7. Condizione di connessione – specificando qui un'espressione utilizzando i campi sorgente, è possibile creare una condizione, il cui adempimento servirà come segnale per stabilire una connessione;
  8. Valore iniziale – mostra il valore iniziale della connessione;
  9. Relazione obbligatoria: determina se i campi utilizzati nell'origine (impostato su FALSE) o nella destinazione (impostato su TRUE) sono abilitati e in base a ciò aggiunge la relazione al layout.

Così:

  • La fonte della comunicazione sarà il risultato della nostra richiesta;
  • L'oggetto fungerà da ricevitore;
  • L'espressione sorgente sarà “NomenclatureCode”;
  • Espressione del destinatario “Nomenclatura”;
  • La comunicazione sarà obbligatoria (Fig. 7).

Se avessimo indicato il nome di una qualsiasi nomenclatura, o il suo tipo di riproduzione, o qualcos'altro come condizione di connessione, avremmo potuto ottenere un campione più accurato per il nostro compito. Il risultato delle nostre azioni può essere visto in Fig. 8

Fig.8

Non è stata trovata alcuna corrispondenza per le ultime due righe del report nel file dei prezzi.

A volte capita che i dati di un report non possano essere ottenuti utilizzando una query o una combinazione di query. È necessario utilizzare alcune procedure per raccogliere i dati e i dati vengono inseriti in una tabella di valori. Sorge la domanda: questi dati possono essere utilizzati in uno schema di composizione dei dati? Dopotutto, lo strumento SKD è potente e conveniente. Si scopre che è possibile utilizzare i dati della tabella dei valori come fonte di dati per un report nel sistema di controllo degli accessi e non è affatto difficile da fare. Questo articolo ti mostrerà come creare un report di questo tipo per i moduli regolari.
Quindi, come si crea un report ACS utilizzando i dati di una tabella di valori? Cominciando dall'inizio.
Innanzitutto apri il configuratore e crea un nuovo report esterno.

Aprire il modulo oggetto e creare una procedura predefinita durante la composizione del risultato (DocumentResult, Decryption Data, StandardProcessing)

All'interno di questa procedura raccoglieremo i dati e genereremo un report.
Nella procedura Durante la composizione del risultato, disabilitiamo l'elaborazione standard. Elaborazione standard = Falso;
Quindi formiamo una tabella di valori in modo arbitrario. I nomi delle colonne della tabella dei valori devono corrispondere ai campi futuri del set di dati nell'ACS:


Ad esempio, aggiungiamo tre righe di dati. Successivamente, creiamo l'output del report passo dopo passo.

  • Dal diagramma otteniamo le impostazioni predefinite.

  • Inviamo i dati di decrittazione alla variabile appropriata.

  • Creiamo il layout utilizzando il generatore di layout.

  • Trasferiamo il diagramma, le impostazioni e i dati di decodifica al layout del layout.

  • Eseguiamo il layout utilizzando il processore di layout. Per fare ciò, eseguire il metodo Initialize() del processore di composizione dati. Come parametri passiamo il layout di composizione dei dati, set di dati esterni (tipo: Struttura, la chiave della struttura deve corrispondere al nome dell'oggetto nello schema di composizione dei dati, il valore è la tabella di valori generata), dati di decrittazione.

  • Cancella il campo del documento del foglio di calcolo.

  • Visualizziamo il risultato in un documento di foglio di calcolo.
Il risultato è il seguente codice:
SchemaLayoutDati = OttieniLayout( "Schema di composizione dei dati principali"); //Impostazioni = DataCompositionScheme.DefaultSettings; // - Se lo fai come mostrato sopra (consigliato per alcune risorse), quando modifichi le impostazioni in modalità client // non vedrai queste modifiche, perché le impostazioni saranno sempre predefinite. Come farlo correttamente: opzione di seguito Impostazioni = ImpostazioniCompositore. OttieniImpostazioni(); DecryptionData = newDataCompositionDecryptionData; LayoutLinker = newDataLayoutLayoutLinker; LayoutLayout = LayoutLocker. Esegui (Schema Composizione Dati, Impostazioni, Decrittografia Dati); SetDatiEsterni = Nuova struttura( "Esempio di tabella dei valori", TZOutput); DataCompositionProcessor = nuovoDataCompositionProcessor; Processore di composizione dati. Inizializza (LayoutLayout, ExternalDataSet, DecryptionData); Risultato documento. Chiaro();

OutputProcessor = Nuovo OutputProcessorDataCompositionResultInTabularDocument; Processore di uscita. ImpostaDocumento(RisultatoDocumento); Processore di uscita. Output (processore di composizione dati); Aggiunta di un layout del diagramma di layout. Possiamo lasciare il nome come predefinito.

Creiamo un set di dati. Per fare ciò, aggiungi un nuovo set di dati del tipo Oggetto. Nel campo Nome dell'oggetto contenente i dati inseriamo il nome che abbiamo specificato come chiave durante la creazione della struttura DataSet esterno. Quindi aggiungiamo i campi. I nomi devono corrispondere esattamente ai nomi delle colonne nella tabella dei valori. Successivamente, possiamo specificare valori accettabili, formati, ecc.

Aggiungi risorse se necessario. I risultati verranno calcolati in base ad essi. Nel nostro caso, questi sono i campi Quantità e Importo.

Nella scheda Impostazioni, utilizzando il designer delle impostazioni, creiamo un'opzione di report predefinita


Salviamo il nostro report. Lo lanciamo nel client e lo creiamo. Nell'immagine è mostrato un esempio di esecuzione di un report ACS utilizzando i dati della tabella dei valori.

È tutto. Abbastanza semplice, vero?

Il report di esempio risultante può essere scaricato
Ciao!

Oggi voglio descrivere un argomento che non puoi comprendere senza l'attrezzatura subacquea :) ;)

Le immersioni subacquee significano che l'immersione è piuttosto profonda. Ci sono pochi riferimenti a questo argomento in letteratura e non sarai in grado di capirlo finché non ne sentirai lo stimolo. Non ci sarà nemmeno un messaggio per un'azione del genere;) A proposito, la documentazione ne parla in modo molto scarso e incoerente, devi rivolgerti alla letteratura di terze parti;

Ad esempio, consiglio vivamente "Sviluppo di report complessi in 1C:Enterprise 8.2". Data Composition System", (in particolare si vedano le pagg. 224, 267 e 473)


In ACS ci sono 2 tipi di sorgenti dati: Query, oggetto e unione (questa cosa non conta, non è una sorgente di dati, ma un elaboratore di dati esistenti). Vedere la Figura 1:

Innanzitutto, descriverò cosa vogliamo ottenere come output:

Report, l'utente ha fatto clic su " Modulo» e viene visualizzato un elenco di voci (vedi Fig. 2):

Sì, ho fatto un’inesattezza e cioè: non c’è nessun pulsante” Modulo", ma c'è un pulsante" nuova azione"(Spiegherò poco dopo perché è successo;)

Si si! Un altro punto: l'intero elenco è derivato dal set di dati "Oggetto":

Soluzione:

  1. Creare un report esterno;
  2. Aggiungi un layout ACS, chiamiamolo “Schema layout dati principali”;
  3. Aggiungiamo ad esso il set di dati “Oggetto”, gli assegniamo il nome “Elenco nomenclature” (dovrebbe essere lo stesso di Fig. 3);
  4. Non sperimentiamo troppo con le impostazioni del report, lasciamo che tutto sia semplice (vedi Fig. 4)

Ok, metà del lavoro fatto ;)

Ora generiamo il modulo di report principale (sì, ancora una cosa! La mia configurazione funziona su un'interfaccia normale, ma penso che troverai una soluzione sui moduli gestiti;) Quindi, il modulo:

È qui che sorge il problema! Se clicchiamo sul pulsante “genera” (Fig. 5.), vedremo un errore!


Ho dedicato questo articolo alla risoluzione di questo problema!

Non era possibile intercettare l'evento del pulsante “Genera”, quindi ho deciso di utilizzare una stampella. Ho avviato la configurazione in modalità debug e ho provato a trovare il pulsante "genera".

Ho inserito la procedura “Genera” nel modulo, ma non ci sono voci, ho dovuto ridefinire l'azione del pulsante “modulo” prima di aprire il modulo:


Nella fig. Oltre a modificare l'azione del modulo, la Figura 8 mostra un esempio di richiesta, la sua elaborazione e trasmissione dei dati generati al sistema di controllo degli accessi. Studiamolo più attentamente:

  1. Generiamo dati di input per il sistema di controllo accessi;
  2. Inizializziamo il sistema di controllo degli accessi;
  3. Mostriamo il risultato SUL FORM (attenzione anche a questo!).

Ricordiamo il diagramma di interazione degli oggetti del sistema di composizione dei dati:

Lo schema del layout dei dati in un report esterno è disponibile come oggetto globale in un metodo del modulo Schema di composizione dei dati. Puoi anche accedervi per nome passandolo al metodo OttieniLayout(vedi Fig. 8)

La parte principale del codice è la seguente:

Richiesta = Nuova richiesta; Query.Text = "SELECT | Nomenclature.Name as Nomenclature |FROM | Directory.Nomenclature AS Nomenclature"; NomenclatureList = Request.Run().Upload(); DataSet = Nuova struttura("NomenclatureList", NomenclatureList); //SKD = ​​GetLayout("MainData LayoutScheme"); SKD = ​​DataCompositionScheme; LayoutComp = nuovo DataLayoutComposer; layoutComp = LayoutComp.Execute(SKD, SKD.DefaultSettings); CompDataProcessor = nuovo DataCompositionProcessor; ProcessorCompData.Initialize(layoutComp, DataSets); output = nuovo DataCompositionResultOutputProcessorInTabularDocument; output.SetDocument(FormElements.Result); output.Output(ProcessorCompData, true);

SÌ! Ecco un altro bel momento!!!

In questo esempio, come puoi vedere (vedi Fig. 2), l'output viene eseguito in un modulo e non in una tabella. documento! E questo è molto positivo, perché possiamo lavorare con il modulo (intercettare a livello di codice gli eventi dell'elemento del modulo, eseguire ogni sorta di trucchi con il trascinamento della selezione, ecc.;)

In un foglio di calcolo possiamo semplicemente visualizzare i dati elaborati sullo schermo e trasferire il controllo del documento all'utente e non possiamo in alcun modo influenzare l'ulteriore processo di modifica di questo contenuto!

Consulta il sistema di aiuto " Campo del documento del foglio di calcolo “, e fornirò solo un estratto dalla documentazione integrata del sistema 1c Enterprise 8.2:

“Un campo documento di un foglio di calcolo è un documento di foglio di calcolo inserito in un modulo. Insieme alla varietà di funzionalità di progettazione di un documento di foglio di calcolo, ciò consente di organizzare l'elaborazione degli eventi che si verificano quando si selezionano celle, immagini e altri controlli inseriti in un campo di un documento di foglio di calcolo.

Ok, come si suol dire, buona fortuna nella battaglia;)

Pubblicazioni sull'argomento