1s remplissant le tableau des valeurs. Quelles méthodes existent et comment rechercher plusieurs valeurs en même temps

Rechercher dans le tableau des valeurs 1C

Quelles méthodes existent et comment rechercher plusieurs valeurs en même temps.

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

1. Trouver

TVHorizon = Répertoires.Nomenclature.FindBy Name("Horizon TV");
FoundString = TZNomenclature.Find(TVHorizon);
// nous pouvons également spécifier dans quelles colonnes rechercher pour accélérer la recherche
FoundString = TKNomenclature.Find(TVHorizon, "Nomenclature");

Cette méthode renvoie la première chaîne trouvée avec la valeur que vous recherchez, ou Undefined si elle ne la trouve pas. Par conséquent, il est pratique de l'utiliser pour rechercher des valeurs uniques, car sinon, lors de la recherche d'une valeur, vous devrez la supprimer de la table afin de trouver la suivante.

Pour ne pas souffrir comme ça, il existe la méthode suivante, qui permet de trouver un tableau de chaînes convenables :

2. Trouver des chaînes


Sélection Structure.Insert("Nomenclature", TVHorizon); // nous spécifions d'abord la colonne où rechercher, puis ce qu'il faut 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 des 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 ligne du tableau ou, comme dans la méthode précédente, pour la ligne trouvée, vous modifierez la valeur dans le tableau de valeurs traité.

Ce qui est bien avec cette méthode, c'est qu'elle peut rechercher plusieurs colonnes de la table de valeurs à la fois :


SelectionStructure = Nouvelle structure ;
Sélection Structure.Insert("Nomenclature", TVHorizon);
Sélection Structure.Insert("Quantité", 10);
FoundStringArray = TKNomenclature.FindStrings(SelectionStructure);

Le seul point négatif, comme vous pouvez le voir, vous ne pouvez pas utiliser d'autres types de comparaison autre que "égal"

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

1. Créer un tableau de valeurs

Table de valeurs = Nouvelle table de valeurs ;


2. Créez les colonnes du tableau des valeurs :

ValueTable.Columns.Add("Nom");
ValueTable.Columns.Add("Nom de famille");


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


NewString.Name = "Vasily" ;
NewRow.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.

FoundString = ValueTable.Find(LookupValue);


5. Trouver la première occurrence dans certaines colonnes d'un tableau de valeurs

FoundString = ValueTable.Find(LookupValue, "Fournisseur, Acheteur");


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

SearchStructure = Structure("Employé", LookupValue);
ArrayFoundStrings = ValueTable.FindStrings(SearchStructure);


Créons une structure de recherche dont chaque élément contiendra le nom de la colonne comme clé et la valeur recherchée dans cette colonne comme valeur. Nous passons la structure de recherche en tant que paramètre à la méthode FindStrings(). En conséquence, nous obtenons les lignes du tableau.
Si nous ajoutons la recherche de la valeur souhaitée à la structure de recherche, par exemple, également dans la colonne Responsable, puis à la suite de l'application de la méthode FindRows(), nous obtiendrons toutes les lignes où Employé et Responsable sont égaux à la valeur souhaitée valeur.

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

Pour chaque boucle CurrentRow de ValueTable
Rapport(CurrentLine.Name);
FinCycle ;

Faites de même en utilisant les index :

SeniorIndex = ValueTable.Count() - 1 ;
Pour MF = 0 par SeniorIndex Cycle
Report(ValueTable[Count].Name);
FinCycle ;


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

ValueTable.Delete(RemoveRow);

par indice

ValeurTable.Delete(0);


9. Supprimer une colonne existante du tableau des valeurs

ValueTable.Columns.Delete(RemoveColumn);


par indice

ValueTable.Columns.Delete(0);

Il faut tenir compte du fait que la suppression d'une ligne (ou d'une colonne) "du milieu" du tableau des valeurs entraînera une diminution de l'un des index des lignes qui étaient "après" la suppression

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

NouvelleLigne = ValueTable.Add();
NouvelleLigne[NomColonne] = Valeur ;


11. Comment remplir toute la colonne du tableau des valeurs avec la valeur souhaitée ?
La colonne FiscalAccounting Flag dans la table des valeurs de la table des valeurs doit être remplie avec la valeur False

ValueTable.FillValue(False, "Indicateur de comptabilité fiscale");


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

12. Comment remplir la table de valeurs "TableRecipient" avec les données de la table de valeurs "SourceTable" ?

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

TableReceiver = TableOriginal.Copy();


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

Transfert de données partiel pour les colonnes avec des noms correspondants :

Pour chaque ligne de SourceTable à partir de la boucle SourceTable
FillPropertyValues(NewString, SourceTableString);
FinCycle


Pour chaque ligne de la table source, une nouvelle ligne est ajoutée à la table de destination 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 le même nom, la table destination se retrouvera avec 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 de données de la table source ne tombe pas dans le tableau des types autorisés de la colonne 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 parfaite conformité avec la colonne de la table source.

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

SimilarColumns = Nouveau tableau();

Pour chaque colonne de la boucle SourceTable.Columns
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Si la colonne correspond<>Indéfini Alors

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

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

TableReceiver.Columns.Delete(Index);
TableReceiver.Columns.Insert(Index, Nom, ValueType, Titre, Largeur);

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

Fin si;

FinCycle ;

// Boucle sur les lignes de la table source.
Pour chaque ligne de SourceTable à partir de la boucle SourceTable

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

// Remplissez les valeurs dans les cellules correspondantes.
Pour chaque NameColumns Of Same NameColumns Loop
NouvelleChaîne[ColumnName] = SourceTableString[ColumnName] ;

FinCycle ;

FinCycle ;


Nous devrons remplacer la colonne de la table de destination par une nouvelle, dont les propriétés correspondront parfaitement à la colonne de la table source.
Ainsi, si une colonne du même nom est trouvée dans la table des destinataires, nous collectons dans des variables toutes les propriétés de la nouvelle colonne. Ensuite, supprimez l'ancien 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 des destinataires et ouvrons une boucle à travers les noms des colonnes dans le tableau des colonnes correspondantes.
A l'intérieur de cette boucle imbriquée, nous remplissons les cellules de la table destinataire avec les données de la cellule de la table source.

13. Comment ajouter des colonnes au tableau des valeurs "Table of Values" avec des restrictions de type ?

Lors de l'ajout d'une colonne, vous pouvez simplement spécifier son nom, et ne pas toucher au deuxième paramètre de la méthode Add(). 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 restriction de type.
ValueTable.Columns.Add("Objet");


Vous pouvez renseigner la valeur du second paramètre. Il faut y passer 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 en tant que paramètre (s'il existe plusieurs types, puis séparés par des virgules) ou un tableau de types valides.

Ajout d'une colonne spécifiant le type de données

// Restrictions sur les types de données de colonne :
// Uniquement les éléments du répertoire "Entrepreneurs".
ValueTable.Columns.Add("Account",NewTypeDescription("ReferenceReference.Accounts"));


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

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

// Préparer et définir des limites pour les données de type String.
Qualificateurs de chaîne = Nouveaux qualificatifs de chaîne (20, ValidLength.Variable);
AllowedTypes = NewTypeDescription("String",StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Vous pouvez faire de même pour les qualificateurs de nombre et de date.
Remarque : la description de type peut être construite par le constructeur "à partir de zéro", et vous pouvez utiliser une description de type existante 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 des types précédemment utilisée.
Qualificateurs de nombre = Nouveaux qualificatifs de nombre (10, 2, ValidSign.Non-negative);
DateQualifiers = Nouveaux DateQualifiers(DateParts.Date);
ExtendedValidTypes = NewTypeDescription(ValidTypes, "Number, Date",NumberQualifiers,DateQualifiers);

ValueTable.Columns.Add("Remarque", ExtendedAllowedTypes);

Afin de prendre en compte l'argent et les biens, différents tableaux sont largement utilisés dans les entreprises. Presque chaque document est un tableau.

Un tableau répertorie les marchandises à expédier depuis l'entrepôt. Dans un autre tableau - l'obligation de payer pour ces marchandises.

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

Les tableaux en 1C sont également appelés "parties de tableau". Les livres de référence, les documents et autres en ont.

La requête renvoie une table à la suite de son exécution, 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 à dé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élection = Query.Execute().Select();
// contourne toutes les lignes du résultat de la requête dans l'ordre
Pendant que la boucle Selection.Next()
Report(Selection.Name);
FinCycle ;

//Option 2 - chargement dans le tableau des valeurs
Query = New Query("SELECT Name FROM Directory.Nomenclature");
// récupère le tableau
Table = Query.Execute().Upload().
// alors nous pouvons aussi contourner toutes les lignes
Pour chaque ligne de la boucle de table
Report(String.Name);
FinCycle ;
//ou accéder arbitrairement aux chaînes
String = Table.Find("Pelle", "Nom");

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

Tableau sur le formulaire (client lourd)

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

Nous avons discuté des principes de base du travail avec les 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 de configuration. De même, vous pouvez sélectionner le contrôle Form/Insert dans le menu.

Les données peuvent être stockées dans une configuration - vous devez alors sélectionner une 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. Pour voir la liste des parties tabulaires, vous devez développer la branche Objet.

Lors du choix d'une partie tabulaire, 1C lui-même ajoutera des colonnes au tableau sur le formulaire. Les chaînes saisies par l'utilisateur dans une telle table seront automatiquement enregistrées avec le répertoire/document.

Dans la même propriété Data, vous pouvez entrer un nom arbitraire et sélectionner le type ValueTable.

Cela signifie qu'une table de valeurs arbitraire a été sélectionnée. Il n'ajoutera pas automatiquement de colonnes, il ne sera pas automatiquement enregistré, mais vous pourrez en faire ce que vous voulez.

En faisant un clic droit sur le tableau, vous pouvez ajouter une colonne. Dans les propriétés de la colonne, vous pouvez spécifier son nom (pour référence dans le code 1C), l'en-tête de colonne sur le formulaire, la connexion avec l'attribut de la partie tabulaire (cette dernière - sinon une table arbitraire est sélectionnée, mais une 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 ViewOnly. Ces propriétés sont utiles pour organiser des tables destinées à afficher des informations, mais pas à éditer.

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

Dans les propriétés de la barre de commandes, cochez la case Autocomplete pour que les boutons de la barre d'outils apparaissent automatiquement.

Tableau sur formulaire (client léger/managé)

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

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

Pour ajouter des colonnes, utilisez le menu du bouton droit de la souris sur cet attribut de formulaire, élément Ajouter une colonne d'attribut.

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

Pour que le 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.

Exporter un tableau vers Excel

Tout 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 Afficher la 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.

Tous ceux qui programmaient dans une application régulière étaient souvent confrontés à la tâche d'obtenir une table de valeurs arbitraire sur un formulaire. Un tableau de valeurs arbitraire s'entend comme 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 de valeurs" sur le formulaire de traitement, puis transférer par programme la table de valeurs créée ​\u200b\u200bà cet élément. Puis avec une simple commande :

FormElements.TableField.CreateColumns();

pour recevoir le tableau des valeurs prêt sur le formulaire. Il semblerait que cela pourrait être plus facile.

Tout était dans une application normale. Les choses ont changé dans une application gérée. Ainsi, une table arbitraire ne peut pas être créée. Vous devez maintenant soit paramétrer de manière rigide la table de valeurs sur le formulaire, soit la créer par programme (pour décrire, 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 programmation une table de valeurs arbitraire sur un formulaire géré.

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'ayez pas besoin de créer d'élément de formulaire lors du traitement. Nous allons le créer par programmation, comme toute la table. Autrement dit, le tableau sera décrit et créé au moment de l'ouverture du formulaire ou à l'aide d'un bouton - c'est ainsi que vous en avez besoin.

La création d'un tableau sur le formulaire passe par la description du tableau de valeurs sous forme d'attribut :
ArrayChoiceType = Nouveau tableau ; ArrayChoiceType.Add(Type("ValueTable")); ChoiceTypeDescription = Nouveau ChoiceTypeDescription(ChoiceTypeArray); ArrayAttributes = Nouveau tableau ; ArrayAttributes.Add(New FormAttribute("ScheduleTable", ChoiceTypeDescription, "", "TRN")); Nous devons maintenant créer une table de valeurs programmatiques contenant les données. Si la table de valeurs est obtenue à partir d'une requête, alors tout est plus ou moins en ordre. Si la table est créée manuellement, la valeur des colonnes qui contiendront des nombres ou des dates peut être créée via la "Description des types". L'essentiel est que les colonnes de la table de valeurs doivent avoir un certain type. Si, par exemple, on suppose que l'utilisateur remplira les données dans ces colonnes de manière interactive, alors vous ne pouvez pas ajouter une colonne de table de valeurs avec un nom simple, elle doit avoir un type. Gardez à l'esprit - c'est très important. nous transférerons ces types dans le tableau du formulaire.
Créez un tableau contenant plusieurs colonnes :
CD = Nouveaux qualificatifs de date (DateParts.Time); ArrayCD = Nouveau tableau ; ArrayKD.Add(Type("Date")); TypeDescriptionTime = Nouvelle TypeDescription(ArrayKD,KD); TK = Nouvelle Table de Valeurs ;
TK.Columns.Add("De", TypeDescriptionTime);
TK.Columns.Add("Avant", TypeDescriptionTime);
TK.Columns.Add("Nom");
TK.Columns.Add("Note");//Name et Note - strings Ensuite, nous remplirons notre table de programme TK avec les données nécessaires. Nous obtenons 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 de la boucle TK.Column

ArrayAttributes.Add(New FormAttribute(Column.Name, Column.ValueType,"ScheduleTable"));
FinCycle ;
ChangeAttributes(ArrayAttributes);
SelectionFieldTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldTable.DataPath = "ScheduleTable" ;
SelectionFieldTable.Display = DisplayTable.List ;

Voici une combinaison si simple et notre table est prête.

Pour chaque colonne de la boucle TK.Column

NewElement = Elements.Add(Column.Name, Type("FormField"), ChoiceFieldTable);
NewItem.View = FormFieldView.InputField ;
NewItem.DataPath = "ScheduleTable." + Column.Name ;
NewElement.Width = 10 ;
FinCycle ;

Conception conditionnelle, si nous avons besoin, nous é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 "Choix":

ChoiceFieldTable.SetAction("Choix","TCChoice");

Pour gérer cet événement sous forme de procédure, une procédure distincte est écrite :

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

Notez que les gestionnaires de table se déclenchent sur le client et doivent donc avoir une commande de pointeur de compilateur

&ChezClient

Bon, la dernière chose que je voulais ajouter, c'est qu'après toutes ces actions, il ne faut pas oublier de transférer le tableau terminé dans l'attribut form :

ValueVFormAttribute(TK, "Table de planification");

Voici ce que nous avons comme résultat :


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



Épilogue.

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

Vous pouvez télécharger un traitement qui crée par programme une table de valeurs et des sorties vers un formulaire géré avec des commentaires pour vous aider à créer vos tables.

Vous avez aimé l'article ? Partager avec des amis: