1s 7.7 Regroupement de tables indexées. La classe "fournisseur de données". Qu'est-ce qu'un indice

Vandalesvq 1114 08.11.14 17:00 Actuellement sur le sujet

() CheBurator, il existe un regroupement de conditions, en version 5+. Mais ce n'est qu'en 1C++ - http://www.1cpp.ru/forum/YaBB.pl?num=1273512019.
Il était prévu de réaliser une conception conditionnelle, ainsi qu'un regroupement, mais hélas. Il n'y a qu'une seule raison à cela : je ne travaille pas avec 7 sur une base commerciale et je ne modifie donc pas ces outils. Il n’y a même rien de basique sur quoi tester. Auparavant, les bases de données SQL étaient également basées sur des fichiers et de différentes configurations en masse. Aujourd’hui, il semble qu’il n’y en ait qu’un seul sur lequel il y a eu du développement et celui-là ait été ouvert il y a très longtemps.

De manière générale, voici les dernières modifications :
5.0.1 du 15/04/12
- Le système de sélection dans les extensions dynamiques (Répertoire, Document, Journal, Registre, Opérations, Publications) a été modifié. Ajout de la possibilité de créer des conditions arbitraires avec une hiérarchie.
- Dans le cadre du changement dans le système de sélection, des modifications ont été apportées aux objets d'extension « Data Provider.Journal », « Data Provider.Transactions », « Data Provider.Documents », « Data Provider.Directory », « Data Provider ». .Operations », « Fournisseur de données.Register ».
- Correction du comportement du bouton « Sélectionner par colonne actuelle ». Lorsque vous appuyez dessus, les sélections restantes ne sont pas désactivées. De plus, si la sélection est activée, elle est désactivée.
- Lorsqu'une colonne est activée, l'affichage du bouton « Sélectionner par colonne courante » change.
- La construction des conditions de sélection basées sur les détails a été optimisée.
- Correction de l'erreur de perte de la ligne actuelle lors du changement de vue hiérarchique de l'objet d'extension « Data Provider.Directory ».
- L'utilisation du paramètre « Display Selection Icon » est désactivée. Ce paramètre est laissé pour des raisons de compatibilité ascendante.
- Les objets « Fournisseur de données.Description des types » et « Fournisseur de données.Types de comparaison » ont été supprimés du fournisseur de données. Au lieu de cela, les objets communs « Description des types » et « Types de comparaison » sont utilisés respectivement. Pour plus d'informations, consultez la documentation des classes "Objects_v8".
- Correction d'un crash 1C lors du changement du type de valeur de l'objet « Fournisseur de données ».

5.0.2 du 24/04/12
- Correction d'un bug lors de la création de listes avec des valeurs de chaîne pour la sélection.
- Correction d'une erreur dans la génération d'une requête pour l'objet d'extension « Data Provider.Register » si le registre a l'attribut « Traitement rapide des mouvements »
- Les erreurs identifiées ont été corrigées.

5.0.3 du 22.05.13
- L'objet « Data Provider.Direct Request » a été mis à jour vers la version 1.8.6 en date du 22 mai 2013.
- toutes les classes sont rassemblées dans une seule archive + exemples

5.0.4 du 25/10/13
- Correction des erreurs identifiées

5.0.5 du 23.05.14
- Correction des erreurs identifiées lors de l'ajout de colonnes de données
- Ajout de la possibilité de construire des arborescences dans les champs disponibles lors de l'ajout de colonnes de données (en fait, vous pouvez désormais utiliser l'objet « Sélection » pour construire des sélections comme SKD en 8, mais vous devez avoir un fichier)

Question : Tableau de valeurs indexé


La question est : est-il possible d'indexer la table de valeurs du formulaire de dialogue et de travailler ensuite avec elle comme avec une table indexée ?
Ou est-il préférable de travailler séparément avec ITZ puis de télécharger les résultats dans le tableau des valeurs visible sur le formulaire ?
Et la deuxième question est de savoir comment s'assurer que lors du téléchargement d'ITZ dans la table des valeurs, le format des colonnes ne se trompe pas ?
Le composant PySy de 1c++ en vaut la peine, si c'est le cas.

Répondre:() après le temps de recharge de Natahauze, vous ne pouvez obtenir le pain d'épice nulle part, à moins bien sûr que ce ne soit juste le sujet d'une blague

Question : Travailler avec une table de valeurs


Bonne journée à vous, chers programmeurs. Je demande de l'aide pour résoudre un problème en 1C, je suis désolé, ce n'est pas boum-boum
J’ai essayé de le faire moi-même, mais je n’étais même pas assez intelligent pour compiler l’exemple.

1. Placez un tableau de valeurs dans le formulaire de dialogue.
2. Dans le module formulaire, décrivez les colonnes du tableau : Produit, Quantité, Prix, Montant.
3. Placez sur le formulaire de dialogue les détails du dialogue « Produit », « Prix », « Quantité » et le bouton Ajouter, une ligne qui ajoute nouvelle ligne dans le tableau des valeurs et le remplit avec les valeurs des détails correspondants. Le montant doit être calculé comme le produit du prix et de la quantité.
4. Ajoutez un bouton Supprimer la ligne, qui supprime la ligne actuelle de la table de valeurs. Considérons la situation d'une table de valeurs vide.
5. Ajoutez un bouton Réduire, qui doit résumer le montant et la quantité des produits ; le prix moyen du produit doit être calculé dans la colonne Prix.
6. Ajoutez un bouton Développer, qui restaure l'état de la table de valeurs avant le repli.
7. Ajoutez un bouton Trier pour trier les lignes par produit.

Merci d'avance!

Répondre: plate-forme? Mode guidé ou normal ?
Dans la syntaxe "Tableau des valeurs"

Question : 8.2 - Récupérer les données d'un champ calculé d'une table de valeurs


Je ne sais pas vraiment comment l'expliquer.
Le formulaire comporte un champ de table. Dans la procédure WhenReceiveData(Element, RowDesign) dans un dossier séparé
colonne je calcule la valeur :

Pour chaque ligne de conception du cycle de lignes de conception.... Lignes de conception. Cellules. Expédié. Valeur = Formule ici.... Fin du cycle

C'est donc ainsi que je parcours les lignes de la table de valeurs et récupère les données de cette cellule ?

Répondre:

vous confondez les concepts. un champ de table n'est qu'un champ de table - il n'y a pas de spécification technique ici. tout comme tu calcules la même chose et fais le tour

Question : SKD : Hiérarchie de la table de valeurs


Bonjour!
Dites-moi comment créer une hiérarchie à partir d'un tableau de valeurs comme celui-ci

Chaîne de champ | FieldStringParent
________________________________
Catalogue principal | Catalogue principal
Vassiliev I.A. | Catalogue principal
Location de propriétés | Vassiliev
Documents divers | Vassiliev
Ivanov | Catalogue principal
Location de propriétés | Ivanov
Documents divers | Ivanov

Nous devons d’une manière ou d’une autre en sortir un arbre. Pour l'instant, cela fonctionne par programme, mais je pense qu'une telle arborescence peut être construite dans le système de stockage.

Répondre: Eh bien, par programme, vous créez un objet Value Tree et y placez les handles du propriétaire (nœuds) et des éléments subordonnés (lignes).

Et ces données se présentent uniquement sous la forme d'un tableau de valeurs, et non d'éléments d'un répertoire hiérarchique ? S’il s’agit d’un répertoire hiérarchique, c’est aussi simple que d’éplucher des poires.

Et si vous en avez besoin à partir d'une table de valeurs, en la créant comme bon vous semble, procédez comme ceci :

Vous définissez une table temporaire dans la requête où vous placez vos spécifications techniques.
Ensuite, vous effectuez une sélection dessus et joignez la ligne au parent.

Question : Transférer la Table des Valeurs vers un module commun


Bon après-midi
Nouveau sur 1C. J'étudie la version 3.0 du Thin Client. Il existe un formulaire contrôlé externe. Je souhaite ajouter un tableau de valeurs aux modules communs. Coincé, aidez s'il vous plaît :
1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 & Sur le serveur Procédure Exécuter la requête sur le serveur () З = Nouvelle requête ; H. Texte = "SÉLECTIONNER | Décodage des paiements des ordres de dépenses, accord de contrepartie, | Ordre de paiement des dépensesDécryptage du paiement. Montant du paiement|DE | Document "Ordre de dépenses - Décryptage du paiement" AS "Ordre de dépenses - Décryptage du paiement"; Tz = Z. Exécuter () . Décharger() ; // Affiche le résultat de la requête dans la table du formulaire TF(Tz) ; Fin de procédure & sur la procédure serveur TF (Tz) Fonctions générales. Remplir le Tableau du Formulaire (TdR) Fin de la Procédure

Module général :

Erreur :(Form.Form.Form(23)) : Erreur lors de l'appel de la méthode contextuelle (FillFormTable)
Fonctions générales. Remplir le tableau du formulaire (ToR)
à cause de:
Incompatibilité de type (numéro de paramètre « 1 ») (Type de paramètre invalide. Seuls les types primitifs, les références et la structure sont autorisés)
Comment transférer les spécifications techniques pour un traitement ultérieur ?

Répondre:

message de Prsvet

Pourquoi le type transmet-il un numéro, mais lors de la transmission de spécifications techniques, il est nécessaire de définir la réutilisation des valeurs de retour à ne pas utiliser ?

Parce que,

message de Prsvet

réutiliser les valeurs de retour

Mis en cache sur le client et la table de valeurs n'est pas sérialisée sur le client

Ajouté après 32 secondes
Vous devez travailler avec ce paramètre avec soin !

Ajouté après 35 secondes
Prsvet, si vous ne savez pas comment fonctionne ce paramètre, alors mieux vaut ne pas l'utiliser !

Question : Tableau des valeurs avec remplissage cyclique des colonnes


Tous mes vœux.
La tâche consiste à afficher un tableau des entrées/dépenses de marchandises pour la période sélectionnée avec une répartition hebdomadaire. J'ai décidé de l'implémenter sous forme de tableau de valeurs (au début, je pensais en faire un rapport, mais je n'ai pas trouvé comment). Le nombre de colonnes étant inconnu à l'avance, le tableau est généré par programme :

//*** description des savoirs traditionnels en tant qu'attribut de formulaire SelectionType array = new array; arrayofSelectionType.Add(type("Table de valeurs")); ChoiceTypedescription = nouveau TypeDescription (tableau ChoiceType); arrayAttributes = nouveau tableau ; tableau d'Attributs.Add (nouvel attribut de formulaire ("TZForm", description de SelectionType, "", "TZForm")); //*** description des types CN = new QualifiersNumbers(10,2); KS = nouveaux qualificatifs de ligne (100) ; mas = nouveau tableau ; masse.Add(type("String")); TypeString = new TypeDescription(mas, ks); masse.Clear(); mas = nouveau tableau ; masse.Add(type("Nombre")); TypeNumber = new DescriptionTypes(mas, CN); masse.Clear(); // *** //créer une table temporaire de valeurs TK = new ValueTable ; TK.Columns.Add("produit", TypeString, "produit"); pour n=1 par cycle de nombre de semaines TK.Columns.Add("arrival" + n, TypeNumber, "arrival" + n); TK.Columns.Add("dépense" + n, TypeNumber, "dépense" + n); Fin du cycle ; pour chaque colonne du tableau cyclique TK.Columns de Attributes.Add (new Form Attributes (column.Name, column.ValueType, "TZForm")); Fin du cycle ; changeDetails(arrayDetails); Table SelectionFields = Elements.Add("TZForm", type("FormTable")); Table SelectionFields.DataPath = "TZForm" ; tableSelectionFields.Display = displayTable.List; pour chaque colonne du cycle ToR.column newElement = elements.Add(column.Name, type("FormField"), table of SelectionFields); newElement.View = FormFieldView.InputField ; newElement.DataPath = "TZForm." + Colonne.Nom ; newElement.Width = 10 ; Fin du cycle ;

Ensuite, la colonne du nom est remplie :

RequestNom = nouvelle demande ; zaprNom.Text = "sélectionnez l'article GoodsInWarehousesTurnover.Nomenclature AS | dans l'accumulation Register.GoodsInWarehouses.Turnover() AS GoodsInWarehousesTurnover"; TZNom = lockNom.Execute().Unload(); pour chaque strnom du cycle TZN strnom = strnom.nomenclature ; //ajoute cet élément au TK temporaire StrTZ = TK.Add(); StrTZ.product = strNom ; Fin du cycle ;

Enfin, nous déchargeons les marchandises du TK temporaire vers le formulaire TK :

ValueВFormAttributes(TZ, "TZForm");

Le problème est le remplissage cyclique des revenus et des dépenses. Si je comprends bien, chaque ligne de ces données est remplie par une boucle imbriquée dans une boucle permettant de remplir la colonne produit. C'est-à-dire qu'à chaque itération de remplissage d'une ligne avec un produit, nous faisons une demande de recettes et de dépenses, à laquelle nous transférons le nom du produit, les dates de début et de fin de la période. Le résultat de la requête est téléchargé dans une table de valeurs, qui comporte finalement une seule ligne. Cela fonctionne lorsque les données sont affichées pour toute la période, c'est-à-dire lorsqu'il y a trois colonnes : produit, reçu, dépense.

Mais dans ce cas, deux colonnes sont nécessaires pour chaque semaine. Laissez les noms de ces colonnes être différents selon le numéro de la semaine, c'est-à-dire revenu1, dépense1, revenu2, dépense2, etc. Il est clair que dans ce cas un cycle est organisé dans lequel dans la demande de revenus et dépenses, au lieu de la fin de la période, est transmise la date qui était au début de l'itération + semaine.

La question se pose lors du transfert des montants des revenus et dépenses de la table de valeurs basée sur les résultats de la requête vers une table temporaire. Comment pouvons-nous décrire qu'à chaque itération, lors du téléchargement des données de la table des résultats de la requête dans le TK temporaire, le nombre dans le nom des colonnes de revenus et de dépenses augmente de 1 ? Après tout, en général, le processus de déchargement ressemble à ceci :

TZInflowConsumption = RequestInflowExpense.Execute().unload(); pour chaque dépense entrante de TZ dans le cycle entrant exp. str TZ.receipt = line inflow outflow.receipt ; strTZ.flow = strInflowConsumptionRev.flow ; strTZ.turnover = strIncomeExp.rev.turnover; Fin du cycle ;

Répondre:

enfin arrivé au code. merci, ça a aidé. ça s'est passé comme ça :

TK = Demande de nomenclature (); pour n=1 par cycle de nombre de semaines TK.columns.add("receipt" + n, typeNumber, "receipt" + n); TZ.columns.add("flux" + n, typeNumber, "flux" + n); Fin du cycle ; pour n = 1 par cycle de nombre de semaines ColumnIn = TZ.columns.find("arrival" + n); ColumnExpense = TK.columns.find("dépense" + n); EndPeriod = startPeriod + semaine ; TZPR = RequestTurnover (BeginPeriod, EndPeriod); MPrich = TZPR.unloadColumn(0); MExp = TZPR.unloadColumn(1); TZ.loadColumn(MPrich, ColumnPrich); TZ.loadColumn(Mexp, ColumnExp); DébutPériode = FinPériode ; Fin du cycle ;

Je ne l'ai pas optimisé (par exemple, concernant une requête en boucle), puisque l'aspect final du tableau n'était initialement pas satisfaisant en termes de clarté, j'ai souhaité une solution différente. Je me suis souvenu de la disposition et feuille de calcul, je vais essayer

Question : Comment puis-je le traiter dans une requête sans connaître la structure de la table de valeurs ?


Bonjour. Il existe un tableau de valeurs. Les noms exacts des colonnes ne sont pas connus. Il est nécessaire de traiter le tableau des valeurs, d'y ajouter une colonne et de la remplir. Le remplissage s'effectue à partir d'une colonne dont le nom est connu.
L'option la plus simple consiste à ajouter une colonne et à traiter la table en boucle. Mais ce n’est pas tout à fait bon.
Est-il possible de faire cela dans une requête ?
Merci.

Répondre:

En première approximation :

Sélectionnez * PLACE VT_ExternalData FROM &Table AS ExternalData

Sélectionnez ExternalData.*, Table.FIELD1 FROM VT_ExternalData AS ExternalData LEFT JOIN<Таблица>AS Table ON ExternalData.Field1 = Table.Field1

Question : Comment puis-je effectuer une sélection par propriétaire lors de la sélection d'une valeur de cellule dans un tableau de valeurs sur l'UV ?


Chers collègues! Il n'y a pas si longtemps, la vie m'a forcé à affronter formulaires contrôlés, parce que je ne les comprends pas encore beaucoup. Ne pensez pas que la question est stupide et aidez de toutes les manières possibles :) La question est la suivante. Je crée mon propre tableau de valeurs et l'affiche sur le formulaire. La première colonne est un lien vers l'annuaire de la Nomenclature, les colonnes restantes sont des liens vers l'annuaire dont la Nomenclature est Propriétaire. Comment faire en sorte que lorsque je commence à sélectionner une valeur dans une telle colonne, la liste des valeurs contienne déjà une sélection par propriétaire. Jusqu'à présent, je l'ai fait via l'événement Début de sélection, où j'ouvre une liste avec la sélection requise. Mais le problème est que je ne comprends pas où pousser la valeur résultante dans le traitement de sélection ? Et on soupçonne que la sélection par propriétaire peut être définie via la propriété de la colonne Paramètres de sélection. Que dois-je faire? Dire!

Répondre: et voilà je l'ai

&SurClient
Procédure de traitement de sélection (SelectedValue, SelectionSource) Si SelectionSource.FormName = "Directory.ObjectPropertyValues.Form.ListForm" Alors Et je ne sais pas quoi écrire
, pour placer la SelectedValue dans une cellule de tableau modifiable !!!

fin si;
Fin de la procédure

Question : Regroupement et Collapse() sur une table de valeurs


attention, c'est 7.7 :)
Donc le sujet : je télécharge le PM du document dans la table des valeurs.
Le PM du document a la forme
Charge de débit | Client | adresse de livraison.

Je traite la table de valeurs :
selectRows();
while getString() = 1 Boucle tbl.NewString(); tbl.Client = Client ; tbl.DeliveryAddress = DeliveryAddress; tbl.DocNumber = Invoice.DocNumber ; Fin du cycle ;
Le point est le suivant. Dans la mise en page, lors de l'impression, le client, l'adresse de livraison et les numéros de toutes les factures du client doivent apparaître dans une seule cellule, et il peut également y avoir un client, mais des adresses de livraison différentes. Autrement dit, si le client et l'adresse correspondent, affichez une liste de factures basée sur ces paramètres.

Répondre:() Utilisez une demande noire de documents. Regroupements : Client, Adresse de livraison, Ventes (Classés par numéro). Vous utilisez des cycles prenant en compte les regroupements. Dans le tableau d'origine, affichez les lignes du deuxième groupe (Adresse de livraison), mais après le cycle dans le troisième groupe (Ventes), car dans le deuxième groupe vous formerez une ligne avec les numéros de facture.
Numéros de facture = "" ;
Tandis que Request.Grouping(3 ) = 1 Cycle Invoice Numbers = Invoice Numbers + ?(EmptyLine (Invoice Numbers) = 1 , "", ", ") + Request.OrderingValue((TableRow.Data,LineLength)=Que recherchons-nous pour Then Tableau de FoundLines.Add(TableRow ); EndIf ; EndCycle ;

Une utilisation appropriée des index peut accélérer les requêtes non seulement plusieurs fois, mais aussi des centaines, voire des milliers de fois.

Ce type d’accélération ne peut tout simplement pas être obtenu avec du matériel. Ce sujet mérite donc une attention particulière.

Souvent, afin d'accélérer une requête, vous devez créer votre propre index, et il existe plusieurs manières de le faire.

Dans les didacticiels vidéo, nous examinerons plusieurs façons de créer un index. Nous considérerons également une situation où il est impossible de créer un index de la composition requise moyens réguliers plateforme et il devra être créé dans un SGBD.

Configuration d'index à l'aide des outils de plateforme standard

La leçon montre quels index sont réellement créés pour les objets au niveau du SGBD.
Tout dans ce sujet n'est pas aussi évident qu'il y paraît à première vue. Après tout, pour un certain nombre d'objets, il existe des fonctionnalités de création d'index.
Nous examinerons tous les détails dans cette vidéo.

Indexation avec commande supplémentaire

La vidéo montre la différence entre l'option de construction d'index Indice depuis Index avec supplément commande.
L'exemple montre quel type d'index la plateforme construira lors de l'utilisation d'un tri supplémentaire.

Création d'un index pour les dimensions de registre

L'indexation de la première dimension des registres présente plusieurs nuances.
La vidéo montre quels index sont créés pour les mesures de registre. La situation de l'indexation de la première dimension du registre est également considérée.

ou

Pourquoi un développeur 1C doit-il « indexer » les dimensions et les détails du registre ?

- Eh bien, vous avez des demandes ! - la base de données a dit et s'est bloquée...

La réponse courte à la question du titre est que cela permettra aux requêtes de s'exécuter rapidement et de réduire l'impact négatif des verrous sur .

Qu'est-ce qu'un indice ?

Optimisation du placement de l'index

Quand la taille des tables ne leur permet pas de « rentrer » mémoire vive serveurs, la vitesse passe avant tout sous-système de disque(E/S). Et ici, vous pouvez faire attention à la possibilité de placer des index dans des fichiers séparés situés sur différents disques durs.

Description détaillée Actions http//technet.microsoft.com/ru-ru/bibliothèque/MS175905.aspx
L'utilisation d'un index d'un groupe de fichiers différent améliore les performances des index non clusterisés en raison de la concurrence des processus d'E/S et du travail sur l'index lui-même.
Pour déterminer les dimensions, vous pouvez utiliser le traitement mentionné ci-dessus.

Impact des index sur les verrous

L'absence de l'index nécessaire pour une requête signifie parcourir tous les enregistrements de la table, ce qui conduit à son tour à des verrous redondants, c'est-à-dire sont bloqués entrées supplémentaires. De plus, plus une requête met du temps à se terminer en raison d’index manquants, plus le temps de maintien du verrou sera long.
Une autre raison des verrous est le petit nombre d'enregistrements dans les tables. En raison de ce serveur SQL, lors du choix d'un plan d'exécution de requête, n'utilise pas d'index, mais explore la table entière (Table Scan), bloquant la table entière. Afin d'éviter un tel blocage, il est nécessaire d'augmenter le nombre d'enregistrements dans les tables à 1 500-2 000. Dans ce cas, l'analyse de la table devient plus coûteuse et SQL Server commence à utiliser des index. Bien entendu, cela ne peut pas toujours être fait ; un certain nombre de répertoires tels que « Organisations », « Entrepôts », « Divisions », etc. ont généralement peu d'entrées. Dans ces cas, l’indexation n’améliorera pas les performances.

Performance de l'indice

Nous avons déjà noté dans le titre de l'article que nous nous intéressons à l'effet des index sur les performances des requêtes. Ainsi, les index sont les plus adaptés aux types de tâches suivants :

  • Requêtes qui spécifient des critères de recherche « étroits ». De telles requêtes doivent lire uniquement un petit nombre de lignes répondant à certains critères.
  • Requêtes qui spécifient une plage de valeurs. Ces requêtes doivent également lire un petit nombre de lignes.
  • Une recherche utilisée dans les opérations de liaison. Les colonnes, souvent utilisées comme clés de liaison, sont idéales pour les index.
  • Une recherche dans laquelle les données sont lues dans un ordre spécifique. Si le jeu de résultats doit être trié dans l’ordre des index clusterisés, aucun tri n’est nécessaire car le jeu de résultats est déjà pré-trié. Par exemple, si un index clusterisé est créé sur les colonnes nom, prénom et que l'application nécessite un tri par nom puis par prénom, alors il n'est pas nécessaire d'ajouter une clause ORDER BY.

Certes, malgré toute l'utilité des index, il y en a un MAIS très important : l'index doit être « utilisé efficacement » et doit permettre de trouver des données en utilisant moins d'opérations d'E/S et de ressources système. À l’inverse, les index inutilisés (rarement utilisés) sont plus susceptibles de dégrader les performances d’écriture des données (puisque chaque opération modifiant les données doit également mettre à jour les pages d’index) et de créer un espace de base de données excédentaire.

Couvrant(pour une requête donnée) s'appelle un index qui contient tous les champs nécessaires à cette requête. Par exemple, si un index est créé sur les colonnes a, b et c et que l'instruction SELECT interroge les données de ces colonnes uniquement, seul l'accès à l'index est requis.

Afin de déterminer l'efficacité de l'index, nous pouvons l'estimer grossièrement à l'aide d'un service en ligne gratuit qui montre le « plan d'exécution des requêtes » et les index utilisés.