1s 8.3 struttura della tabella dei valori

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

Una tabella elenca le merci da spedire dal magazzino. Un'altra tabella mostra gli obblighi di pagamento per questi beni.

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

Le tabelle in 1C sono anche chiamate “parti tabulari”. Directory, documenti e altro li hanno.

La query, una volta eseguita, restituisce una tabella a cui è possibile accedere in due modi diversi.

La prima selezione, più rapida, da cui si ottengono righe è possibile solo in ordine. Il secondo è caricare il risultato della query in una tabella di valori e quindi accedervi in ​​modo casuale.

//Opzione 1 – accesso sequenziale ai risultati della query

//prendi il tavolo
Seleziona = Query.Esegui().Select();
// esaminiamo in ordine tutte le righe del risultato della query
Mentre Select.Next() Ciclo
Report(Selezione.Nome);
FineCiclo;

//Opzione 2 – caricamento in una tabella di valori
Richiesta = Nuova Richiesta("SELEZIONA Nome DA Directory.Nomenclatura");
//prendi il tavolo
Tabella = Query.Esegui().Scarica().
//inoltre possiamo anche attraversare tutte le linee
Per ogni riga del ciclo della tabella
Rapporto(String.Nome);
FineCiclo;
//o accedere arbitrariamente alle stringhe
Riga = Table.Find("Pala", "Nome");

Una caratteristica importante è che nella tabella ottenuta dal risultato della query, tutte le colonne saranno rigorosamente tipizzate. Ciò significa che richiedendo il campo Nome dalla directory Nomenclature, riceverai una colonna del formato String con una lunghezza consentita non superiore a N caratteri.

Tabella nel modulo (thick client)

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

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

Quindi, posizioniamo la tabella sul modulo. Per fare ciò, puoi trascinare la tabella dal pannello Controlli. Allo stesso modo, puoi selezionare Controllo modulo/inserisci dal menu.

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

Fare clic sul pulsante "..." nella proprietà Dati. Per visualizzare l'elenco delle parti tabellari è necessario espandere il ramo Oggetto.

Quando selezioni la parte tabellare, 1C stesso aggiungerà colonne alla tabella nel modulo. Le righe immesse dall'utente in tale tabella verranno salvate automaticamente insieme al libro/documento di consultazione.

Nella stessa proprietà Data è possibile inserire un nome arbitrario e selezionare il tipo Tabella valori.

Ciò significa che è stata selezionata una tabella di valori arbitraria. Non aggiungerà automaticamente le colonne, né verrà salvato automaticamente, ma puoi farci quello che vuoi.

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 nel modulo, la connessione con l'attributo della parte tabellare (quest'ultimo - se non viene selezionata una tabella arbitraria, ma una parte tabellare).

Nelle proprietà della tabella nel modulo è possibile specificare se l'utente può aggiungere/eliminare righe. Una forma più avanzata è la casella di controllo Solo visualizzazione. Queste proprietà sono utili da utilizzare per organizzare tabelle destinate alla visualizzazione di informazioni, ma non alla modifica.

Per gestire la tabella è necessario visualizzare sulla videata un pannello di comando. Seleziona la voce di menu Modulo/Inserisci controllo/Barra di comando.

Nelle proprietà della barra dei comandi, seleziona la casella di controllo Compilazione automatica in modo che i pulsanti sul pannello vengano visualizzati automaticamente.

Tabella sul modulo (thin client/gestito)

In un modulo gestito, queste azioni hanno un aspetto leggermente diverso. Se devi inserire una parte tabellare nel modulo, espandi il ramo Oggetto e trascina una delle parti tabellari verso sinistra. È tutto!

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

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

Quindi trascina anche la tabella a sinistra.

Affinché una tabella abbia una barra dei comandi, nelle proprietà della tabella, selezionare i valori nella sezione Utilizzo – Posizione barra dei comandi.

Caricamento di una tabella in Excel

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

Per fare ciò, fare clic con il tasto destro su uno spazio vuoto nella tabella e selezionare Elenco.

In un client (thin) gestito, azioni simili possono essere eseguite utilizzando la voce di menu Tutte le azioni/Visualizza elenco.

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

Caratteristiche del compito.

Chiunque abbia programmato in un'applicazione normale si è spesso trovato di fronte al compito di ottenere una tabella di valori arbitraria su un modulo. Una tabella di valori arbitraria è una tabella il cui numero e tipo di colonne non sono noti in anticipo. Cioè potrebbero esserci 3 colonne, o forse 6, o forse 8. In una normale applicazione, tutto è semplice: potresti posizionare l'elemento “Tabella dei valori” sul modulo di elaborazione, e quindi trasferire la tabella dei valori creata ​a questo elemento a livello di codice. Poi con un semplice comando:

Modulo Elements.TableField.CreateColumns();

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

Questo era tutto nella normale applicazione. In un'applicazione gestita tutto è cambiato. Non è così facile creare una tabella arbitraria. Ora è necessario parametrizzare rigidamente 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 arbitraria di valori su un modulo controllato.

La soluzione del problema.

La prima cosa che dobbiamo fare è determinare 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 codice, come l'intera tabella. Cioè, la tabella verrà descritta e creata al momento dell'apertura del modulo o tramite un pulsante, a seconda di chi ne ha bisogno.

La creazione di una tabella sul form avviene attraverso la descrizione della tabella valori come attributo:
SelectionTypeArray = Nuovo array; Array di SelectionType.Add(Type("Tabella dei valori")); ChoiceTypeDescription = Nuova descrizione del tipo(ChoiceTypeArray); Serie di dettagli = Nuova serie; Array of Attributes.Add(New Form Attributes("Tabella di pianificazione", Descrizione di SelectionType, "", "TZN")); Ora dobbiamo creare una tabella programmatica di valori che contenga i dati. Se la tabella dei valori viene ottenuta da una query, allora è più o meno tutto in ordine. Se la tabella viene creata manualmente allora il significato delle colonne che conterranno numeri o date potrà essere creato attraverso la “Descrizione delle Tipologie”. Il punto è che le colonne nella tabella dei valori devono avere un tipo. Se, ad esempio, si prevede che l'utente inserisca i dati in queste colonne in modo interattivo, non è possibile aggiungere una colonna della tabella dei valori semplicemente con un nome; Tieni presente che questo è molto importante perché... Trasferiremo questi tipi nella tabella del modulo.
Creiamo una tabella che contiene diverse colonne:
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Nuovo array; ArrayCD.Add(Tipo("Data")); DescrizioneTipiOra = Nuovi tipi di descrizione(ArrayCD,CD); TZ = Nuova tabella valori;
TK.Columns.Add("Con", DescriptionTypesTime);
TK.Columns.Add("Prima", DescriptionTypesTime);
TK.Columns.Add("Nome");
TK.Columns.Add("Note"); // Nome completo e nota - righe Successivamente riempiremo la tabella del nostro programma TK con i dati necessari. Otteniamo una tabella TK che contiene i valori necessari ed è pronta per essere trasferita all'attributo del modulo creato. Per ogni colonna dal ciclo di colonne TK

Array di attributi.Add (nuovi attributi del modulo (colonna.nome, colonna.valoretipo, "tabella di pianificazione"));
FineCiclo;
ModificaDettagli(DettagliArray);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

Questa è una combinazione semplice e il nostro tavolo è pronto.

Per ogni colonna dal ciclo di colonne TK

NuovoElemento = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NuovoElemento.View = FormFieldView.InputField;
NewElement.DataPath = "Tabella di pianificazione." + Nome.Colonna;
NewElement.Width = 10;
FineCiclo;

Progettazione condizionale, se ne abbiamo bisogno, la scriviamo anche manualmente, il menu dei comandi - manualmente. Anche i gestori delle tabelle vengono scritti a mano. Ad esempio, per aggiungere un gestore eventi per la tabella "Selezione":

Tabella di SelectionFields.SetAction("Selection","TZNSelection");

Per elaborare questo evento, è prescritta una procedura separata sotto forma di procedura:

&SuClient
Procedura TKNSelezione(TK, RigaSelezionata, Campo, ElaborazioneStandard)
//il gestore comanda EndProcedure

Si noti che i gestori di tabelle vengono attivati ​​sul client e pertanto devono disporre di un comando del puntatore del compilatore

&SuClient

Bene, l'ultima cosa che volevo aggiungere è che dopo tutti questi passaggi, assicurati di ricordarti di passare la tabella finita all'attributo form:

ValueFormAttributes(ToR, "ScheduleTable");

Questo è ciò che abbiamo come risultato:


Ed ecco la gestione dell'evento "Selezione":



Epilogo.

Spero che l'articolo possa aiutare quei programmatori 1C che stanno iniziando a creare tabelle su un modulo a livello di codice.

Puoi scaricare un'elaborazione che crea a livello di codice una tabella di valori e la visualizza in un modulo gestibile con commenti che ti aiuteranno a creare le tue tabelle.

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

1. Creare una tabella di valori

TabellaValori = Nuova TabellaValori;


2. Crea colonne per la tabella dei valori:

ValueTable.Columns.Add("Nome");
Valore Table.Columns.Add("Cognome");


3. Aggiungi nuove righe utilizzando i nomi delle colonne:


NewLine.Name = "Vasily";
NewLine.LastName = "Cucciolo";


4. Come cercare un valore nella tabella dei valori:
È necessario trovare una riga della tabella contenente il valore desiderato.

FoundRow = ValueTable.Find(SearchValue);


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

FoundRow = ValueTable.Find(SearchValue, "Fornitore, Acquirente");


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

SearchStructure = Struttura("Dipendente", SearchValue);
Array di FoundRows = ValueTable.FindRows(SearchStructure);


Creiamo una struttura di ricerca, ciascun elemento della quale conterrà il nome della colonna come chiave e il valore desiderato in questa colonna come valore. Passiamo la struttura di ricerca come parametro al metodo FindLines(). Di conseguenza, otteniamo righe della tabella.
Se aggiungi una ricerca per il valore desiderato alla struttura di ricerca, ad esempio, anche nella colonna Responsabile, come risultato dell'applicazione del metodo FindLines() otterremo tutte le righe in cui sia il Dipendente che il Responsabile sono uguali a valore cercato.

7. Come scorrere una tabella di valori in ordine casuale

Per ogni riga corrente dal ciclo della tabella dei valori
Report(RigaCorrente.Nome);
FineCiclo;

Stessa cosa usando gli indici:

SeniorIndex = ValueTable.Quantity() - 1;
Per conto = da 0 a Ciclo SeniorIndex
Report(ValoriTabella[Account].Nome);
FineCiclo;


8. Eliminazione di una riga della tabella dei valori esistente

ValueTable.Delete(Riga da eliminare);

per indice

ValueTable.Delete(0);


9. Eliminazione di una colonna esistente della tabella dei valori

ValueTable.Columns.Delete(ColumnDeleted);


per indice

ValueTable.Columns.Delete(0);

È necessario tenere conto del fatto che l'eliminazione di una riga (o colonna) “dal centro” della tabella dei valori comporterà una diminuzione di uno negli indici delle righe situate “dopo” quella eliminata

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

NuovaRiga = TabellaValori.Add();
NuovaRiga[NomeColonna] = Valore;


11. Come riempire l'intera colonna della tabella dei valori con il valore desiderato?
La colonna Flag Contabilità Fiscale nella Tabella dei Valori deve essere valorizzata con il valore Falso

Tabella dei valori. Compila valori (Falso, "Flag contabilità fiscale");


Usiamo il metodo FillValues() per la tabella dei valori. Il primo parametro è il valore da riempire. Il secondo parametro è il nome della colonna da riempire.

12. Come posso riempire la tabella dei valori “Receiver Table” con i dati della tabella dei valori “SourceTable”?

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

Tabella destinatari = Tabella origine.Copy();


Opzione due: la tabella ReceiverTable esiste e sarebbe un peccato perdere le sue colonne e le restrizioni sui tipi di dati delle colonne. Ma devi inserire i dati per le colonne i cui nomi corrispondono ai nomi della tabella di origine.

Trasferimento dati parziale per colonne con nomi corrispondenti:

Per ogni riga della SourceTable dal ciclo SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Fine del ciclo


Per ogni riga della tabella di origine, viene aggiunta una nuova riga alla tabella ricevente e i valori vengono inseriti in quelle colonne della nuova tabella i cui nomi corrispondono ai nomi delle colonne nella tabella di origine

Se le tabelle non hanno colonne con gli stessi nomi, la tabella di destinazione finirà per contenere tante righe con valori null quante erano le righe nella tabella di origine.
Se per alcune colonne con lo stesso nome il tipo di valore dei dati della tabella di origine non rientra nell'array dei tipi di colonne consentiti nella tabella di destinazione, otterremo valori vuoti in tali campi.
Consideriamo il terzo caso. Nel caso di colonne con lo stesso nome, la colonna della tabella di destinazione deve essere pienamente conforme alla colonna della tabella di origine.

Copia completa dei dati per le colonne con nomi corrispondenti

Stesse colonne = Nuovo array();

Per ogni colonna dal ciclo SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Se la colonna corrispondente<>Indefinito Allora

// Ottiene le proprietà della colonna.
Nome = Colonna.Nome;
TipoValore = Colonna.TipoValore;
Intestazione = Colonna.Intestazione;
Larghezza = Larghezza.Colonna;

// Sostituisce le colonne nella tabella di destinazione.
Indice = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Indice);
ReceiverTable.Columns.Insert(Indice, Nome, TipoValore, Intestazione, Larghezza);

// Aggiunge il nome successivo delle colonne corrispondenti all'array.
Stesse colonne.Add(Column.Name);

finisci se;

FineCiclo;

// Scorrere le righe della tabella di origine.
Per ogni riga della SourceTable dal ciclo SourceTable

// Aggiunge una nuova riga alla tabella di destinazione.
NuovaRiga = TableReceiver.Add();

// Compila i valori nelle celle corrispondenti.
Per ogni Nome Colonne Da Colonne con lo stesso nome Ciclo
NuovaRiga[NomeColonna] = RigaTabellaOrigine[NomeColonna];

FineCiclo;

FineCiclo;


Dovremo sostituire la colonna della tabella di destinazione con una nuova, le cui proprietà corrisponderanno pienamente alla colonna della tabella di origine.
Pertanto, se nella tabella dei destinatari viene trovata una colonna con lo stesso nome, raccogliamo tutte le proprietà della nuova colonna in variabili. Successivamente, elimina quello vecchio e crea una nuova colonna. Quindi eseguiamo il loop tra le righe della tabella di origine.
Nel ciclo aggiungiamo una nuova riga alla tabella ricevente e apriamo un ciclo sui nomi delle colonne nell'array di colonne corrispondenti.
All'interno di questo ciclo annidato, riempiamo le celle della tabella di destinazione con i dati della cella della tabella di origine.

13. Come aggiungere colonne alla tabella di valori "ValueTable" con restrizioni di 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 restrizioni sul tipo.
ValueTable.Columns.Add("Oggetto");


È possibile inserire il valore del secondo parametro. Lì è necessario passare una descrizione del tipo consentito per la colonna. La descrizione stessa può essere ottenuta utilizzando il costruttore, passandogli come parametro la stringa nome del tipo (se esistono più tipi, separati da virgole) oppure un array di tipi validi.

Aggiunta di una colonna che indica il tipo di dati

// Restrizioni sui tipi di dati delle colonne:
// Solo elementi della directory "Controparti".
Tabella dei valori.Columns.Add("Account", Nuova descrizione dei tipi("DirectoryLink.Accounts"));


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

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

// Prepara e imposta le restrizioni per i dati di tipo String.
Qualificatori di stringa = Nuovi qualificatori di stringa(20, Lunghezza consentita.Variabile);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Azioni simili possono essere eseguite rispetto ai qualificatori di numero e data.
Nota: le descrizioni dei tipi possono essere create dal costruttore “da zero” oppure è possibile utilizzare una descrizione del tipo esistente come base.

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

// Estensione della descrizione del tipo utilizzata in precedenza.
QualifiersNumbers = Nuovi QualifiersNumbers(10, 2, ValidSign.Non-negativo);
DateQualifiers = Nuovo DateQualifiers(DateParts.Date);
ValidTypes estesi = New TypeDescription(ValidTypes, "Numero, Data", Qualificatori numerici, Qualificatori data);

ValueTable.Columns.Add("Nota", ExtendedAcceptableTypes);

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

1. Trova

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
Stringatrovata = TZNomenclature.Find(TVHorizon);
//possiamo anche specificare in quali colonne effettuare la ricerca per velocizzare la ricerca
FoundString = TZNomenclature.Find(TVHorizon, "Nomenclature");

Questo metodo restituisce la prima riga trovata con il valore desiderato oppure Undefine se non la trova. Pertanto, è conveniente utilizzarlo per cercare valori univoci, perché altrimenti, quando viene trovato un valore, sarà necessario rimuoverlo dalla tabella per poter trovare quello successivo.

Per evitare questo problema, esiste il seguente metodo che consente di trovare un array di stringhe corrispondenti:

2. TrovaStringhe


Struttura di selezione.Insert("Nomenclatura", TVHorizon); // indica prima la colonna in cui cercare e poi cosa cercare.

Questo metodo restituisce sempre un array, ma può essere vuoto se non viene trovato nulla. E questo metodo, 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 stringa dell'array o, come nel metodo precedente, nella stringa trovata, si modificherà il valore nella tabella dei valori elaborata.

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


SelectionStructure = Nuova struttura;
Struttura di selezione.Insert("Nomenclatura", TVHorizon);
Struttura di selezione.Insert("Quantità", 10);
FoundArray di righe = TZNomenclature.FindLines(SelectionStructure);

L’unico aspetto negativo, come puoi vedere, è che non puoi utilizzare altri tipi di confronto diversi da “uguali”