LA CLOCHE

Il y a ceux qui lisent cette actualité avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam

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

Caractéristiques de la tâche.

Quiconque a programmé dans une application régulière est souvent confronté à la tâche d'obtenir une table arbitraire de valeurs sur un formulaire. Un tableau arbitraire de valeurs est compris comme un tableau dont le nombre et le type de colonnes ne sont pas connus à l'avance. Autrement dit, il peut y avoir 3 colonnes, 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 programme. Puis une simple commande:

Éléments de formulaire.TableField.CreateColumns ();

obtenir une table de valeurs prête à l'emploi sur le formulaire. Il semblerait que cela puisse être plus facile.

Tout était dans une application régulière. Tout a changé dans l'application gérée. Il n'est pas si facile de créer une table arbitraire. Vous devez maintenant soit paramétrer rigidement 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 arbitraire de valeurs sur un formulaire géré.

La solution du problème.

La première chose que nous devons faire est de définir 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 le créerons par programmation, comme la table entière. 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 tout le monde en a besoin.

La création d'une table sur le formulaire se fait par la description de la table de valeurs comme attribut:
ChoiceType Array \u003d Nouveau tableau; Array ofChoiceType.Add (Type ("ValuesTable")); ChoiceTypeDescription \u003d NewTypeDescription (ArrayChoiceType); ArrayAttributes \u003d Nouveau tableau; Tableau d'Attributs.Add (New AttributeForm ("Schedule Table", DescriptionTypeChoice, "", "TZN")); Nous devons maintenant créer une table de valeurs programmatique contenant les données. Si la table de valeurs est obtenue à partir d'une requête, alors tout est plus ou moins d'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 être d'un certain type. Si, par exemple, on suppose que l'utilisateur remplira 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 que c'est très important. nous transférerons ces types dans la table du formulaire.
Nous créons une table qui contient plusieurs colonnes:
KD \u003d New Date Qualifiers (Date Parts.Time); ArrayKD \u003d Nouveau tableau; ArrayCD.Add (Type ("Date")); TypeDescriptionTime \u003d Nouveau TypeDescription (ArrayKD, KD); TK \u003d nouvelle table de valeurs;
TZ.Kolonki.Add ("S", DescriptionTypesTime);
TK.Kolonki.Add ("Avant", DescriptionTypesTime);
TK.Kolonki.Add ("nom complet");
TK.Kolonki.Add ("Note"); // Nom complet et Note - lignes Ensuite, nous remplirons notre table de programme TK avec les données nécessaires. Nous obtenons la 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 TK. Boucle de colonne

Tableau des attributs.Add (nouvel attribut de formulaire (Column.Name, Column.ValueType, "ScheduleTable"));
Fin de cycle;
ModifyAttributes (ArrayAttributes);
ChoiceFieldsTable \u003d Elements.Add ("TZN", Type ("FormTable"));
ChoiceFieldsTable.PathKData \u003d "ScheduleTable";
ChoiceFieldsTable.Display \u003d DisplayTable.List;

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

Pour chaque colonne de TK. Boucle de colonne

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

La conception conditionnelle, si nous en 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 Select:

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

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

& Sur le client
Procédure TZNSelection (TK, SelectedString, Field, StandardProcessing)
// commandes du gestionnaire EndProcedure

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

& Sur le client

Eh bien, et la dernière chose que je voulais ajouter, c'est qu'après toutes ces actions, nous n'oublions pas de transférer le tableau fini dans l'attribut form:

ValueVRequisitForm (TK, "Schedule Table");

Voici le résultat:


Et voici le traitement de l'événement "Select":



Épilogue.

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

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

Publié le 21 septembre 2011

Tableau des valeurs 1C - partie 3. Métadonnées. Faire une boucle dans les colonnes d'une table de valeurs

Dans cet article, je vais vous dire comment travailler avec la table de valeurs d'une structure "inconnue", comment parcourir les colonnes de la table de valeurs, comment extraire des données de colonnes et de lignes sans utiliser les noms de colonne. (Cet article fait référence à un cycle d'articles 1C à partir de zéro; programmation 1c à partir de zéro; tableau des valeurs 1c)

Pour expliquer le matériel et pour pouvoir exécuter nos exemples de code "en direct", nous avons besoin de quelques table de test des valeurs 1C... Certains de nos exemples extrairont des données de la table de valeurs, nous allons donc créer un tableau avec trois colonnes «Nom», «Prénom», «Patronymique» et y ajouter une petite quantité de données - jusqu'à 3 lignes :)

Alors, créons une table de test de valeurs 1C et remplissons-la:

Ma TZ \u003d Nouvelle table de valeurs; // crée une nouvelle table de valeurs stockées dans la variable "MyTZ" MyTZ.Columns.Add ("Last name"); // crée une colonne "Nom" My TZ.Columns.Add ("Name"); // crée une colonne "Nom" My TZ.Columns.Add ("Patronymic"); // crée une colonne "Patronymic" // ajoute la première ligne à notre table de valeurs NewString \u003d MyTZ.Add (); NewStroka.Surname \u003d "Chapaev"; NewStroka.Name \u003d "Vasily"; NewStroka.Patronymic \u003d "Ivanovitch"; // ajoute la deuxième ligne NewString \u003d MyTZ.Add (); NewStroka.Surname \u003d "Dzerzhinsky"; NewString.Name \u003d "Félix"; NewStroka. Patronymic \u003d "Edmundovich"; // ajoute la troisième ligne NewString \u003d My TZ.Add (); NewStroka.Surname \u003d "Kotovsky"; NewStroka.Name \u003d "Gregory"; NewStroka.Patronymic \u003d "Ivanovitch";

Notre table de test se compose de trois colonnes: Prénom, Nom, Patronyme; et a trois lignes remplies avec les noms des héros de la guerre civile.

Le premier exemple de code énumère les colonnes de la table de valeurs 1C en tant que collection.

// affiche les noms de toutes les colonnes de TK pour chaque colonne de mon rapport de cycle TZ.Columns ("Nom de colonne:" + Column.Name); Fin de cycle;

Notre boucle affichera tous les noms de colonnes dans la fenêtre de message 1C:

Nom de colonne: Nom de famille Nom de colonne: Prénom Nom de colonne: Second prénom

Nous voyons qu'une boucle de collection spéciale est utilisée pour itérer sur les colonnes, similaire à la boucle à travers les lignes (dans l'article précédent). Mes colonnes TZ. est une collection de colonnes de la table des valeurs 1C "MyTZ"... La collection contient des objets du type "ColumnTableValues" Chaque objet de ce type est à la fois une colonne d'une table de valeurs et contient des propriétés et des méthodes. En se référant à ces propriétés et méthodes, nous obtenons les informations nécessaires sur une colonne ou effectuons d'autres actions avec elle.

Par exemple, faire référence à la propriété "Nom" (Nom de colonne) nous obtenons le nom de la colonne courante.

Je voudrais attirer votre attention sur le titre du cycle: "Pour chacun Colonne From MyTZ.Columns Loop "Variable nommée "Colonne" inventé par nous. Il n'est pas nécessaire d'utiliser le même nom. Vous pouvez nommer cette variable comme vous le souhaitez, par exemple "MyCurrentColumn" Ensuite, l'exemple ci-dessus ressemblera à ceci:

// affiche les noms de toutes les colonnes de TK For each MyCurrentColumn From My TZ.Columns Loop Report ("Column name:" + MyCurrentColumn.Name); Fin de cycle;

Lorsque le sous-système exécutant 1C rencontre une boucle de ce type, à chaque passage de la boucle, il assigne une variable avec le nom spécifié un élément de notre collection, dans ce cas - un élément de collection colonnes de table de valeurs Mes colonnes TZ. Et puis nous nous référons à la variable qui contient la colonne actuelle et utilisons la propriété "Nom".

Je suggère d'afficher le numéro de chaque colonne dans la collection de colonnes à côté du nom de la colonne:

// affiche le nombre et les noms de toutes les colonnes de la table de valeurs pour chaque colonne de mon cycle TZ.Columns Numéro de colonne de cycle \u003d My TZ.Columns.Index (Column); // récupère le numéro de la colonne ColumnName \u003d Column.Name; // récupère le nom de la colonne Report ("Numéro de colonne:" + Numéro de colonne + "Nom de colonne:" + Nom de colonne); Fin de cycle;

Le texte sera affiché dans la fenêtre de message 1C:

Numéro de colonne: 0 Nom de colonne: Nom de famille Numéro de colonne: 1 Nom de colonne: Prénom Numéro de colonne: 2 Nom de colonne: Second prénom

Faites attention au fait que les colonnes du tableau des valeurs 1C sont numérotées à partir de zéro, tout comme les lignes du tableau des valeurs.

Nombre de colonnes dans le tableau des valeurs 1C

Pour connaître le nombre de colonnes dans la table de valeurs, nous utilisons la méthode "Count ()" sur la collection de colonnes.

Number of Columns \u003d My TZ.Columns.Number (); Rapport (nombre de colonnes);

L'écran affichera le chiffre "3". En effet, notre tableau comporte trois colonnes: "Nom", "Prénom", "Patronymique"

Obtention d'un objet de colonne par son numéro (index) et itération sur les colonnes à l'aide de l'index de colonne

Parcourons toutes les colonnes de la table de valeurs en utilisant les indices de colonne (nombres). N'oubliez pas que la numérotation des colonnes commence à zéro. Il faut donc incrémenter le compteur du cycle "Mid" de zéro à un nombre égal au nombre de colonnes moins un.

Pour MF \u003d 0 By My TZ.Kolonki.Number () - 1 Cycle CurrentColumn \u003d My TZ.Kolonki [Ms]; Rapport (CurrentColumn.Name); Fin de cycle;

Sur l'écran, on obtient ce qui suit

Nom complet

Je pense que cet exemple était clair. Nous nous sommes tournés vers la méthode Montant() collections de colonnes " Mes colonnes TZ.Number ()", a obtenu le nombre de colonnes et a démarré un cycle avec un compteur de rayure avant nombre de colonnes moins une... À l'intérieur de la boucle, nous récupérons chaque colonne de la collection de colonnes et affectons l'objet de colonne actuel à une variable CurrentColumn De plus, la variable CurrentColumn nous nous référons à la propriété Nom et affichez la valeur de cette propriété à l'écran: Rapport (CurrentColumn.Name);

Il est important de ne jamais confondre une propriété objet et une méthode objet.

Une propriété est une sorte de valeur statique et l'accès à celle-ci est écrit sans parenthèses, par exemple CurrentColumn.Name... Une méthode est essentiellement une procédure ou une fonction d'un objet, et les appels aux procédures et fonctions sont toujours écrits avec des parenthèses (même s'il n'y a pas de paramètres d'entrée). Par exemple: Mes colonnes TZ.Number ()

Si nous nous tournons vers la méthode, en oubliant d'écrire les parenthèses, l'interpréteur 1C nous donnera un message d'erreur et n'exécutera pas le code pour l'exécution. Puisque l'interpréteur considérera que nous ne faisons pas référence à une méthode, mais à une propriété - car il n'y a pas de crochets. Et il ne pourra pas trouver les propriétés avec ce nom (car il n'y a qu'une méthode avec un tel nom) - ce qui sera dit dans le message d'erreur.

C'est ce que l'interpréteur écrira si j'oublie de mettre des parenthèses dans l'appel de méthode d'une si mauvaise manière Mes colonnes TZ.Quantité (sans crochets après "Montant ()"):

Champ d'objet introuvable (nombre)

Dans ce cas, «champ» et «propriété» doivent être compris comme des synonymes ou une inexactitude dans la terminologie des développeurs 1C. Ils utilisent ces deux mots pour désigner le même concept. Bien que dans d'autres langages de programmation, ces termes puissent signifier différents concepts.

Obtention de données à partir d'un tableau de valeurs 1C à l'aide de numéros de colonne

Pour commencer, je vous propose un exemple simple d'obtention de données à partir de la première ligne de notre tableau. Veuillez noter que nous utilisons un tableau pré-rempli depuis le début de l'article. Nous savons avec certitude que le tableau a la première ligne et qu'il y a au moins une colonne. Si nous appliquons cet exemple à une table vide, une erreur se produira. Alors:

FirstRow \u003d MyTZ; // récupère la première ligne (numérotation à partir de zéro) FirstColumnValue \u003d FirstLine; // récupère la valeur de la première colonne (la numérotation des colonnes est également à partir de zéro) Report (FirstColumnValue); // affiche la valeur de la première colonne de la première ligne du tableau

L'écran affichera:

Chapaev

Tout d'abord, nous avons obtenu l'objet ligne de la table de valeurs en accédant à la table de valeurs à l'aide de [...] l'opérateur. (si vous avez oublié comment faire cela, vous pouvez consulter les articles précédents) A l'intérieur de l'opérateur, nous avons passé l'argument "0". Il s'agit de l'index de la première ligne de la table de valeurs. FirstRow \u003d MyTZ;

De plus, nous avons également le droit de faire référence à l'objet string en utilisant [...] l'opérateur. A l'intérieur de cet opérateur, nous avons passé le numéro de la colonne de la table de valeurs, dans ce cas également "0". Et ainsi, nous avons obtenu la valeur de la colonne numérotée «0» pour la ligne de table courante numérotée «0». Nous avons affiché cette valeur à l'écran et c'est la chaîne "Chapaev".

Compliquons un peu notre exemple:

FirstRow \u003d MyTZ; // récupère la première ligne (numérotation à partir de zéro) Report (FirstLine); // affiche la valeur de la première colonne de la première ligne du tableau Report (FirstRow); // affiche la valeur de la deuxième colonne dans la première ligne du tableau Report (FirstRow); // affiche la valeur de la troisième colonne dans la première ligne du tableau

Nous avons maintenant imprimé les valeurs des trois colonnes de la première ligne de notre tableau de valeurs:

Chapaev Vasily Ivanovich

Maintenant, je modifie toujours cet exemple pour que nous nous passions de la variable "Première ligne"

Rapport (MyTZ); // affiche la valeur de la première colonne de la première ligne du tableau Report (MyTZ); // affiche la valeur de la deuxième colonne dans la première ligne du tableau Report (MyTZ); // affiche la valeur de la troisième colonne dans la première ligne du tableau

L'écran sera le même

Chapaev Vasily Ivanovich

Nous avons vu dans l'exemple ci-dessus que pour accéder à une valeur située dans une ligne spécifique et une colonne spécifique du tableau de valeurs, nous pouvons utiliser un appel séquentiel de deux opérateurs [...] sous cette forme: Table de valeurs [Index de ligne] [Index de colonne]

Cela signifie que nous sommes prêts à créer une boucle d'itération et à obtenir les données de toutes les lignes et de toutes les colonnes à l'aide des index de ligne et de colonne:

For RowCounter \u003d 0 By My TZ.Number () - 1 Loop // itération de la boucle sur les lignes For ColumnCounter \u003d 0 By My TZ.Columns.Number () - 1 Loop // boucle imbriquée itérant sur les colonnes // récupère la valeur de la cellule (à partir de la ligne actuelle et du courant colonnes) Valeur de la cellule \u003d MyTZ [LineCounter] [ColumnCounter]; // affiche le numéro de ligne, le numéro de colonne et la valeur de la cellule Report ("Line #" + LineCounter + "Column #" + ColumnCount + "\u003d" + CellValue); Fin de cycle; Fin de cycle;

L'écran affichera les éléments suivants:

Ligne # 0 colonne # 0 \u003d Chapaev Ligne # 0 colonne # 1 \u003d Vasily Ligne # 0 colonne # 2 \u003d Ivanovich Ligne # 1 colonne # 0 \u003d Dzerzhinsky Ligne # 1 colonne # 1 \u003d Felix Ligne # 1 colonne # 2 \u003d Ligne Edmundovich # 2 colonne # 0 \u003d Ligne Kotovsky # 2 colonne # 1 \u003d Ligne Grigory # 2 colonne # 2 \u003d Ivanovich

À l'aide de deux boucles, dont l'une est imbriquée dans l'autre, nous avons affiché les valeurs de toutes les colonnes de toutes les lignes de la table de valeurs 1C. Dans ce cas, nous n'avons pas utilisé les noms des colonnes, mais nous avons fait référence aux colonnes et aux lignes par leurs index. Pour une meilleure compréhension, faites attention aux commentaires à l'intérieur de l'exemple.

Enfin, je suggère de modifier légèrement notre exemple afin qu'au lieu des numéros de colonne, il affiche leurs noms à l'écran. Et je ferai en outre une présentation plus présentable du contenu à l'écran.

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // boucle itérante sur les lignes Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Signaler(" "); // saut de ligne (insertion d'une ligne vide) For ColumnCounter \u003d 0 By MyTZ.Columns.Number () - 1 Loop // boucle imbriquée itérant sur les colonnes // obtenir la valeur de la cellule (à partir de la ligne actuelle et de la colonne actuelle) Cell Value \u003d MyTZ [LineCounter] [ ColumnCounter]; // récupère le nom de la colonne ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // affiche le nom de la colonne et la valeur de la cellule Report (ColumnName + ":" + CellValue); Fin de cycle; Signaler(" "); // saut de ligne (insertion d'une ligne vide) Fin de la boucle;

Maintenant, sur notre écran, les informations semblent plus représentatives:

Numéro de ligne 0 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nom: Chapaev Nom: Vasily Patronyme: Ivanovich \u003d\u003d\u003d\u003d\u003d\u003d\u003d Ligne numéro 1 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nom: Dzerzhinsky Nom: Felix Patronymique: Edmundovich \u003d\u003d\u003d\u003d\u003d \u003d\u003d Ligne numéro 2 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nom: Kotovsky Nom: Grigory Patronyme: Ivanovich

Oui, j'ai presque oublié. Lors de l'utilisation de deux opérateurs [...] [...] d'affilée, nous pouvons passer le nom de cette colonne au lieu de l'index de colonne: Tableau des valeurs [Index de ligne] [NomColonne]

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // boucle itérante sur les lignes Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Signaler(" "); // saut de ligne (insertion d'une ligne vide) For ColumnCounter \u003d 0 By MyTZ.Colonki.Number () - 1 Loop // boucle imbriquée itérant sur les colonnes ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // récupère le nom de la colonne CellValue \u003d MyTZ [LineCounter] [ColumnName]; //

Faites attention à la ligne marquée d'une flèche ". Dans cette ligne, au lieu de l'index de la colonne courante, nous passons le nom de la colonne courante à l'argument entre crochets [...] Le résultat sera le même.

Et maintenant, le dernier de cet article.

Récupération CORRECT de toutes les données de la table des valeurs 1C, en utilisant des boucles d'itération sur une collection de lignes et une collection de colonnes

For Each CurrentString From MyTZ Loop // boucle à travers la collection de chaînes Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentString) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Signaler(" "); For Each CurrentColumn From MyTZ.Columns Loop // Boucle imbriquée itérant sur la collection de columnsColumnName \u003d CurrentColumn.Name; // récupère le nom de la colonne CellValue \u003d CurrentRow [ColumnName]; // obtenir la valeur de la cellule BY column NAME Report (ColumnName + ":" + CellValue); // affiche le nom de la colonne et la valeur de la cellule EndCycle; Signaler(" "); Fin de cycle;

Dans l'exemple, deux boucles ont été utilisées. La boucle à travers la collection de colonnes est imbriquée à l'intérieur de la boucle à travers les lignes. Si vous avez traité les exemples ci-dessus et lu les articles précédents, vous n'aurez aucune difficulté à comprendre comment fonctionne cet exemple.

Enfin, je vais réduire le plus possible le nombre de lignes de code dans notre dernier exemple en éliminant l'utilisation de variables intermédiaires. Nous obtiendrons un échantillon de "code industriel" utilisé dans des problèmes du monde réel.

Cela ne devrait être fait que lorsque vous avez une bonne compréhension de ce que vous faites. Si le code est très complexe, il est alors permis de laisser des variables intermédiaires pour faciliter la compréhension ultérieure de votre propre code. En outre, tout code doit être au moins minimalement commenté, de sorte qu'après un certain temps, il sera plus facile de comprendre les textes du programme.

Pour chaque CurrentString From MyTZ Loop // itérer sur les lignes Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentString) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d" + Symbols.PS); For Each CurrentColumn From MyTZ.Columns Loop // itérer sur les colonnes Report (CurrentColumn.Name + ":" + CurrentRow [CurrentColumn.Name]); Fin de cycle; Signaler(" "); Fin de cycle;

La sortie à l'écran n'a pas changé, elle reste la même que dans l'exemple précédent:

COURS DE 2 SEMAINES

"PROGRAMMATION EN 1C POUR LES DÉBUTANTS"

Le cours sera envoyé par e-mail. Devenez programmeur en accomplissant des tâches étape par étape.

Pour participer, vous n'avez besoin que d'un ordinateur et d'Internet

Accès gratuit au cours:

Sp-force-hide (affichage: aucun;). Sp-form (affichage: bloc; arrière-plan: # eff2f4; remplissage: 5px; largeur: 270px; largeur max: 100%; rayon de la bordure: 0px; -moz-bordure -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 (affichage: bloc en ligne; opacité: 1; visibilité: visible;). sp-form .sp-form-fields-wrapper (marge: 0 auto; largeur: 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; height: 35px; width: 100%;). sp-form .sp-field label (couleur: # 444444; font- size: 13px; font-style: normal; font-weight: bold;). sp-form .sp-button (border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: # f4394c; color: #ffffff; width: 100%; font-weig ht: 700; style de police: normal; famille de polices: Arial, "Helvetica Neue", sans-serif; boîte-ombre: aucun; -moz-box-shadow: aucun; -webkit-box-shadow: aucun; background: linear-gradient (to top, # e30d22, # f77380);). sp-form .sp-button-container (text-align: center; width: auto;)

Afin d'enregistrer l'argent et les biens, différentes tables sont largement utilisées dans les affaires. Presque chaque document est un tableau.

Un tableau répertorie les articles à expédier depuis l'entrepôt. Dans un autre tableau, il y a des obligations de payer pour ces marchandises.

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

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

À la suite de son exécution, la requête renvoie une table, accessible de deux manières différentes.

La première sélection - plus rapide -, la récupération des 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 la table
Selection \u003d Query.Run (). Select ();
// parcourt toutes les lignes du résultat de la requête dans l'ordre
Pendant l'échantillonnage.Next () Loop
Rapport (Exemple. Nom);
Fin de cycle;

// Option 2 - déchargement dans une table de valeurs
Request \u003d New Request ("SELECT Name FROM Directory.Nomenclature");
// récupère la table
Table \u003d Query.Run (). Unload ().
// plus loin, nous pouvons également contourner toutes les lignes
Pour chaque ligne de la boucle de table
Rapport (String.Name);
Fin de cycle;
// ou accède arbitrairement aux chaînes
String \u003d Table. Find ("Shovel", "Name");

Une caractéristique importante est que dans la table 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 du livre de référence de la nomenclature, vous recevrez une colonne du type Chaîne avec une longueur autorisée ne dépassant pas N caractères.

Tableau sur formulaire (gros client)

L'utilisateur travaille avec la table lorsqu'elle est placée 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 dans le menu Formulaire / Insérer un contrôle.

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

Cliquez sur le bouton "..." dans la propriété Data. Pour voir la liste des sections tabulaires, vous devez développer la branche Objet.

Lors du choix d'une section tabulaire, 1C lui-même ajoutera des colonnes au tableau du formulaire. Les lignes saisies par l'utilisateur dans un tel tableau seront enregistrées automatiquement avec la référence / le document.

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

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

En cliquant avec le bouton droit sur le tableau, vous pouvez ajouter une colonne. Dans les propriétés d'une colonne, vous pouvez spécifier son nom (pour référence dans le code 1C), l'en-tête de colonne sur le formulaire, le lien avec l'attribut de section tabulaire (ce dernier - si ce n'est pas un tableau arbitraire, mais la section tabulaire est sélectionnée).

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

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

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

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

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

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

Pour ajouter des colonnes, utilisez le menu contextuel sur cet attribut de formulaire, l'élément de colonne Ajouter un attribut.

Faites ensuite é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é vers Excel.

Pour ce faire, cliquez avec le bouton droit sur un espace vide du tableau et sélectionnez Liste.

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

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

1. Trouvez

Horizon TV \u003d Livres de référence.Nomenclature.FindByName ("Horizon TV");
FoundString \u003d TKNomenclature.Find (Horizon TV);
// nous pouvons également spécifier dans quelles colonnes rechercher pour accélérer la recherche
FoundString \u003d TKNomenclature.Find (Horizon TV, "Nomenclature");

Cette méthode renvoie la première chaîne trouvée avec la valeur souhaitée, ou Indéfini dans le cas contraire. Par conséquent, il est pratique de l'utiliser pour rechercher des valeurs uniques, car sinon, lorsqu'une valeur est trouvée, supprimez-la de la table pour trouver la suivante.

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

2. FindStrings


StructureSelection.Insert ("Nomenclature", TV Horizon); // spécifiez d'abord la colonne où chercher, puis ce qu'il faut rechercher.

Cette méthode renvoie toujours un tableau, mais il peut être vide si rien n'a été trouvé. Et cette méthode, tout comme la précédente, renvoie les lignes de la table 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 modifiez la valeur dans la table de valeurs traitée.

Une autre bonne chose à propos de cette méthode est qu'elle peut rechercher plusieurs colonnes de la table de valeurs à la fois:


Cadre de sélection \u003d nouvelle structure;
StructureSelection.Insert ("Nomenclature", TV Horizon);
Structure de la sélection Insérer ("Quantité", 10);
FoundArrayStrings \u003d TZNomenclature.FindStrings (SelectionStructure);

Le seul inconvénient, comme vous pouvez le voir, vous ne pouvez pas utiliser d’autres types de comparaison que «égal»

Voici un petit fait pour commencer - des exemples simples d'utilisation d'une table de valeurs:

1. Créez une table de valeurs

ValuesTable \u003d Nouvelle table de valeurs;


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

TableValues.Columns.Add ("Nom");
ValuesTable.Columns.Add ("Nom");


3. Ajoutez de nouvelles lignes à l'aide des noms de colonne:


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


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

FoundString \u003d ValueTable.Find (LookupValue);


5. Recherchez la première occurrence dans des colonnes spécifiques du tableau des valeurs

FoundString \u003d ValueTable.Find (SearchValue, "Fournisseur, Acheteur");


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

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


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

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

Pour chaque ligne courante de la boucle de table de valeurs
Rapport (CurrentString.Name);
Fin de cycle;

Même chose avec les index:

MajorIndex \u003d ValueTable.Number () - 1;
Pour MF \u003d 0 au cycle à indice élevé
Rapport (Table des valeurs [Nombre] .Nom);
Fin de cycle;


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

ValuesTable.Delete (DeletedString);

par index

ValuesTable.Remove (0);


9. Suppression d'une colonne existante du tableau des valeurs

ValuesTable.Columns.Remove (DeletedColumn);


par index

ValuesTable.Columns.Remove (0);

Il faut garder à l'esprit que la suppression d'une ligne (ou colonne) "du milieu" du tableau de valeurs entraînera une diminution de un dans les indices des lignes "après" la suppression

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

NewRow \u003d Table des valeurs.Add ();
NewString [ColumnName] \u003d Valeur;


11. Comment remplir toute la colonne du tableau des valeurs avec la valeur souhaitée?
Colonne FiscalAccounting L'indicateur dans le tableau des valeursValuesTable doit être rempli avec la valeur False

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


Appliquez la méthode FillValues \u200b\u200b() à la table de valeurs. Le premier paramètre est la valeur à renseigner. Le deuxième paramètre est le nom de la colonne à remplir.

12. Comment remplir le tableau de valeurs "RecipientTable" avec les données du tableau de valeurs "SourceTable"?

Si la table des destinataires n'existe pas au moment de l'opération, ou si vous n'avez pas besoin d'enregistrer ses colonnes précédentes, vous pouvez la créer en tant que copie complète de l'original

ReceiverTable \u003d SourceTable.Copy ();


Deuxième option: la table TableRecipient existe, et c'est dommage de perdre ses colonnes et ses restrictions sur les types de données des colonnes. Mais vous devez remplir les données pour les colonnes, dont les noms coïncident avec les noms de la table source.

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

Pour chaque ligne SourceTable de la boucle SourceTable
FillPropertyValues \u200b\u200b(NewRow, SourceTableRow);
Fin de cycle


Pour chaque ligne de la table source, une nouvelle ligne est ajoutée à la table de réception et les valeurs sont remplies dans les colonnes de la nouvelle table, dont les noms coïncident avec les noms des colonnes de la table d'origine

Si les tables n'ont pas de colonnes avec le même nom, la table résultante contiendra autant de lignes avec des valeurs vides qu'il y avait de lignes dans la table source.
Si pour certaines colonnes du même nom, le type de la valeur de données de la table source ne tombe pas dans le tableau des types de colonnes autorisés de la table de réception, nous obtiendrons des valeurs vides dans ces champs.
Prenons le troisième cas. Dans le cas des colonnes du même nom, la colonne de la table de réception doit être mise en totale conformité avec la colonne de la table source.

Copie complète des données pour les colonnes portant les mêmes noms

Colonnes éponymes \u003d Nouveau tableau ();

Pour chaque colonne de la boucle de colonnes de la table source
MatchingColumn \u003d TableRecipient.Columns.Find (Column.Name);

Si MatchedColumn<> Indéfini alors

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

// Remplace les colonnes dans la table de réception.
Index \u003d TableReceiver.Columns.Index (MatchingColumn);

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

// Ajoute le nom suivant des colonnes correspondantes au tableau.
Colonnes du même nom.Add (Column.Name);

Fin si;

Fin de cycle;

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

// Ajoute une nouvelle ligne à la table de réception.
NewRow \u003d TableRecipient.Add ();

// Remplissez les valeurs dans les cellules correspondantes.
Pour chaque nom Colonnes de la boucle de colonnes similaires
NewRow [ColumnName] \u003d SourceTableRow [ColumnName];

Fin de cycle;

Fin de cycle;


Nous devrons remplacer la colonne de la table de réception 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 se trouve dans la table des destinataires, nous collectons toutes les propriétés de la nouvelle colonne dans les variables. Ensuite, supprimez l'ancien et créez une nouvelle colonne. Ensuite, nous parcourons les lignes de la table source.
Dans la boucle, ajoutez une nouvelle ligne à la table de réception et ouvrez la boucle pour parcourir les noms de colonnes dans le tableau de colonnes correspondantes.
À l'intérieur de cette boucle imbriquée, nous remplissons les cellules de la table de réception avec les données de la cellule de la table source.

13. Comment ajouter des colonnes à la table de valeurs "ValuesTable" avec des contraintes par 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 () inchangé. Dans ce cas, le type de données de la colonne est arbitraire.

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

// Ajout d'une colonne sans restriction de type.
TableValues.Columns.Add ("Objet");


Vous pouvez renseigner la valeur du deuxième paramètre. La description du type autorisé pour la colonne doit y être passée. La description elle-même peut être obtenue en utilisant le constructeur, en passant ce dernier en paramètre le nom du type de chaîne (s'il y a plusieurs types, alors séparés par des virgules) ou un tableau de types admissibles.

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

// Restrictions sur les types de données de colonne:
// Uniquement les éléments de la recherche "Contractors".
TableValues.Columns.Add ("Contractor", Nouvelle description des types ("ReferenceLink.Contractors"));


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 accompli en créant un objet à l'aide du constructeur String Qualifiers. 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 valeurs de table

// Préparez et définissez des restrictions pour les données de type String.
Qualificatifs de chaîne \u003d Nouveaux qualificatifs de chaîne (20, ValidLength.Variable);
AllowedTypes \u003d NewTypeDescription ("String", StringQifiers);
ValuesTable.Columns.Add ("NoteStringShort", AllowedTypes);


Vous pouvez faire de même pour les qualificatifs de date et de date.
Remarque: la description de type peut être construite par le constructeur à la fois "à partir de zéro", ou utiliser une description de type existante comme base

Utilisation des descriptions 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.
QualifiersNumber \u003d Nouveau QualifiersNumber (10, 2, ValidSign.Non-négatif);
Qualificatifs de date \u003d Nouveaux qualificatifs de date (DateParts.Date);
ExtendedAllowedTypes \u003d NewTypeDescription (AllowedTypes, "Number, Date", Number Qualifiers, Date Qualifiers);

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

LA CLOCHE

Il y a ceux qui lisent cette actualité avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam