LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam

Un saluto a tutti i lettori di infostart. Questo articolo sarà dedicato al problema della creazione di una tabella di valori arbitraria sotto forma di un'applicazione gestita a livello di codice.

Caratteristiche dell'attività.

Chiunque abbia programmato in un'applicazione normale si trova spesso di fronte al compito di ottenere una tabella di valori arbitraria su un modulo. Una tabella di valori arbitraria è intesa come una tabella, il cui numero e tipo di colonne non è noto in anticipo. Cioè, ci possono essere 3 colonne, forse 6 o forse 8. In una normale applicazione, tutto è semplice: è possibile posizionare l'elemento "Tabella dei valori" nel modulo di elaborazione, quindi trasferire la tabella dei valori creata a questo elemento a livello di programmazione. Quindi un semplice comando:

Modulo Elements.TableField.CreateColumns ();

ottenere una tabella di valori già pronta sul modulo. Sembrerebbe che potrebbe essere più facile.

Era tutto in una normale applicazione. Tutto è cambiato nell'applicazione gestita. Non è così facile creare una tabella arbitraria. Ora è necessario parametrizzare in modo rigido la tabella dei valori sul modulo o crearla a livello di codice (descrivere, beh, questa è, in effetti, l'essenza dell'applicazione gestita stessa). Questo è ciò che proveremo a fare: creare a livello di codice una tabella di valori arbitraria su un form gestito.

La soluzione del problema.

La prima cosa che dobbiamo fare è definire come apparirà la tabella nel modulo. La cosa principale è che non è necessario creare alcun elemento del modulo durante l'elaborazione. Lo creeremo a livello di programmazione, come l'intera tabella. Cioè, la tabella verrà descritta e creata al momento dell'apertura del modulo o utilizzando un pulsante: è così che chiunque ne ha bisogno.

La creazione di una tabella sul form avviene tramite la descrizione della tabella dei valori come attributo:
ChoiceType Array \u003d New Array; Array ofChoiceType.Add (Type ("ValuesTable")); ChoiceTypeDescription \u003d NewTypeDescription (ArrayChoiceType); ArrayAttributes \u003d New Array; Array of Attributes.Add (New Form Attribute ("Schedule Table", DescriptionTypeOf choice, "", "TZN")); Ora dobbiamo creare una tabella di valori programmatica che contenga i dati. Se la tabella dei valori è ottenuta da una query, tutto è più o meno ordinato. Se la tabella viene creata manualmente, il valore delle colonne che conterranno numeri o date può essere creato tramite la "Descrizione dei tipi". La linea di fondo è che le colonne nella tabella dei valori devono essere di qualche tipo. Se, ad esempio, si presume che l'utente inserirà i dati in queste colonne in modo interattivo, non è possibile aggiungere una colonna della tabella dei valori semplicemente con un nome, deve avere un tipo. Tieni presente che questo è molto importante. trasferiremo questi tipi nella tabella del modulo.
Creiamo una tabella che contiene diverse colonne:
KD \u003d New Date Qualifiers (Date Parts.Time); ArrayKD \u003d New Array; ArrayCD.Add (Type ("Date")); TypeDescriptionTime \u003d Nuovo TypeDescription (ArrayKD, KD); TK \u003d Nuova tabella dei valori;
TZ.Kolonki.Add ("S", DescriptionTypesTime);
TK.Kolonki.Add ("Before", DescriptionTypesTime);
TK.Kolonki.Add ("nome completo");
TK.Kolonki.Add ("Note"); // Nome completo e righe di note Successivamente, riempiremo la nostra tabella di programma TK con i dati necessari. Otteniamo la tabella TK, che contiene i valori necessari ed è pronta per essere trasferita all'attributo del form creato. Per ogni colonna da TK. Loop di colonne

Array of Attributes.Add (New Form Attribute (Column.Name, Column.ValueType, "ScheduleTable"));
Fine ciclo;
ModifyAttributes (ArrayAttributes);
ChoiceFieldsTable \u003d Elements.Add ("TZN", Type ("FormTable"));
ChoiceFieldsTable.PutKData \u003d "ScheduleTable";
ChoiceFieldsTable.Display \u003d DisplayTable.List;

Ecco una combinazione così semplice e il nostro tavolo è pronto.

Per ogni colonna da TK. Loop colonna

NewElement \u003d Elements.Add (Column.Name, Type ("FormField"), ChoiceFieldsTable);
NewElement.View \u003d FormFieldKind.InputField;
NewItem.PathData \u003d "ScheduleTable." + Column.Name;
NewElement.Width \u003d 10;
Fine ciclo;

Il design condizionale, se ne abbiamo bisogno, scriviamo anche manualmente, il menu dei comandi - manualmente. Anche i gestori di tabelle sono scritti a mano. Ad esempio, per aggiungere un gestore di eventi per la tabella Seleziona:

ChoiceFieldsTable.SetAction ("Choice", "TZNSelection");

Per elaborare questo evento, viene scritta una procedura separata sotto forma di procedura:

& Sul client
Procedura TZNSelection (TK, SelectedString, Field, StandardProcessing)
// il gestore comanda EndProcedure

Si noti che i gestori di tabelle vengono attivati \u200b\u200bsul client e pertanto devono avere un puntatore al compilatore di comandi

& Sul client

Bene, e l'ultima cosa che volevo aggiungere è che dopo tutte queste azioni, non dimentichiamo di trasferire la tabella finita nell'attributo form:

ValueVRequisitForm (TK, "Schedule Table");

Questo è il risultato:


Ed ecco l'elaborazione dell'evento "Seleziona":



Epilogo.

Spero che questo articolo aiuti quei programmatori 1C che iniziano a creare tabelle su un modulo a livello di codice.

Puoi scaricare un'elaborazione che crea in modo programmatico una tabella di valori e output in un modulo gestibile con commenti per aiutarti a creare le tabelle.

Pubblicato il 21 settembre 2011

Tabella dei valori 1C - parte 3. Metadati. Scorrendo le colonne di una tabella di valori

In questo articolo ti spiegherò come lavorare con la tabella dei valori di una struttura "sconosciuta", come iterare sulle colonne della tabella dei valori, come estrarre i dati da colonne e righe senza usare i nomi delle colonne. (Questo articolo si riferisce a un ciclo di articoli 1C da zero; programmazione 1c da zero; tabella di valori 1c)

Per spiegare il materiale e per poter eseguire i nostri esempi di codice "live", ne abbiamo bisogno tabella di prova dei valori 1C... Alcuni dei nostri esempi estrarranno i dati dalla tabella dei valori, quindi creeremo una tabella con tre colonne "Cognome", "Nome", "Patronimico" e aggiungeremo una piccola quantità di dati - fino a 3 righe :)

Quindi, creiamo una tabella di prova dei valori 1C e la compiliamo:

My TZ \u003d Nuova tabella dei valori; // crea una nuova tabella di valori memorizzata nella variabile "MyTZ" MyTZ.Columns.Add ("Last name"); // crea una colonna "Cognome" My TZ.Columns.Add ("Name"); // crea una colonna "Name" My TZ.Columns.Add ("Patronymic"); // crea una colonna "Patronimico" // aggiunge la prima riga alla nostra tabella di valori NewString \u003d MyTZ.Add (); NewStroka.Surname \u003d "Chapaev"; NewStroka.Name \u003d "Vasily"; NewStroka.Patronymic \u003d "Ivanovich"; // aggiunge la seconda riga NewString \u003d MyTZ.Add (); NewStroka.Surname \u003d "Dzerzhinsky"; NewString.Name \u003d "Felix"; NewStroka Patronymic \u003d "Edmundovich"; // aggiunge la terza riga NewString \u003d My TZ.Add (); NewStroka.Surname \u003d "Kotovsky"; NewStroka.Name \u003d "Gregory"; NewStroka.Patronymic \u003d "Ivanovich";

La nostra tabella di test è composta da tre colonne: nome, cognome, patronimico; e ha tre righe piene con i nomi degli eroi della guerra civile.

Il primo esempio di codice enumera le colonne della tabella dei valori 1C come raccolta.

// visualizza i nomi di tutte le colonne di TK For Each Column From My TZ.Columns Cycle Report ("Column name:" + Column.Name); Fine ciclo;

Il nostro ciclo mostrerà tutti i nomi delle colonne nella finestra del messaggio 1C:

Nome colonna: Cognome Nome colonna: Nome Nome colonna: Secondo nome

Vediamo che uno speciale ciclo di iterazione della raccolta viene utilizzato per iterare sulle colonne, simile al ciclo di iterazione delle stringhe (nell'articolo precedente). Le mie colonne TZ è una raccolta di colonne della tabella dei valori 1C "MyTZ"... La raccolta contiene oggetti del tipo "ColumnTableValues" Ogni oggetto di questo tipo è sia una colonna di una tabella di valori che contiene proprietà e metodi. Facendo riferimento a queste proprietà e metodi, otteniamo le informazioni necessarie su una colonna o eseguiamo altre azioni con essa.

Ad esempio, facendo riferimento alla proprietà "Nome" (Column.Name) otteniamo il nome della colonna corrente.

Vorrei attirare la vostra attenzione sul titolo del ciclo: "For Each Colonna From MyTZ.Columns Loop "Variabile denominata "Colonna" inventato da noi. Non è necessario utilizzare lo stesso nome. Ad esempio, puoi nominare questa variabile come preferisci "MyCurrentColumn" Quindi l'esempio sopra sarà simile a questo:

// visualizza i nomi di tutte le colonne del TK Per ogni MyCurrentColumn From MyTZ.Columns Loop Report ("Column name:" + MyCurrentColumn.Name); Fine ciclo;

Quando il sottosistema in esecuzione 1C incontra un ciclo di questo tipo, ad ogni passaggio del ciclo, assegna a una variabile con il nome specificato un elemento dalla nostra raccolta, in questo caso - un oggetto da collezione colonne della tabella dei valori Le mie colonne TZ Quindi ci riferiamo alla variabile che contiene la colonna corrente e usiamo la proprietà "Nome".

Suggerisco di visualizzare il numero di ogni colonna nella raccolta di colonne accanto al nome della colonna:

// visualizza il numero ei nomi di tutte le colonne della tabella dei valori Per ogni colonna da My TZ.Columns Cycle Numero colonna \u003d My TZ.Columns.Index (Column); // ottiene il numero della colonna ColumnName \u003d Column.Name; // ottiene il nome della colonna Report ("Numero colonna:" + ColumnNumber + "Nome colonna:" + ColumnName); Fine ciclo;

Il testo verrà visualizzato nella finestra del messaggio 1C:

Numero colonna: 0 Nome colonna: Cognome Numero colonna: 1 Nome colonna: Nome Numero colonna: 2 Nome colonna: Secondo nome

Prestare attenzione al fatto che le colonne nella tabella dei valori 1C sono numerate a partire da zero, proprio come le righe della tabella dei valori.

Numero di colonne nella tabella dei valori 1C

Per scoprire il numero di colonne nella tabella dei valori, utilizziamo il metodo "Count ()" sulla raccolta di colonne.

Numero di colonne \u003d My TZ.Columns.Number (); Report (numero di colonne);

Il display mostrerà il numero "3". Infatti, la nostra tabella ha tre colonne: "Cognome", "Nome", "Patronimico"

Ottenere un oggetto colonna in base al suo numero (indice) e iterare sulle colonne utilizzando l'indice della colonna

Passiamo in rassegna tutte le colonne della tabella dei valori utilizzando gli indici di colonna (numeri). Ricorda che la numerazione delle colonne inizia da zero. Dobbiamo quindi incrementare il contatore del ciclo "Mid" da zero ad un numero uguale al numero di colonne meno uno.

Per MF \u003d 0 By My TZ.Kolonki.Number () - 1 Cycle CurrentColumn \u003d My TZ.Kolonki [Ms]; Report (CurrentColumn.Name); Fine ciclo;

Sullo schermo, otteniamo quanto segue

Nome e cognome

Penso che questo esempio fosse chiaro. Ci siamo rivolti al metodo Quantità() raccolte di colonne " Il mio TZ.Columns.Number ()", ha ottenuto il numero di colonne e ha avviato un ciclo con un contatore da graffiare prima numero di colonne meno uno... All'interno del ciclo, otteniamo ogni colonna dalla raccolta di colonne e assegniamo l'oggetto colonna corrente a una variabile CurrentColumn Inoltre, la variabile CurrentColumn ci riferiamo alla proprietà Nome e visualizzare il valore di questa proprietà sullo schermo: Report (CurrentColumn.Name);

È importante non confondere mai una proprietà dell'oggetto e un metodo dell'oggetto.

Una proprietà è una sorta di valore statico e l'accesso ad esso viene scritto senza parentesi, ad esempio CurrentColumn.Name... Un metodo è essenzialmente una procedura o una funzione di un oggetto e le chiamate a procedure e funzioni sono sempre scritte tra parentesi (anche se non ci sono parametri di input). Per esempio: Il mio TZ.Columns.Number ()

Se ci rivolgiamo al metodo, dimenticando di scrivere le parentesi, l'interprete 1C ci darà un messaggio di errore e non eseguirà il codice per l'esecuzione. Poiché l'interprete considererà che non ci riferiamo a un metodo, ma a una proprietà, perché non ci sono parentesi. E non sarà in grado di trovare proprietà con questo nome (perché esiste solo un metodo con un tale nome), che verrà detto nel messaggio di errore.

Questo è ciò che l'interprete scriverà se dimentico di mettere le parentesi nella chiamata al metodo in modo così sbagliato My TZ.Columns.Quantity (senza parentesi dopo "Amount ()"):

Campo oggetto non trovato (conteggio)

In questo caso, "campo" e "proprietà" dovrebbero essere intesi come sinonimi o inesattezza nella terminologia degli sviluppatori 1C. Usano entrambe queste parole per riferirsi allo stesso concetto. Sebbene in altri linguaggi di programmazione questi termini possano significare concetti diversi.

Ottenere dati da una tabella di valori 1C utilizzando i numeri di colonna

Per cominciare, ti offro un semplice esempio di come ottenere dati dalla prima riga della nostra tabella. Si prega di notare che stiamo usando una tabella precompilata dall'inizio dell'articolo. Sappiamo per certo che la tabella ha la prima riga e c'è almeno una colonna. Se applichiamo questo esempio a una tabella vuota, si verificherà un errore. Così:

FirstRow \u003d MyTZ; // ottiene la prima riga (numerazione da zero) FirstColumnValue \u003d FirstLine; // ottiene il valore della prima colonna (anche la numerazione delle colonne è da zero) Report (FirstColumnValue); // visualizza il valore della prima colonna nella prima riga della tabella

Lo schermo mostrerà:

Chapaev

Innanzitutto, abbiamo ottenuto l'oggetto riga della tabella dei valori accedendo alla tabella dei valori utilizzando l'operatore [...]. (se hai dimenticato come fare, puoi guardare gli articoli precedenti) All'interno dell'operatore, abbiamo passato l'argomento "0". Questo è l'indice della prima riga della tabella dei valori. FirstRow \u003d MyTZ;

Inoltre, abbiamo anche il diritto di fare riferimento all'oggetto stringa utilizzando l'operatore [...]. All'interno di questo operatore abbiamo passato il numero della colonna della tabella dei valori, in questo caso anche "0". E così, abbiamo ottenuto il valore della colonna numerata "0" per la riga della tabella corrente numerata "0". Abbiamo visualizzato questo valore sullo schermo ed è la stringa "Chapaev".

Complichiamo un po 'il nostro esempio:

FirstRow \u003d MyTZ; // ottiene la prima riga (numerazione da zero) Report (FirstLine); // visualizza il valore della prima colonna nella prima riga della tabella Report (FirstRow); // visualizza il valore della seconda colonna nella prima riga della tabella Report (FirstRow); // visualizza il valore della terza colonna nella prima riga della tabella

Abbiamo ora stampato i valori da tutte e tre le colonne della prima riga della nostra tabella di valori:

Chapaev Vasily Ivanovich

Ora sto ancora modificando questo esempio in modo da fare a meno della variabile "Prima linea"

Report (MyTZ); // visualizza il valore della prima colonna nella prima riga della tabella Report (MyTZ); // visualizza il valore della seconda colonna nella prima riga della tabella Report (MyTZ); // visualizza il valore della terza colonna nella prima riga della tabella

Lo schermo sarà lo stesso

Chapaev Vasily Ivanovich

Abbiamo visto nell'esempio sopra che per accedere a un valore situato in una specifica riga e in una specifica colonna della tabella dei valori, possiamo utilizzare una chiamata sequenziale di due operatori [...] in questa forma: Tabella dei valori [Indice riga] [Indice colonna]

Ciò significa che siamo pronti per creare un ciclo di iterazione e ottenere i dati di tutte le righe e di tutte le colonne utilizzando gli indici di riga e colonna:

For RowCounter \u003d 0 By My TZ.Number () - 1 Loop // iterazione loop sulle righe For ColumnCounter \u003d 0 By My TZ.Columns.Number () - 1 Loop // ciclo nidificato che iterazione su colonne // ottiene il valore della cella (dalla riga corrente e da quella corrente colonne) Valore cella \u003d MyTZ [LineCounter] [ColumnCounter]; // visualizza il numero di riga, il numero di colonna e il valore della cella Report ("Line #" + LineCounter + "Column #" + ColumnCount + "\u003d" + CellValue); Fine ciclo; Fine ciclo;

Lo schermo visualizzerà quanto segue:

Riga # 0 colonna # 0 \u003d Riga di Chapaev # 0 colonna # 1 \u003d Riga di Vasily # 0 colonna # 2 \u003d Riga di Ivanovich # 1 colonna # 0 \u003d Riga di Dzerzhinsky # 1 colonna # 1 \u003d Riga di Felix # 1 colonna # 2 \u003d Riga di Edmundovich # 2 colonna # 0 \u003d Kotovsky Line # 2 colonna # 1 \u003d Grigory Line # 2 colonna # 2 \u003d Ivanovich

Con l'aiuto di due cicli, uno dei quali è annidato nell'altro, abbiamo visualizzato i valori di tutte le colonne di tutte le righe della tabella dei valori 1C. In questo caso, non abbiamo utilizzato i nomi delle colonne, ma abbiamo fatto riferimento alle colonne e alle righe tramite i loro indici. Nota i commenti all'interno dell'esempio per una maggiore comprensione.

Infine, suggerisco di modificare leggermente il nostro esempio in modo che invece dei numeri di colonna visualizzi i loro nomi sullo schermo. Inoltre, farò una presentazione più presentabile del contenuto sullo schermo.

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // iterazione loop su righe Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Per segnalare (""); // avanzamento riga (inserimento di una riga vuota) For ColumnCounter \u003d 0 By MyTZ.Columns.Number () - 1 Loop // loop nidificato che si ripete sulle colonne // ottiene il valore della cella (dalla riga corrente e dalla colonna corrente) Cell Value \u003d MyTZ [LineCounter] [ ColumnCounter]; // ottiene il nome della colonna ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // visualizza il nome della colonna e il valore della cella Report (ColumnName + ":" + CellValue); Fine ciclo; Per segnalare (""); // avanzamento riga (inserendo una riga vuota) Fine del ciclo;

Ora, sul nostro schermo, le informazioni sembrano più rappresentative:

Numero riga 0 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Cognome: Chapaev Nome: Vasily Patronimico: Ivanovich \u003d\u003d\u003d\u003d\u003d\u003d\u003d Numero riga 1 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Cognome: Dzerzhinsky Nome: Felix Patronimico: Edmundovich \u003d\u003d\u003d\u003d\u003d \u003d\u003d Numero riga 2 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Cognome: Kotovsky Nome: Grigory Patronimico: Ivanovich

Sì, quasi dimenticavo. Quando si usano due operatori [...] [...] in una riga, possiamo passare il nome di questa colonna invece dell'indice della colonna: Tabella dei valori [RowIndex] [ColumnName]

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // loop che ripete le righe Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Per segnalare (""); // avanzamento riga (inserendo una riga vuota) For ColumnCounter \u003d 0 By MyTZ.Colonki.Number () - 1 Loop // ciclo nidificato che si ripete sulle colonne ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // ottiene il nome della colonna CellValue \u003d MyTZ [LineCounter] [ColumnName]; //

Fai attenzione alla riga contrassegnata da una freccia ". In questa riga, al posto dell'indice della colonna corrente, passiamo il nome della colonna corrente all'argomento tra parentesi quadre [...] Il risultato sarà lo stesso.

E ora, l'ultimo in questo articolo.

Recupero CORRETTO di tutti i dati nella tabella dei valori 1C iterando attraverso la raccolta di righe e la raccolta di colonne

For Each CurrentRow From MyTZ Loop // scorre la raccolta di stringhe Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentLine) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Per segnalare (""); Per ciascuno, il ciclo CurrentColumn From MyTZ.Columns // ciclo nidificato che itera sulla raccolta di colonne ColumnName \u003d CurrentColumn.Name; // ottiene il nome della colonna CellValue \u003d CurrentRow [ColumnName]; // ottiene il valore della cella PER colonna NOME Report (ColumnName + ":" + CellValue); // visualizza il nome della colonna e il valore della cella EndCycle; Per segnalare (""); Fine ciclo;

Nell'esempio, sono stati utilizzati due loop. Il ciclo attraverso la raccolta di colonne è nidificato all'interno del ciclo attraverso le righe. Se hai affrontato gli esempi precedenti e letto gli articoli precedenti, non avrai difficoltà a capire come funziona questo esempio.

Infine, manterrò il numero di righe di codice nel nostro ultimo esempio il più breve possibile eliminando l'uso di variabili intermedie. Otterremo un campione di "codice industriale" utilizzato nei problemi del mondo reale.

Questo dovrebbe essere fatto solo quando hai una buona comprensione di ciò che stai facendo. Se il codice è molto complesso, è consentito lasciare variabili intermedie per facilitare la comprensione del proprio codice in un secondo momento. Inoltre, qualsiasi codice deve essere commentato almeno minimamente, in modo che dopo un po 'di tempo sarà più facile capire i testi del programma.

Per ogni CurrentString From MyTZ Loop // iterare sulle righe Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentString) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d" + Symbols.PS); Per ciascuno, CurrentColon From MyTZ.Columns Loop // iterare su colonne Report (CurrentColumn.Name + ":" + CurrentRow [CurrentColumn.Name]); Fine ciclo; Per segnalare (""); Fine ciclo;

L'output sullo schermo non è cambiato, rimane lo stesso dell'esempio precedente:

CORSO DI 2 SETTIMANE

"PROGRAMMAZIONE in 1C PER PRINCIPIANTI"

Il corso verrà inviato tramite e-mail. Diventa un programmatore completando le attività passo passo.

Per partecipare è sufficiente un computer e Internet

Accesso gratuito al corso:

Sp-force-hide (display: nessuno;). Sp-form (display: block; background: # eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; background-position: center; background-size: auto;) .sp-form input (display: inline-block; opacity: 1; visibilità: visible;). sp-form .sp-form-fields-wrapper (margin: 0 auto; width: 260px;). sp-form .sp -form-control (background: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-left: 8.75px; padding-right: 8.75px; border -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; altezza: 35px; larghezza: 100%;). sp-form .sp-field label (color: # 444444; font- dimensione: 13px; font-style: normale; font-weight: grassetto;). sp-form .sp-button (border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: # f4394c; color: #ffffff; larghezza: 100%; font-weig ht: 700; stile del carattere: normale; famiglia di caratteri: Arial, "Helvetica Neue", sans-serif; box-shadow: nessuno; -moz-box-shadow: nessuno; -webkit-box-shadow: nessuno; background: linear-gradient (to top, # e30d22, # f77380);). sp-form .sp-button-container (text-align: center; width: auto;)

Per tenere conto di denaro e merci, negli affari vengono ampiamente utilizzate tabelle diverse. Quasi ogni documento è una tabella.

Una tabella elenca gli articoli da spedire dal magazzino. L'altra tabella contiene gli obblighi di pagamento per questi beni.

Pertanto, in 1C, il lavoro con le tabelle occupa un posto di rilievo.

Le tabelle in 1C sono anche chiamate "sezioni tabulari". Libri di consultazione, documenti e altri li hanno.

Come risultato della sua esecuzione, la query restituisce una tabella, a cui è possibile accedere in due modi diversi.

La prima selezione più rapida, recuperando le righe da essa, è possibile solo in ordine. Il secondo è scaricare il risultato della query in una tabella di valori e quindi accedervi in \u200b\u200bmodo casuale.

// Opzione 1: accesso sequenziale ai risultati della query

// prendi il tavolo
Selezione \u003d Query.Run (). Select ();
// in ordine, esaminiamo tutte le righe del risultato della query
Durante il ciclo Sampling.Next ()
Rapporto (nome campione);
Fine ciclo;

// Opzione 2: scaricamento in una tabella di valori
Request \u003d New Request ("SELECT Name FROM Directory.Nomenclature");
// prendi il tavolo
Tabella \u003d Query.Run (). Unload ().
// quindi possiamo anche esaminare tutte le righe
Per ogni riga da Table Loop
Report (String.Name);
Fine ciclo;
// o accedi arbitrariamente alle stringhe
String \u003d Tabella. Trova ("Pala", "Nome");

Una caratteristica importante è che nella tabella ottenuta dal risultato della query, tutte le colonne saranno fortemente tipizzate. Ciò significa che richiedendo il campo Nome dal libro di riferimento della nomenclatura, riceverai una colonna di tipo Stringa con una lunghezza consentita non superiore a N caratteri.

Tabella in forma (cliente grasso)

L'utente lavora con la tabella quando viene inserita nel modulo.

Abbiamo discusso i principi di base del lavoro con i moduli nella lezione su e nella lezione su

Quindi, posizioniamo la tabella sul modulo. Per fare ciò, puoi trascinare la tabella dal pannello di controllo. Allo stesso modo, puoi selezionare nel menu Modulo / Inserisci controllo.

I dati possono essere memorizzati nella configurazione, quindi è necessario selezionare la sezione tabulare esistente (aggiunta in precedenza) dell'oggetto di configurazione di cui si sta modificando il modulo.

Fare clic sul pulsante "..." nella proprietà Data. Per vedere l'elenco delle sezioni tabulari, è necessario espandere il ramo Oggetto.

Quando si sceglie una sezione tabulare, 1C stesso aggiungerà colonne alla tabella nel modulo. Le righe inserite dall'utente in tale tabella verranno salvate automaticamente insieme al riferimento / documento.

Nella stessa proprietà Data è possibile immettere un nome arbitrario e selezionare il tipo ValuesTable.

Ciò significa che è selezionata una tabella di valori arbitraria. Non aggiungerà automaticamente colonne, non verrà salvato automaticamente, ma puoi fare quello che vuoi con esso.

Facendo clic con il tasto destro sulla tabella è possibile aggiungere una colonna. Nelle proprietà di una colonna, è possibile specificare il suo nome (per riferimento nel codice 1C), l'intestazione della colonna sul modulo, il collegamento con l'attributo della sezione tabulare (quest'ultimo - se non una tabella arbitraria, ma la sezione tabulare è selezionata).

Nelle proprietà della tabella nel modulo è possibile specificare se l'utente può aggiungere / rimuovere righe. Modulo più avanzato: casella di controllo Solo visualizzazione. Queste proprietà sono utili per organizzare le tabelle per la visualizzazione delle informazioni, ma non per la modifica.

Per gestire la tabella, è necessario visualizzare la barra dei comandi sul modulo. Seleziona la voce di menu Modulo / Inserisci controllo / Pannello comandi.

Nelle proprietà della barra dei comandi, seleziona la casella di controllo Completamento automatico in modo che i pulsanti sulla barra vengano visualizzati automaticamente.

Tabella su modulo (client thin / gestito)

In un modulo gestito, queste azioni hanno un aspetto leggermente diverso. Se è necessario posizionare una sezione tabulare nel modulo, aprire il ramo Oggetto e trascinare una delle sezioni tabulari a sinistra. E questo è tutto!

Se è necessario posizionare una tabella di valori, aggiungere un nuovo attributo del modulo e specificare il tipo nelle sue proprietà: tabella dei valori.

Per aggiungere colonne, utilizza il menu di scelta rapida su questo attributo del modulo, l'elemento Aggiungi colonna attributo.

Quindi trascina anche la tabella a sinistra.

Per fare in modo che la tabella abbia una barra dei comandi, nelle proprietà della tabella, seleziona i valori nella sezione Utilizzo - Posizione barra dei comandi.

Esporta una tabella in Excel

Qualsiasi tabella 1C presente nel modulo può essere stampata o scaricata in Excel.

A tale scopo, fare clic con il pulsante destro del mouse su uno spazio vuoto nella tabella e selezionare Elenco.

In un client (thin) gestito, è possibile eseguire azioni simili utilizzando la voce di menu Tutte le azioni / Visualizza elenco.

Esistono due metodi speciali per la ricerca in una tabella di valori:

1. Trova

Horizon TV \u003d Libri di riferimento.Nomenclature.FindByName ("Horizon TV");
FoundString \u003d TKNomenclature.Find (TV Horizon);
// possiamo anche specificare in quali colonne cercare per velocizzare la ricerca
FoundString \u003d TKNomenclature.Find (TV Horizon, "Nomenclature");

Questo metodo restituisce la prima stringa trovata con il valore desiderato o Undefined in caso contrario. Pertanto, è conveniente utilizzarlo per trovare valori univoci, poiché altrimenti, quando viene trovato un valore, rimuoverlo dalla tabella per trovare quello successivo.

Per non soffrire in questo modo, esiste il seguente metodo, che consente di trovare un array di stringhe corrispondenti:

2. FindStrings


StructureSelection.Insert ("Nomenclature", TV Horizon); // specifica prima la colonna dove cercare e poi cosa cercare.

Questo metodo restituisce sempre un array, ma può essere vuoto se non viene trovato nulla. E questo metodo, proprio come il precedente, restituisce le righe della tabella dei valori stesse e non i valori stessi in un array separato. Pertanto, modificando i valori nella riga dell'array o, come nel metodo precedente, per la riga trovata, si modificherà il valore nella tabella dei valori elaborata.

Un altro aspetto positivo di questo metodo è che può cercare contemporaneamente diverse colonne della tabella dei valori:


Quadro di selezione \u003d Nuova struttura;
StructureSelection.Insert ("Nomenclature", TV Horizon);
Struttura della selezione Inserisci ("Quantità", 10);
FoundArrayStrings \u003d TZNomenclature.FindStrings (SelectionStructure);

Unico neo, come puoi vedere, non puoi utilizzare altri tipi di confronto diversi da "uguale"

Ecco un piccolo fatto per iniziare: semplici esempi di lavoro con una tabella di valori:

1. Creare una tabella di valori

ValuesTable \u003d Nuova tabella Values;


2. Crea colonne della tabella dei valori:

TableValues.Columns.Add ("Name");
ValuesTable.Columns.Add ("Last Name");


3. Aggiungi nuove righe utilizzando i nomi delle colonne:


NewStroka.Name \u003d "Vasily";
NewStroka.Surname \u003d "Pupkin";


4. Come cercare un valore in una tabella di valori:
È necessario trovare la riga della tabella contenente il valore desiderato.

FoundString \u003d ValueTable.Find (LookupValue);


5. Trova la prima occorrenza in colonne specifiche della tabella dei valori

FoundString \u003d ValueTable.Find (SearchValue, "Supplier, Buyer");


6. Se desideri trovare tutte le occorrenze nella tabella dei valori:
Usiamo la struttura di ricerca.

SearchStructure \u003d Structure ("Employee", LookupValue);
ArrayFoundStrings \u003d ValueTable.FindStrings (SearchStructure);


Creiamo una struttura di ricerca, ogni elemento della quale conterrà il nome di una colonna come chiave e il valore desiderato in questa colonna come valore. Passiamo la SearchStructure come parametro al metodo FindStrings (). Di conseguenza, otteniamo le righe della tabella.
Se aggiungi una ricerca per il valore richiesto alla struttura di ricerca, ad esempio, nella colonna Responsabile, come risultato dell'utilizzo del metodo FindStrings (), otterremo tutte le righe in cui sia il dipendente che il responsabile sono uguali al valore desiderato.

7. Come iterare su una tabella di valori in ordine casuale

Per ogni riga corrente dal loop della tabella valori
Report (CurrentString.Name);
Fine del ciclo;

Stessa cosa usando gli indici:

MajorIndex \u003d ValueTable.Number () - 1;
Per MF \u003d da 0 a High Index Cycle
Report (Values \u200b\u200bTable [Count] .Name);
Fine del ciclo;


8. Eliminazione di una riga esistente della tabella dei valori

ValuesTable.Delete (DeletedString);

per indice

ValuesTable.Remove (0);


9. Eliminazione di una colonna esistente della tabella dei valori

ValuesTable.Columns.Remove (DeletedColumn);


per indice

ValuesTable.Columns.Remove (0);

Va tenuto presente che l'eliminazione di una riga (o colonna) "dal centro" della tabella dei valori comporterà una diminuzione di uno negli indici delle righe che erano "dopo" l'eliminazione

10. Come riempire la tabella dei valori se i nomi delle colonne sono contenuti in variabili?

NewRow \u003d ValueTable.Add ();
NewString [ColumnName] \u003d Valore;


11. Come riempire l'intera colonna della tabella dei valori con il valore desiderato?
Flag di colonna FiscalAccounting nella tabella di valuesValuesTable deve essere riempito con il valore False

ValuesTable.FillValues \u200b\u200b(False, "FiscalAccounting Flag");


Applicare il metodo FillValues \u200b\u200b() alla tabella dei valori. Il primo parametro è il valore da riempire. Il secondo parametro è il nome della colonna da riempire.

12. Come si può riempire la tabella dei valori "RecipientTable" con i dati della tabella dei valori "SourceTable"?

Se la Tabella Destinatari non esiste al momento dell'operazione, o se non è necessario salvarne le colonne precedenti, è possibile crearla come copia completa dell'originale

ReceiverTable \u003d SourceTable.Copy ();


Opzione due: la tabella TableRecipient esiste ed è un peccato perdere le sue colonne e le restrizioni sui tipi di dati delle colonne. Ma è necessario compilare i dati per le colonne, i cui nomi coincidono con i nomi della tabella di origine.

Trasferimento dati parziale per colonne con nomi corrispondenti:

Per ogni riga SourceTable dal ciclo SourceTable
FillPropertyValues \u200b\u200b(NewRow, SourceTableRow);
Fine ciclo


Per ogni riga della tabella di origine, viene aggiunta una nuova riga alla tabella di ricezione ei valori vengono inseriti in quelle colonne della nuova tabella, i cui nomi coincidono con i nomi delle colonne nella tabella originale

Se le tabelle non hanno colonne con lo stesso nome, la tabella secondaria conterrà tante righe con valori vuoti quante sono le tabelle di origine.
Se per alcune colonne con lo stesso nome il tipo di valore dati dalla tabella di origine non rientra nella matrice dei tipi di colonna consentiti della tabella ricevente, otterremo valori vuoti in tali campi.
Consideriamo il terzo caso. Nel caso di colonne con lo stesso nome, la colonna della tabella ricevente deve essere portata nel pieno rispetto della colonna della tabella sorgente.

Copia completa dei dati per colonne con gli stessi nomi

Colonne con lo stesso nome \u003d New Array ();

Per ogni colonna dal ciclo di colonne della tabella di origine
MatchingColumn \u003d TableRecipient.Columns.Find (Column.Name);

Se MatchedColumn<> Allora indefinito

// Recupera le proprietà della colonna.
Name \u003d Column.Name;
ValueType \u003d Column.ValueType;
Heading \u003d Column.Heading;
Larghezza \u003d Column.Width;

// Sostituisci le colonne nella tabella ricevente.
Index \u003d TableReceiver.Columns.Index (MatchingColumn);

TableReceiver.Columns.Remove (Index);
TableReceiver.Columns.Insert (Index, Name, ValueType, Title, Width);

// Aggiunge il nome successivo delle colonne corrispondenti all'array.
Colonne con lo stesso nome.Add (Column.Name);

Finisci se;

Fine del ciclo;

// Esegue il ciclo attraverso le righe della tabella di origine.
Per ogni riga SourceTable dal ciclo SourceTable

// Aggiunge una nuova riga alla tabella ricevente.
NewRow \u003d TableRecipient.Add ();

// Compila i valori nelle celle corrispondenti.
Per ogni colonna nome dal ciclo di colonne simili
NewRow [ColumnName] \u003d SourceTableRow [ColumnName];

Fine del ciclo;

Fine del ciclo;


Dovremo sostituire la colonna nella tabella ricevente con una nuova, le cui proprietà corrisponderanno completamente alla colonna della tabella sorgente.
Pertanto, se una colonna con lo stesso nome si trova nella tabella del destinatario, raccogliamo tutte le proprietà per la nuova colonna in variabili. Quindi, elimina quello vecchio e crea una nuova colonna. Quindi eseguiamo un ciclo tra le righe della tabella di origine.
Nel ciclo, aggiungi una nuova riga alla tabella ricevente e apri il ciclo per l'iterazione sui nomi delle colonne nella matrice delle colonne corrispondenti.
All'interno di questo ciclo annidato, riempiamo le celle della tabella ricevente con i dati della cella della tabella sorgente.

13. Come aggiungere colonne alla tabella dei valori "ValuesTable" con vincoli per tipo?

Quando aggiungi una colonna, puoi semplicemente specificarne il nome e lasciare intatto il secondo parametro del metodo Add (). In questo caso, il tipo di dati della colonna è arbitrario.

Aggiunta di una colonna senza specificare un tipo di dati

// Aggiunge una colonna senza limitazioni di tipo.
TableValues.Columns.Add ("Object");


È possibile inserire il valore del secondo parametro. La descrizione del tipo consentito per la colonna deve essere passata qui. La descrizione stessa può essere ottenuta utilizzando il costruttore, passando a quest'ultimo come parametro un nome di tipo stringa (se ci sono molti tipi, quindi separato da virgole) o un array di tipi ammissibili.

Aggiunta di una colonna che indica il tipo di dati

// Restrizioni sui tipi di dati delle colonne:
// Solo elementi della ricerca "Appaltatori".
TableValues.Columns.Add ("Counterparty", New Description of Types ("DirectoryLink.Contractors"));


Se tra i tipi consentiti per riempire i dati della colonna è presente una stringa, è possibile limitarne la profondità di bit (lunghezza), specificare l'uso di una lunghezza variabile o fissa. Tutto ciò si ottiene creando un oggetto utilizzando il costruttore String Qualifiers. Inoltre, questo oggetto verrà utilizzato come uno dei parametri del costruttore TypeDescription.

Utilizzo di qualificatori per specificare il tipo di dati di una colonna di valori della tabella

// Prepara e imposta le restrizioni per i dati di tipo String.
Qualificatori di stringa \u003d Nuovi qualificatori di stringa (20, ValidLength.Variable);
AllowedTypes \u003d NewTypeDescription ("String", StringQifiers);
ValuesTable.Columns.Add ("NoteStringShort", AllowedTypes);


Puoi fare lo stesso per i qualificatori di data e data.
Nota: una descrizione del tipo può essere costruita dal costruttore sia "da zero" o utilizzare una descrizione del tipo esistente come base

Utilizzo di dichiarazioni di tipo esistenti per specificare il tipo di dati di una colonna di una tabella di valori

// Estensione della descrizione del tipo precedentemente utilizzata.
QualifiersNumber \u003d New QualifiersNumber (10, 2, ValidSign.Non-negative);
Qualificatori data \u003d Nuovi qualificatori data (DateParts.Date);
ExtendedAllowedTypes \u003d NewTypeDescription (ValidTypes, "Numero, Data", Qualificatori numero, Qualificatori data);

ValuesTable.Columns.Add ("Note", ExtendedAllowedTypes);

LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Come vuoi leggere The Bell
Niente spam