1s 8.3 structure du tableau des valeurs

Afin de comptabiliser l'argent et les biens, divers tableaux sont largement utilisés dans les affaires. Presque tous les documents sont un tableau.

Un tableau répertorie les marchandises à expédier depuis l'entrepôt. Un autre tableau montre les obligations de payer pour ces biens.

Par conséquent, en 1C, le travail avec des tableaux occupe une place prépondérante.

Les tableaux en 1C sont également appelés « parties tabulaires ». Les répertoires, documents et autres en ont.

La requête, une fois exécutée, renvoie une table accessible de deux manières différentes.

La première sélection - plus rapide -, l'obtention de lignes à partir de celle-ci n'est possible que dans l'ordre. La seconde consiste à télécharger le résultat de la requête dans une table de valeurs, puis à y accéder de manière aléatoire.

//Option 1 – accès séquentiel aux résultats de la requête

//récupère le tableau
Sélectionner = Query.Run().Select();
// on parcourt toutes les lignes du résultat de la requête dans l'ordre
Boucle While Select.Next()
Rapport (Sélection.Nom);
Fin du cycle ;

//Option 2 – téléchargement vers une table de valeurs
Requête = Nouvelle requête("SELECT Nom FROM Directory.Nomenclature");
//récupère le tableau
Tableau = Requête.Run().Unload().
//de plus, nous pouvons également parcourir toutes les lignes
Pour chaque ligne du cycle de table
Rapport (String.Name);
Fin du cycle ;
//ou accéder arbitrairement aux chaînes
Row = Table.Find("Pelle", "Nom");

Une caractéristique importante est que dans le tableau obtenu à partir du résultat de la requête, toutes les colonnes seront strictement typées. Cela signifie qu'en demandant le champ Nom au répertoire Nomenclature, vous recevrez une colonne du formulaire Chaîne avec une longueur autorisée ne dépassant pas N caractères.

Tableau sur le formulaire (client gros)

L'utilisateur travaille avec le tableau lorsqu'il est placé sur le formulaire.

Nous avons discuté des principes de base du travail avec des formulaires dans la leçon sur et dans la leçon sur

Alors, plaçons le tableau sur le formulaire. Pour ce faire, vous pouvez faire glisser le tableau depuis le panneau Contrôles. De même, vous pouvez sélectionner Contrôle Formulaire/Insertion dans le menu.

Les données peuvent être stockées dans la configuration - vous devez alors sélectionner la partie tabulaire existante (précédemment ajoutée) de l'objet de configuration dont vous modifiez le formulaire.

Cliquez sur le bouton "..." dans la propriété Données. Afin de voir la liste des parties tabulaires, vous devez développer la branche Objet.

Lorsque vous sélectionnez la partie tabulaire, 1C lui-même ajoutera des colonnes au tableau du formulaire. Les lignes saisies par l'utilisateur dans un tel tableau seront automatiquement enregistrées avec l'ouvrage/document de référence.

Dans la même propriété Data, vous pouvez saisir un nom arbitraire et sélectionner le type de table de valeurs.

Cela signifie qu'un tableau de valeurs arbitraire a été sélectionné. Il n'ajoutera pas automatiquement de colonnes ni ne sera automatiquement enregistré, mais vous pouvez en faire ce que vous voulez.

En faisant un clic droit sur le tableau, vous pouvez ajouter une colonne. Dans les propriétés d'une colonne, vous pouvez préciser son nom (pour référence dans le code 1C), l'en-tête de la colonne sur le formulaire, le lien avec l'attribut de la partie tabulaire (cette dernière - si ce n'est pas un tableau arbitraire qui est sélectionné, mais un partie tabulaire).

Dans les propriétés du tableau du formulaire, vous pouvez spécifier si l'utilisateur peut ajouter/supprimer des lignes. Un formulaire plus avancé est la case à cocher Afficher uniquement. Ces propriétés sont pratiques à utiliser pour organiser des tableaux destinés à afficher des informations, mais pas à les éditer.

Pour gérer le tableau, vous devez afficher un panneau de commande sur le formulaire. Sélectionnez l'élément de menu Formulaire/Insérer un contrôle/Barre de commandes.

Dans les propriétés de la barre de commandes, cochez la case Remplissage automatique pour que les boutons du panneau apparaissent automatiquement.

Tableau sur formulaire (client léger/géré)

Sur un formulaire géré, ces actions semblent un peu différentes. Si vous devez placer une partie tabulaire sur le formulaire, développez la branche Objet et faites glisser l'une des parties tabulaires vers la gauche. C'est tout!

Si vous devez placer une table de valeurs, ajoutez un nouvel attribut de formulaire et dans ses propriétés spécifiez le type – table de valeurs.

Pour ajouter des colonnes, utilisez le menu contextuel sur cet attribut de formulaire, sélectionnez Ajouter une colonne d'attribut.

Ensuite, faites également glisser le tableau vers la gauche.

Pour qu'un tableau ait une barre de commandes, dans les propriétés du tableau, sélectionnez les valeurs dans la section Utilisation – Position de la barre de commandes.

Télécharger un tableau vers Excel

N'importe quel tableau 1C situé sur le formulaire peut être imprimé ou téléchargé sur Excel.

Pour ce faire, faites un clic droit sur un espace vide du tableau et sélectionnez Liste.

Dans un client (léger) géré, des actions similaires peuvent être effectuées à l'aide de l'élément de menu Toutes les actions/Afficher la liste.

Salutations à tous les lecteurs d'infostart. Cet article sera consacré à la question de la création d'une table de valeurs arbitraire sous la forme d'une application gérée par programme.

Caractéristiques de la tâche.

Quiconque a programmé dans une application standard a souvent été confronté à la tâche d'obtenir un tableau de valeurs arbitraire sur un formulaire. Un tableau de valeurs arbitraire est un tableau dont le nombre et le type de colonnes ne sont pas connus à l'avance. C'est-à-dire qu'il peut y avoir 3 colonnes, ou peut-être 6, ou peut-être 8. Dans une application normale, tout est simple : vous pouvez placer l'élément « Table des valeurs » sur le formulaire de traitement, puis transférer la table de valeurs créée ​à cet élément par programmation. Puis avec une simple commande :

Formulaire Elements.TableField.CreateColumns();

obtenez un tableau de valeurs prêt à l'emploi sur le formulaire. Il semblerait que cela puisse être plus simple.

Tout cela était dans l'application régulière. Dans une application gérée, tout a changé. Ce n'est pas si simple de créer un tableau arbitraire. Vous devez maintenant soit paramétrer de manière rigide la table de valeurs sur le formulaire, soit la créer par programme (décrivez, eh bien, c'est en fait l'essence de l'application gérée elle-même). C'est ce que nous allons essayer de faire : créer par programme une table de valeurs arbitraire sur un formulaire contrôlé.

La solution du problème.

La première chose que nous devons faire est de déterminer comment le tableau apparaîtra sur le formulaire. L’essentiel est que vous n’avez pas besoin de créer d’élément de formulaire lors du traitement. Nous allons le créer par programme, comme le tableau entier. Autrement dit, le tableau sera décrit et créé au moment de l'ouverture du formulaire ou à l'aide d'un bouton - selon qui en a besoin.

La création d'une table sur le formulaire se fait via la description de la table de valeurs en tant qu'attribut :
SelectionTypeArray = Nouveau tableau ; Tableau de SelectionType.Add(Type("Value Table")); ChoiceTypeDescription = Nouveau TypeDescription (ChoiceTypeArray); Tableau de détails = Nouveau tableau ; Tableau d'attributs.Add (Nouveaux attributs de formulaire ("Tableau de planification", Description du type de sélection, "", "TZN")); Nous devons maintenant créer une table de valeurs de programme contenant les données. Si le tableau des valeurs est obtenu à partir d'une requête, alors tout est plus ou moins en ordre. Si le tableau est créé manuellement, la signification des colonnes qui contiendront des nombres ou des dates peut être créée via la « Description des types ». Le fait est que les colonnes du tableau des valeurs doivent avoir un certain type. Si, par exemple, on s'attend à ce que l'utilisateur remplisse les données de ces colonnes de manière interactive, alors vous ne pouvez pas ajouter une colonne de la table de valeurs simplement avec un nom ; elle doit avoir un type. Gardez à l’esprit : c’est très important parce que... Nous transférerons ces types dans le tableau du formulaire.
Nous créons un tableau qui contient plusieurs colonnes :
CD = NewDateQualifiers(DateParts.Time); ArrayKD = Nouveau tableau ; ArrayCD.Add(Type("Date")); DescriptionTypesTime = Nouveaux DescriptionTypes (ArrayCD,CD); TZ = Nouvelle table de valeurs ;
TK.Columns.Add("Avec", DescriptionTypesTime);
TK.Columns.Add("Avant", DescriptionTypesTime);
TK.Columns.Add("Nom");
TK.Columns.Add("Note"); // Nom complet et note - lignes Ensuite, nous remplirons notre table de programme TK avec les données nécessaires. Nous recevons une table TK qui contient les valeurs nécessaires et est prête à être transférée vers l'attribut de formulaire créé. Pour chaque colonne du cycle de colonnes TK.

Tableau d'attributs.Add (nouveaux attributs de formulaire (Column.Name, Column.ValueType, "ScheduleTable"));
Fin du cycle ;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

C'est une combinaison simple et notre table est prête.

Pour chaque colonne du cycle de colonnes TK.

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField ;
NewElement.DataPath = "ScheduleTable." + Colonne.Nom ;
NewElement.Width = 10 ;
Fin du cycle ;

Conception conditionnelle, si nous en avons besoin, nous l'écrivons également manuellement, le menu de commande - manuellement. Les gestionnaires de table sont également écrits à la main. Par exemple, pour ajouter un gestionnaire d'événements pour la table « Sélection » :

Tableau de SelectionFields.SetAction("Selection","TZNSelection");

Pour traiter cet événement, une procédure distincte est prescrite sous la forme d'une procédure :

&SurClient
Procédure TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//commandes du gestionnaire EndProcedure

Notez que les gestionnaires de tables se déclenchent sur le client et doivent donc disposer d'une commande de pointeur du compilateur.

&SurClient

Eh bien, la dernière chose que je voulais ajouter est qu'après toutes ces étapes, n'oubliez pas de transmettre la table terminée à l'attribut form :

ValueВFormProperties(ToR, "ScheduleTable");

Voilà ce que nous avons comme résultat :


Et voici la gestion de l'événement "Sélection":



Épilogue.

J'espère que l'article aidera les programmeurs 1C qui commencent à créer des tableaux sur un formulaire par programme.

Vous pouvez télécharger un traitement qui crée par programme une table de valeurs et l'affiche sur un formulaire gérable avec des commentaires qui vous aideront à créer vos propres tables.

Voici un petit fait pour commencer - des exemples simples de travail avec une table de valeurs :

1. Créez un tableau de valeurs

ValueTable = Nouveau ValueTable ;


2. Créez des colonnes pour le tableau des valeurs :

ValueTable.Columns.Add("Nom");
Valeur Table.Columns.Add("Last Name");


3. Ajoutez de nouvelles lignes en utilisant les noms de colonnes :


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


4. Comment rechercher une valeur dans la table des valeurs :
Il est nécessaire de trouver une ligne de tableau contenant la valeur souhaitée.

FoundRow = ValueTable.Find (SearchValue);


5. Trouver la première occurrence dans certaines colonnes du tableau des valeurs

FoundRow = ValueTable.Find(SearchValue, "Fournisseur, Acheteur");


6. Si vous devez rechercher toutes les occurrences dans le tableau des valeurs :
Nous utilisons la structure de recherche.

SearchStructure = Structure("Employé", SearchValue);
Tableau de FoundRows = ValueTable.FindRows(SearchStructure);


Créons une structure de recherche dont chaque élément contiendra le nom de la colonne comme clé et la valeur souhaitée dans cette colonne comme valeur. Nous transmettons la structure de recherche en paramètre à la méthode FindLines(). En conséquence, nous obtenons des lignes de tableau.
Si vous ajoutez une recherche de la valeur souhaitée à la structure de recherche, par exemple également dans la colonne Responsable, alors en appliquant la méthode FindLines(), nous obtiendrons toutes les lignes où l'employé et le responsable sont égaux au valeur recherchée.

7. Comment parcourir un tableau de valeurs dans un ordre aléatoire

Pour chaque ligne actuelle de la boucle du tableau des valeurs
Rapport (CurrentRow.Name);
Fin du cycle ;

Même chose en utilisant les index :

SeniorIndex = ValueTable.Quantity() - 1 ;
Pour le compte = 0 au cycle SeniorIndex
Rapport (ValueTable[Compte].Nom);
Fin du cycle ;


8. Suppression d'une ligne de tableau de valeurs existante

ValueTable.Delete (Ligne à supprimer);

par index

ValueTable.Delete(0);


9. Suppression d'une colonne existante de la table de valeurs

ValueTable.Columns.Delete(ColumnToDelete);


par index

ValueTable.Columns.Delete(0);

Il faut tenir compte du fait que la suppression d'une ligne (ou d'une colonne) « à partir du milieu » du tableau des valeurs entraînera une diminution d'un indice des lignes qui se trouvaient « après » la suppression.

10. Comment remplir un tableau de valeurs si les noms de colonnes sont contenus dans des variables ?

NewRow = ValueTable.Add();
NewRow[ColumnName] = Valeur ;


11. Comment remplir toute la colonne du tableau des valeurs avec la valeur souhaitée ?
La colonne Indicateur Comptable Fiscal du tableau de valeurs Table des Valeurs doit être renseignée avec la valeur Faux

Tableau des valeurs. Remplissez les valeurs (Faux, « Drapeau de comptabilité fiscale » );


Nous utilisons la méthode FillValues() pour la table de valeurs. Le premier paramètre est la valeur à remplir. Le deuxième paramètre est le nom de la colonne à remplir.

12. Comment puis-je remplir la table de valeurs « Receiver Table » avec les données de la table de valeurs « SourceTable » ?

Si la table des destinataires n'existe pas encore au moment de l'opération ou si ses colonnes précédentes n'ont pas besoin d'être sauvegardées, vous pouvez la créer comme une copie complète de l'original.

Table des destinataires = Table source.Copy();


Deuxième option : la table ReceiverTable existe, et il serait dommage de perdre ses colonnes et ses restrictions sur les types de données des colonnes. Mais vous devez renseigner les données des colonnes dont les noms correspondent aux noms de la table source.

Transfert de données partiel pour les colonnes dont les noms correspondent :

Pour chaque ligne du SourceTable du cycle SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Fin du cycle


Pour chaque ligne de la table source, une nouvelle ligne est ajoutée à la table réceptrice et les valeurs sont renseignées dans les colonnes de la nouvelle table dont les noms correspondent aux noms des colonnes de la table source

Si les tables n'ont pas de colonnes portant les mêmes noms, la table de destination finira par contenir autant de lignes avec des valeurs nulles qu'il y avait de lignes dans la table source.
Si pour certaines colonnes du même nom, le type de valeur des données de la table source ne tombe pas dans le tableau des types de colonnes autorisés de la table de destination, nous obtiendrons des valeurs vides dans ces champs.
Considérons le troisième cas. Dans le cas de colonnes de même nom, la colonne de la table destination doit être mise en totale conformité avec la colonne de la table source.

Copie complète des données pour les colonnes avec des noms correspondants

Mêmes colonnes = Nouveau tableau ();

Pour chaque colonne du cycle SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Si colonne correspondante<>Indéfini alors

// Récupère les propriétés de la colonne.
Nom = Colonne.Nom ;
ValueType = Colonne.ValueType ;
En-tête = Colonne.En-tête ;
Largeur = Colonne.Largeur ;

// Remplace les colonnes dans la table de destination.
Index = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Index);
ReceiverTable.Columns.Insert (Index, Nom, ValueType, En-tête, Largeur);

// Ajoute le nom suivant des colonnes correspondantes au tableau.
Même Columns.Add(Column.Name);

fin si;

Fin du cycle ;

// Parcourez les lignes de la table source.
Pour chaque ligne du SourceTable du cycle SourceTable

// Ajoute une nouvelle ligne à la table de destination.
NewRow = TableReceiver.Add();

// Remplissez les valeurs dans les cellules correspondantes.
Pour chaque Nom Colonnes À partir de Colonnes du même nom Cycle
NewRow[ColumnName] = SourceTableRow[ColumnName];

Fin du cycle ;

Fin du cycle ;


Nous devrons remplacer la colonne de la table de destination par une nouvelle, dont les propriétés correspondront entièrement à la colonne de la table source.
Par conséquent, si une colonne du même nom est trouvée dans la table des destinataires, nous collectons toutes les propriétés de la nouvelle colonne dans des variables. Ensuite, supprimez l'ancienne et créez une nouvelle colonne. Ensuite, nous parcourons les lignes de la table source.
Dans la boucle, nous ajoutons une nouvelle ligne à la table de réception et ouvrons une boucle sur les noms de colonnes dans le tableau de colonnes correspondantes.
A l'intérieur de cette boucle imbriquée, nous remplissons les cellules de la table de destination avec les données de la cellule de la table source.

13. Comment ajouter des colonnes au tableau de valeurs « ValueTable » avec des restrictions de type ?

Lors de l'ajout d'une colonne, vous pouvez simplement spécifier son nom et laisser le deuxième paramètre de la méthode Add() intact. Dans ce cas, le type de données de la colonne est arbitraire.

Ajouter une colonne sans spécifier de type de données

// Ajoute une colonne sans restrictions de type.
ValueTable.Columns.Add("Objet");


Vous pouvez renseigner la valeur du deuxième paramètre. Là, vous devez transmettre une description du type autorisé pour la colonne. La description elle-même peut être obtenue à l'aide du constructeur en passant le nom de chaîne du type (s'il existe de nombreux types, séparés par des virgules) ou un tableau de types valides en tant que paramètre.

Ajout d'une colonne indiquant le type de données

// Restrictions sur les types de données des colonnes :
// Uniquement les éléments du répertoire "Contreparties".
Tableau des valeurs.Columns.Add("Compte", Nouvelle description des types("DirectoryLink.Accounts"));


Si parmi les types autorisés pour remplir les données des colonnes, il existe une chaîne, vous pouvez limiter sa profondeur de bits (longueur), spécifier l'utilisation d'une longueur variable ou fixe. Tout cela est réalisé en créant un objet à l'aide du constructeur String Qualifiers. Ensuite, cet objet sera utilisé comme l'un des paramètres du constructeur TypeDescription.

Utilisation de qualificatifs pour spécifier le type de données d'une colonne de table de valeurs

// Prépare et définit des restrictions pour les données de type String.
Qualificateurs de chaîne = Nouveaux qualificatifs de chaîne (20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("String", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Des actions similaires peuvent être effectuées en ce qui concerne les qualificatifs de nombre et de date.
Attention : les descriptions de type peuvent être construites par le constructeur soit « à partir de zéro », soit une description de type existante peut être utilisée comme base.

Utilisation de déclarations de type existantes pour spécifier le type de données d'une colonne de table de valeurs

// Extension de la description de type précédemment utilisée.
QualifiersNumbers = Nouveaux QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = Nouveaux DateQualifiers(DateParts.Date);
ValidTypes étendus = Nouveau TypeDescription (ValidTypes, "Numéro, Date", Qualificateurs de nombre, Qualificateurs de date) ;

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

Il existe deux méthodes spéciales pour rechercher une table de valeurs :

1. Trouver

TVHorizon = Directories.Nomenclature.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
//nous pouvons également spécifier dans quelles colonnes rechercher pour accélérer la recherche
FoundString = TZNomenclature.Find(TVHorizon, "Nomenclature");

Cette méthode renvoie la première ligne trouvée avec la valeur souhaitée, ou Undefined si elle ne la trouve pas. Par conséquent, il est pratique de l’utiliser pour rechercher des valeurs uniques, car sinon, lorsqu'une valeur est trouvée, vous devrez la supprimer du tableau afin de trouver la suivante.

Pour éviter ce problème, il existe la méthode suivante qui vous permet de trouver un tableau de chaînes correspondantes :

2. Rechercher des chaînes


Structure de sélection.Insert("Nomenclature", TVHorizon); // indique d'abord la colonne où chercher, puis quoi rechercher.

Cette méthode renvoie toujours un tableau, mais il peut être vide si rien n'est trouvé. Et cette méthode, comme la précédente, renvoie les lignes du tableau de valeurs elles-mêmes, et non les valeurs elles-mêmes dans un tableau séparé. Par conséquent, en modifiant les valeurs dans la chaîne du tableau ou, comme dans la méthode précédente, pour la chaîne trouvée, vous modifierez la valeur dans le tableau des valeurs traité.

Un autre avantage de cette méthode est qu'elle peut effectuer une recherche dans plusieurs colonnes de la table de valeurs à la fois :


SelectionStructure = Nouvelle structure ;
Structure de sélection.Insert("Nomenclature", TVHorizon);
Structure de sélection.Insert("Quantité", 10);
FoundArray de lignes = TZNomenclature.FindLines(SelectionStructure);

Le seul point négatif, comme vous pouvez le constater, est que vous ne pouvez pas utiliser d’autres types de comparaison que « égal »