Come configurare smartphone e PC. Portale informativo
  • casa
  • Windows Phone
  • 1s Saldi iniziali e finali SKD. Un errore nel calcolo dei saldi nel sistema di stoccaggio e la sua correzione software utilizzando l'esempio di un rapporto universale

1s Saldi iniziali e finali SKD. Un errore nel calcolo dei saldi nel sistema di stoccaggio e la sua correzione software utilizzando l'esempio di un rapporto universale

Non so quante persone abbiano già riscontrato l’errore di calcolare i saldi iniziali e finali per raggruppamenti. Personalmente sono stato “fortunato”, più di una volta. Il motivo, come ho potuto scoprire, risiede nell'errata impostazione dei campi dati ACS, l'importanza di cui molti programmatori alle prime armi (e non così alle prime armi) non sono ancora del tutto consapevoli.

Quando un set di dati ACS viene creato automaticamente in base a una query, di solito non sorgono problemi, perché la piattaforma stessa compila correttamente le impostazioni del campo in base al testo della richiesta. Ma ci sono situazioni in cui le impostazioni del campo dati non vengono compilate automaticamente (ad esempio, si utilizza un'origine dati esterna) e i dati di origine contengono movimenti con saldi e fatturati.

Se non hai mai riscontrato questo problema prima, per comprenderne meglio l'essenza, suggerisco di riprodurlo tu stesso utilizzando un rapporto universale (basato sui metadati). Lanciamo il report, selezioniamo l'eventuale registro di accumulo non vuoto con saldi e fatturato, abilitiamo la casella "Registrazioni dettagliate" nelle impostazioni del report (), indichiamo alcuni raggruppamenti e aggiungiamo il Registratore ai campi di output. Voilà: i saldi di apertura e chiusura vengono riepilogati per ciascun raggruppamento. Il risultato è un report con numeri assolutamente errati, che non può essere mostrato agli utenti.

Per risolvere questo problema, è necessario compilare correttamente le impostazioni del campo del set di dati ACS, in particolare il campo "Ruolo", che è di fondamentale importanza.

SOLUZIONE interattiva ( non adatto per il rapporto universale):

Apri il diagramma del layout dei dati per il tuo report e osserva le impostazioni del campo del set di dati.

Per i campi dei saldi iniziali e finali di ciascuna risorsa è necessario compilare il ruolo: selezionare il gruppo di ruoli “Resto” e in esso specificare rispettivamente il valore “Saldo iniziale” o “Saldo finale”. COSÌ ( ) questo viene fatto nel costruttore ACS.

Allo stesso modo, devi assegnare il ruolo "Dimensione" a tutte le dimensioni nel tuo set di dati.

Ma questo non basta affinché i report funzionino correttamente. Per calcolare correttamente i campi residui è necessario conoscere il periodo di ciascun movimento in modo da collocarli nel corretto ordine cronologico. Se la tua origine dati originale non dispone di un campo periodo, devi aggiungerlo lì. Se il campo periodo esiste già nel set di dati, deve essere specificato con il ruolo "Periodo" e il numero di periodo corrispondente (puoi leggere ulteriori informazioni sulla numerazione dei periodi nella guida).

Tali impostazioni dei campi dati ACS nella maggior parte dei casi consentono di ottenere il calcolo corretto dei saldi raggruppando quando con le impostazioni predefinite sono calcolati in modo errato.

SOLUZIONE software (utilizzando l'esempio dell'Universal Metadata Report):

Ora vediamo come correggere lo stesso errore nell'Universal Metadata Report. Il report universale differisce dalla maggior parte degli altri report in quanto lo schema di layout dei dati viene generato interamente a livello di programmazione, quindi è necessario configurare anche i ruoli per i campi dati ACS a livello di programmazione.

Per i ruoli saldi iniziali e finali per ciascuna risorsa Il modo più semplice è non reinventare la ruota (tutto è già stato scritto prima di noi) e utilizzare la procedura standard Riempi DataSetFieldRemainder() da modulo generale StandardReports. Qui si passano il campo del set di dati e il nome della risorsa come parametri e, di conseguenza, nel set di dati viene creato un campo resto con un ruolo compilato correttamente.

Allo stesso modo, quando si creano campi del set di dati per le dimensioni, è necessario assegnare loro il ruolo Dimensione. Il codice sarà qualcosa del genere:

Nuova Dimensione = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, Dimensione.Nome, Dimensione.Sinonimo); Nuova Dimensione.Role.Dimension = Vero;

Le manipolazioni con i campi delle risorse e delle dimensioni sopra descritte sono necessarie, ma non sufficienti per risolvere il problema: il problema principale del report universale è la mancanza di numerazione dei periodi. I campi del periodo sono presenti nel set di dati, ma i relativi ruoli non sono compilati.

I campi periodo vengono aggiunti al report tramite la procedura del modulo generale StandardReports.AddPeriodFieldsToDataSet(), che viene richiamata dalla procedura del modulo oggetto AddDataSetFields(). Sfortunatamente, questa procedura non assegna i numeri dei periodi.

Inoltre, i campi "Numero riga" e "Registrar" non vengono aggiunti a livello di codice al report. Mi è sembrato strano perché... sono presenti nel set di dati finale.

Come si è scoperto, campi "Numero di riga" e "Registrar"(Registratore) viene aggiunto automaticamente dalla piattaforma stessa quando viene inizializzato il generatore di impostazioni. Inoltre, la piattaforma non riempie i ruoli per i campi che crea, e non è possibile riempirli a livello di codice, il che crea problemi quando si lavora ulteriormente con loro. Ma se crei questi campi “manualmente” e assegni loro a livello di codice i ruoli corretti, la piattaforma non tenterà più di crearli di nuovo.

Di seguito propongo una ricetta che mi ha aiutato a risolvere quasi completamente questo problema della piattaforma e dell'Universal Metadata Report:

Ecco questo frammento di codice del modulo oggetto:

// Aggiungi campi periodo Se TableName = "RemainsAndTurnover" OR TableName = "Fatturato" Then TipicoReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); finisci se; deve essere sostituito con quanto segue: // Aggiungi campi periodo Se TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TipicoReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Compila i campi del servizio e inserisci i periodi manualmente, perché la piattaforma non li compila Field = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Campo = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, "Registratore", "Registrar"); Field.Role.PeriodNumber = 2; сч = 3; Per ogni FieldPeriod dall'elenco dei periodi ciclo FieldPeriod.Value.Role.PeriodNumber = count; Se conteggio > 3 Allora FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; finisci se; sc = sc+1; FineCiclo; finisci se;

Sono riuscito a trovare una limitazione associata a questa soluzione. Per il corretto calcolo dell'inizio. e contro. saldi, è necessario che quando si utilizzano i dettagli di un documento del registrar in un rapporto, sia selezionato anche il registrar stesso. Altrimenti, il rapporto universale dopo tali modifiche non provoca più allergie tra gli utenti.

AGGIORNAMENTO: mi è stato detto nei commenti che una volta sul disco ITS è stato pubblicato un articolo su questo argomento. Purtroppo questo articolo mi è sfuggito, ma mi ha potuto aiutare solo in parte a risolvere i problemi del rapporto universale. Purtroppo, anche i problemi della piattaforma con i campi del servizio ACS, come "Registratore", non sono descritti lì.

In ogni caso, spero che il mio articolo possa aiutare tutti coloro che hanno problemi simili. Ho passato molto tempo a cercare questa soluzione...

Non so quante persone abbiano già riscontrato l’errore di calcolare i saldi iniziali e finali per raggruppamenti. Personalmente sono stato “fortunato”, più di una volta. Il motivo, come ho potuto scoprire, risiede nell'errata impostazione dei campi dati ACS, l'importanza di cui molti programmatori alle prime armi (e non così alle prime armi) non sono ancora del tutto consapevoli.

Quando un set di dati ACS viene creato automaticamente in base a una query, di solito non sorgono problemi, perché la piattaforma stessa compila correttamente le impostazioni del campo in base al testo della richiesta. Ma ci sono situazioni in cui le impostazioni del campo dati non vengono compilate automaticamente (ad esempio, si utilizza un'origine dati esterna) e i dati di origine contengono movimenti con saldi e fatturati.

Se non hai mai riscontrato questo problema prima, per comprenderne meglio l'essenza, suggerisco di riprodurlo tu stesso utilizzando un rapporto universale (basato sui metadati). Lanciamo il report, selezioniamo l'eventuale registro di accumulo non vuoto con saldi e fatturato, abilitiamo la casella "Registrazioni dettagliate" nelle impostazioni del report (), indichiamo alcuni raggruppamenti e aggiungiamo il Registratore ai campi di output. Voilà: i saldi di apertura e chiusura vengono riepilogati per ciascun raggruppamento. Il risultato è un report con numeri assolutamente errati, che non può essere mostrato agli utenti.

Per risolvere questo problema, è necessario compilare correttamente le impostazioni del campo del set di dati ACS, in particolare il campo "Ruolo", che è di fondamentale importanza.

SOLUZIONE interattiva ( non adatto per il rapporto universale):

Apri il diagramma del layout dei dati per il tuo report e osserva le impostazioni del campo del set di dati.

Per i campi dei saldi iniziali e finali di ciascuna risorsa è necessario compilare il ruolo: selezionare il gruppo di ruoli “Resto” e in esso specificare rispettivamente il valore “Saldo iniziale” o “Saldo finale”. COSÌ ( ) questo viene fatto nel costruttore ACS.

Allo stesso modo, devi assegnare il ruolo "Dimensione" a tutte le dimensioni nel tuo set di dati.

Ma questo non basta affinché i report funzionino correttamente. Per calcolare correttamente i campi residui è necessario conoscere il periodo di ciascun movimento in modo da collocarli nel corretto ordine cronologico. Se la tua origine dati originale non dispone di un campo periodo, devi aggiungerlo lì. Se il campo periodo esiste già nel set di dati, deve essere specificato con il ruolo "Periodo" e il numero di periodo corrispondente (puoi leggere ulteriori informazioni sulla numerazione dei periodi nella guida).

Tali impostazioni dei campi dati ACS nella maggior parte dei casi consentono di ottenere il calcolo corretto dei saldi raggruppando quando con le impostazioni predefinite sono calcolati in modo errato.

SOLUZIONE software (utilizzando l'esempio dell'Universal Metadata Report):

Ora vediamo come correggere lo stesso errore nell'Universal Metadata Report. Il report universale differisce dalla maggior parte degli altri report in quanto lo schema di layout dei dati viene generato interamente a livello di programmazione, quindi è necessario configurare anche i ruoli per i campi dati ACS a livello di programmazione.

Per i ruoli saldi iniziali e finali per ciascuna risorsa Il modo più semplice è non reinventare la ruota (tutto è già stato scritto prima di noi) e utilizzare la procedura standard Riempi DataSetFieldRemainder() da modulo generale StandardReports. Qui si passano il campo del set di dati e il nome della risorsa come parametri e, di conseguenza, nel set di dati viene creato un campo resto con un ruolo compilato correttamente.

Allo stesso modo, quando si creano campi del set di dati per le dimensioni, è necessario assegnare loro il ruolo Dimensione. Il codice sarà qualcosa del genere:

Nuova Dimensione = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, Dimensione.Nome, Dimensione.Sinonimo); Nuova Dimensione.Role.Dimension = Vero;

Le manipolazioni con i campi delle risorse e delle dimensioni sopra descritte sono necessarie, ma non sufficienti per risolvere il problema: il problema principale del report universale è la mancanza di numerazione dei periodi. I campi del periodo sono presenti nel set di dati, ma i relativi ruoli non sono compilati.

I campi periodo vengono aggiunti al report tramite la procedura del modulo generale StandardReports.AddPeriodFieldsToDataSet(), che viene richiamata dalla procedura del modulo oggetto AddDataSetFields(). Sfortunatamente, questa procedura non assegna i numeri dei periodi.

Inoltre, i campi "Numero riga" e "Registrar" non vengono aggiunti a livello di codice al report. Mi è sembrato strano perché... sono presenti nel set di dati finale.

Come si è scoperto, campi "Numero di riga" e "Registrar"(Registratore) viene aggiunto automaticamente dalla piattaforma stessa quando viene inizializzato il generatore di impostazioni. Inoltre, la piattaforma non riempie i ruoli per i campi che crea, e non è possibile riempirli a livello di codice, il che crea problemi quando si lavora ulteriormente con loro. Ma se crei questi campi “manualmente” e assegni loro a livello di codice i ruoli corretti, la piattaforma non tenterà più di crearli di nuovo.

Di seguito propongo una ricetta che mi ha aiutato a risolvere quasi completamente questo problema della piattaforma e dell'Universal Metadata Report:

Ecco questo frammento di codice del modulo oggetto:

// Aggiungi campi periodo Se TableName = "RemainsAndTurnover" OR TableName = "Fatturato" Then TipicoReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); finisci se; deve essere sostituito con quanto segue: // Aggiungi campi periodo Se TableName = "RemainsAndTurnover" OR TableName = "Turnover" Then PeriodList = TipicoReports.AddPeriodFieldsToDataSet(DataCompositionScheme.DataSets); //Compila i campi del servizio e inserisci i periodi manualmente, perché la piattaforma non li compila Field = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, "RowNumber", "RowNumber"); Field.Role.PeriodNumber = 1; Campo = TipicoReports.AddDataSetField(DataCompositionSchema.DataSets, "Registratore", "Registrar"); Field.Role.PeriodNumber = 2; сч = 3; Per ogni FieldPeriod dall'elenco dei periodi ciclo FieldPeriod.Value.Role.PeriodNumber = count; Se conteggio > 3 Allora FieldPeriod.Value.Role.PeriodType = DataCompositionPeriodType.Additional; finisci se; sc = sc+1; FineCiclo; finisci se;

Sono riuscito a trovare una limitazione associata a questa soluzione. Per il corretto calcolo dell'inizio. e contro. saldi, è necessario che quando si utilizzano i dettagli di un documento del registrar in un rapporto, sia selezionato anche il registrar stesso. Altrimenti, il rapporto universale dopo tali modifiche non provoca più allergie tra gli utenti.

AGGIORNAMENTO: mi è stato detto nei commenti che una volta sul disco ITS è stato pubblicato un articolo su questo argomento. Purtroppo questo articolo mi è sfuggito, ma mi ha potuto aiutare solo in parte a risolvere i problemi del rapporto universale. Purtroppo, anche i problemi della piattaforma con i campi del servizio ACS, come "Registratore", non sono descritti lì.

In ogni caso, spero che il mio articolo possa aiutare tutti coloro che hanno problemi simili. Ho passato molto tempo a cercare questa soluzione...

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 è configurato RLS. Esistono diversi modi per farlo: 1. Installa...

Un altro errore comune quando si creano report sui sistemi di controllo degli accessi per l'impresa 1C è che i saldi iniziali e finali nelle tabelle virtuali dei registri di accumulo vengono calcolati in modo errato. Ad esempio, creiamo un semplice report che mostrerà saldi e movimenti nel registro MerciInMagazzino. La sua richiesta sarà simile a questa:

Creeremo anche semplici impostazioni di varianti:

Di conseguenza, otteniamo il seguente rapporto:

Hai una domanda o hai bisogno dell'aiuto di un consulente?

Perché Non abbiamo indicato da nessuna parte l'inizio e la fine del periodo; il rapporto dovrebbe mostrare i dati dall'inizio della manutenzione del database. Ma nel nostro magazzino e nei raggruppamenti di articoli sono presenti saldi di apertura diversi da zero. È facile capire che i dati vengono visualizzati in modo errato, perché... Non dovrebbero esserci saldi all'inizio della manutenzione del database. Sebbene la richiesta stessa sia corretta.

Il fatto è che l'ACS ha il proprio meccanismo per il calcolo dei saldi. Per il suo corretto funzionamento è necessario determinare in modo inequivocabile la posizione dei registratori sull'asse del tempo. In questo caso nella selezione è presente solo il collegamento quindi il sistema di layout non può farlo. Per evitare questo comportamento del sistema di controllo accessi è necessario selezionare nella richiesta il campo PeriodSecond. In questo caso il sistema calcolerà correttamente i saldi:

Ricorda che i campi con il ruolo “Periodo” hanno una casella di controllo “Ulteriore”. E se per qualche motivo viene rimosso dal campo PeriodSecond, il report tornerà alla versione errata. Per calcolare correttamente i saldi è necessario che sia selezionata la casella di controllo "Ulteriori" nel ruolo oppure la presenza del campo nei campi del report selezionati a livello di variante.

Buona giornata, cari lettori del sito blog! L'ultima volta abbiamo già toccato un argomento che parlava dell'utilizzo della funzione. E oggi, nel primo di questa serie di articoli, lo scopriremo A cosa servono i ruoli dei campi di composizione dei dati? e prendere in considerazione anche esempi di ricoprimento di questi ruoli.

Indica il ruolo del campo ACS cos'è questo campo?. Ogni ruolo del campo può contenere la propria proprietà. Ad esempio, ha un valore numerico e contiene il numero del periodo se il campo è punto. Se il valore della proprietà “Periodo” è 0 (zero), significa che questo campo non è un punto. Oppure la proprietà “Dimensione”: contiene un'indicazione che il campo è una dimensione. Se il campo è una dimensione, queste informazioni vengono utilizzate durante il calcolo dei totali per i campi del saldo.

Per ogni campo nello schema di composizione dei dati è possibile specificare un ruolo. Ruoli influenzare la correttezza dei calcoli del saldo. In particolare, il saldo iniziale e finale secondo alcune tabelle. Se nella query viene selezionata la tabella virtuale “Saldi e fatturati”, i saldi iniziale e finale vengono calcolati utilizzando un algoritmo complesso, soprattutto se utilizziamo spread aggiuntivi per periodo.

Ma se nelle query tutto ciò funziona correttamente, sulla base di una serie di campi di output, nella composizione dei dati le cose vanno leggermente peggio. Dopotutto, non sappiamo quali campi l’utente selezionerà effettivamente. Tutto dipenderà dalle impostazioni della sua versione del report, che potrà modificare in qualsiasi momento. Pertanto, il sistema di composizione dei dati dispone di un proprio meccanismo per calcolare i saldi di apertura e chiusura per un determinato insieme di dati e i ruoli vengono utilizzati di conseguenza. Apriamolo e vediamo che è possibile impostare i ruoli per ciascun campo.

Aggiungiamo un set di dati di query. Per fare ciò, dobbiamo rendere attivo l'elemento radice “Query Builder”. Passiamo alla tabella virtuale “Saldi e Fatturati” del registro di accumulazione. Cosa vediamo?

Come puoi vedere dall'illustrazione sopra, vediamo che per alcuni campi il ruolo è stato ricoperto. Ciò è accaduto perché è impostato il flag di completamento automatico. Ma questo non è sempre possibile, quindi a volte devi inserire il ruolo manualmente. Diamo un'occhiata ad un paio di esempi.

Supponiamo che in una query utilizziamo, ad esempio, l'operatore del linguaggio di query “SELECT”. Descriviamo la seguente condizione:

SELEZIONE QUANDO Prodotto RimanenzeRestantiEFatturato.Nomenclatura = Valore(Directory.Nomenclature.EmptyLink) THEN Valore(Directory.Nomenclature.Shampoo) ELSE Prodotto RimanenteRestantiEFatturato.Nomenclatura END

Questa voce significa che se l'elemento corrisponde a un collegamento vuoto (ci riferiamo alla directory dei valori della funzione “Nomenclatura”, collegamento vuoto), verrà restituito il valore dell'elemento predefinito. Supponiamo che nella nostra configurazione ci sia un elemento così predefinito e si chiami "Shampoo". Altrimenti restituiamo il valore dell'oggetto stesso. Otteniamo quanto segue:

Come puoi vedere, il ruolo non è stato compilato nel campo “Nomenclatura”. Ma come puoi vedere nell'immagine, in realtà non abbiamo inserito un ruolo per il campo “Campo1”, e in questo caso il resto non verrà calcolato correttamente.

Esistono altri esempi in cui il ruolo non può essere assegnato in modo indipendente. Ad esempio, questo è l'uso di , ovvero una determinata tabella di valori viene fornita come input, diciamo caricata da un altro database, e da essa è necessario calcolare i saldi. In questo caso, dobbiamo assegnare noi stessi i ruoli. Vedremo come avviene questa operazione.

Alla fine dell'articolo voglio consigliartene uno gratuito di Anatoly Sotnikov. Questo è un corso tenuto da un programmatore esperto. Ti mostrerà separatamente come creare report nel sistema di controllo degli accessi. Devi solo ascoltare attentamente e ricordare! Riceverai le risposte alle seguenti domande:
  • Come creare un semplice rapporto di elenco?
  • A cosa servono le colonne Campo, Percorso e Titolo nella scheda "Campi"?
  • Quali sono le limitazioni per i campi del layout?
  • Come configurare correttamente i ruoli?
  • Quali sono i ruoli dei campi del layout?
  • Dove posso trovare la scheda di composizione dei dati in una query?
  • Come configurare i parametri nel sistema di controllo degli accessi?
  • Diventa ancora più interessante...
Forse non dovresti provare a navigare in Internet da solo alla ricerca delle informazioni necessarie? Inoltre, tutto è pronto per l'uso. Inizia e basta! Tutti i dettagli su cosa c'è nelle video lezioni gratuite

I migliori articoli sull'argomento