Langage intégré du système 1C : Entreprise. Petites astuces des grosses requêtes Query = New Query

Demandes sont conçus pour extraire et traiter les informations de la base de données afin de les fournir à l'utilisateur sous la forme requise. Traiter ici signifie regrouper des champs, trier des lignes, calculer des totaux, etc. Vous ne pouvez pas modifier les données à l'aide de requêtes dans 1C !

La demande est exécutée selon les instructions données - demander un texte. Le texte de la demande est compilé conformément à la syntaxe et aux règles langage de requête. Le langage de requête 1C:Enterprise 8 est basé sur le standard SQL, mais présente quelques différences et extensions.

Schéma de travail avec une demande

Le schéma général de travail avec une requête se compose de plusieurs étapes successives :

  1. Création d'un objet Request et définition du texte de la demande ;
  2. Définition des paramètres de la demande ;
  3. Exécuter une requête et obtenir le résultat ;
  4. Contourner le résultat de la demande et traiter les données reçues.

1. Objet Demande a la propriété Texte, auquel vous devez attribuer le texte de la demande.

// Option 1
Demande = Nouvelle demande ;
Demande . Texte =
"CHOISIR
| Taux de change.Période,
| Taux de change. Devise,
| Taux de change.Taux
|DE

|OÙ
;

// Option 2
Demande = Nouvelle demande("CHOISIR
| Taux de change.Période,
| Taux de change. Devise,
| Taux de change.Taux
|DE
| Registre d'informations.Taux de change AS Taux de change
|OÙ
| Taux de change.Devise = &Devise");

2. Le réglage des valeurs des paramètres s'effectue à l'aide de la méthode DéfinirParamètre(< Имя>, < Значение>) . Les paramètres dans le texte de la demande sont indiqués par le symbole « & " et sont généralement utilisés dans les conditions de sélection (section WHERE) et dans les paramètres des tables virtuelles.

Demande);

3. Après avoir attribué le texte et défini les paramètres, la requête doit être exécutée et le résultat de l'exécution obtenu. L'exécution est réalisée par la méthode Execute(), qui renvoie un objet Résultat de la requête. À partir du résultat de la requête, vous pouvez :

  • obtenir une sélection en utilisant la méthode Select (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • télécharger des valeurs dans une table de valeurs ou un arbre de valeurs à l'aide de la méthode Upload (< ТипОбхода>) .

// Recevoir un échantillon

Échantillon = Résultat de la requête. Choisir();

// Obtention d'une table de valeurs
RequestResult = Demande. Courir();
Tableau = Résultat de la requête. Décharger();

4. Vous pouvez contourner la sélection des résultats de la requête à l'aide d'une boucle :

Au revoir Boucle Sample.Next()
Rapport (Sélection.Cours);
Fin du cycle ;

Un exemple complet de travail avec une requête pourrait ressembler à ceci :

// Étape 1. Création d'une requête et définition du texte de la requête
Demande = Nouvelle demande ;
Demande . Texte =
"CHOISIR
| Taux de change.Période,
| Taux de change. Devise,
| Taux de change.Taux
|DE
| Registre d'informations.Taux de change AS Taux de change
|OÙ
| Taux de change.Devise = &Devise";

// Étape 2. Définition des paramètres
Demande . SetParameter("Devise" , Devise Sélectionnée);

// Étape 3. Exécuter la requête et obtenir l'échantillon
RequestResult = Demande. Courir();
Échantillon = Résultat de la requête. Choisir();

// Parcours de la sélection
Au revoir Boucle Sample.Next()
Rapport (Sélection.Cours);
Fin du cycle ;

Composition du texte de la demande

Le texte de la demande se compose de plusieurs sections :

  1. Description de la demande— liste des champs sélectionnables et des sources de données ;
  2. Fusion de requêtes— les expressions « UNITE » et « UNITE ALL » ;
  3. Organisation des résultats— l'expression « COMMANDER PAR… » ;
  4. Commande automatique— l'expression « COMMANDE AUTOMATIQUE » ;
  5. Description des résultats- l'expression « RÉSULTATS… PAR… ».

Seule la première section est obligatoire.

Tables temporaires et requêtes par lots

Le langage de requête 1C prend en charge l'utilisation tables temporaires— les tables obtenues à la suite d'une requête et stockées de manière temporaire.

Vous pouvez souvent rencontrer une situation dans laquelle vous devez utiliser non pas les tables de base de données comme source d'une requête, mais le résultat de l'exécution d'une autre requête. Ce problème peut être résolu à l'aide de requêtes imbriquées ou tables temporaires. L'utilisation de tables temporaires permet de simplifier le texte d'une requête complexe en le divisant en ses composants, et également, dans certains cas, d'accélérer l'exécution de la requête et de réduire le nombre de verrous. Pour travailler avec des tables temporaires, utilisez l'objet Gestionnaire d'horaires. Une table temporaire est créée à l'aide du mot-clé PLACE suivi du nom de la table temporaire.

ManagerVT = Nouveau TemporaryTablesManager ;
Demande = Nouvelle demande ;
Demande . ManagerTemporaryTables = ManagerVT ;

Demande . Texte =
"CHOISIR
| Devises.Code,
| Devises.Nom
|Place en devises
|DE
| Annuaire.Devises AS Devises";

RequestResult = Demande. Exécuter();

Pour utiliser la table temporaire VTVcurrency dans d'autres requêtes, vous devez attribuer un gestionnaire de table temporaire commun à ces requêtes : VT Manager.

Demande par lots est une requête qui contient plusieurs requêtes séparées par le caractère « ; ». Lors de l'exécution d'une requête par lots, toutes les requêtes qui y sont incluses sont exécutées séquentiellement et les résultats de toutes les tables temporaires sont disponibles pour toutes les requêtes suivantes. Il n'est pas nécessaire d'attribuer explicitement un gestionnaire de tables temporaire aux requêtes par lots. Si aucun gestionnaire de tables temporaires n'est affecté, toutes les tables temporaires seront supprimées immédiatement après l'exécution de la requête.

Pour les requêtes par lots, la méthode ExecuteBatch() est disponible, qui exécute toutes les requêtes et renvoie un tableau de résultats. Les tables temporaires dans une requête batch seront représentées par une table avec une ligne et une colonne « Count », qui stocke le nombre d'enregistrements. Pour déboguer les requêtes batch, vous pouvez utiliser la méthode Exécuter un lot AVEC DES DONNÉES INTERMÉDIAIRES() : Il renvoie le contenu réel des tables temporaires, pas le nombre d'enregistrements.

// Exemple de travail avec une requête batch
Demande = Nouvelle demande ;
Demande . Texte =
"CHOISIR
| Devises.Nom
|DE
| Annuaire.Devises AS Devises
|;
|SÉLECTIONNER
| Nomenclature.Nom
|DE
| Annuaire. Nomenclature AS Nomenclature";

Résultat du lot = Demande. ExécuterBatch();

TZDevises =PacketResult[ 0 ]. Décharger();
TZNomenclature = Résultat du package[ 1 ]. Décharger();

// Un exemple d'utilisation de tables temporaires dans une requête batch
Demande = Nouvelle demande ;
Demande . Texte =
"CHOISIR
| Produits.Lien COMMENT FAIRE Produit
|PLACE VTProduits
|DE
| Annuaire.Nomenclature COMMENT Produits
|OÙ
| Produits.Fabricant = &Fabricant
|;
|SÉLECTIONNER
| VTTProducts.Produit,
| Ecole professionnelle.Quantité,
| Ecole professionnelle.Prix,
| Ecole professionnelle.Link AS DocumentReceipts
|DE
| Produits VT AS Produits VT
| Document de connexion à gauche Réception de biens et de services Marchandises AS PTU
| Logiciel VTVProducts.Product = PTU.Nomenclature"
;

Demande . DéfinirParamètre( "Fabricant", Fabricant);

RequestResult = Demande. Courir();
Échantillon = Résultat de la requête. Choisir();

Au revoir Boucle Sample.Next()

Fin du cycle ;

Tables virtuelles

Tables virtuelles- ce sont des tables qui ne sont pas stockées dans la base de données, mais sont générées par la plateforme. À la base, il s’agit de requêtes imbriquées sur une ou plusieurs tables physiques exécutées par la plateforme. Les tables virtuelles reçoivent des informations uniquement à partir de registres et sont principalement destinées à résoudre des problèmes hautement spécialisés.

Il existe les tables virtuelles suivantes (les paramètres possibles sont indiqués entre parenthèses) :

  • Pour les registres d’information :
    • TranchePremier(<Период>, <Условие>) — les enregistrements les plus anciens pour la date spécifiée ;
    • TrancheDernier(<Период>, <Условие>) — les derniers enregistrements pour la date spécifiée ;
  • Pour les registres d’accumulation :
    • Les restes(<Период>, <Условие>) — les soldes à la date spécifiée ;
    • Révolutions(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Opérations de période ;
    • Restes et chiffre d'affaires (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — les soldes et le chiffre d'affaires de la période;
  • Pour les registres comptables :
    • Les restes(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — soldes à la date spécifiée par compte, dimensions et sous-comptes ;
    • Révolutions(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — chiffre d'affaires de la période dans le cadre des comptes, mesures, corr. comptes, sous-conto, cor. sous-conto ;
    • Restes et chiffre d'affaires (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — les soldes et le chiffre d'affaires dans le cadre des comptes, mesures et sous-comptes ;
    • Chiffre d'affairesDtKt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — chiffre d'affaires de la période par compte Dt, compte Kt, Sous-conto Dt, Sous-conto Kt;
    • MouvementsSubconto(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — mouvements avec valeurs de sous-conto ;
  • Pour les registres de calcul :
    • Base(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — données de base du registre de calcul ;
    • DonnéesGraphiques(<Условие>)—données graphiques ;
    • ActualActionPeriod(<Условие>) est la durée de validité réelle.

Lorsque vous travaillez avec des tables virtuelles, vous devez appliquer des sélections dans les paramètres des tables virtuelles, et non dans la condition WHERE. Le temps d'exécution de la requête en dépend grandement.

Constructeur de requête

Pour accélérer la saisie des textes de requêtes, la plateforme dispose d'outils particuliers : Constructeur de requête Et Constructeur de requête avec traitement des résultats. Pour appeler des constructeurs, vous devez cliquer avec le bouton droit et sélectionner l'élément requis :

Les constructeurs peuvent également être appelés depuis le menu principal Texte.

À l'aide du générateur de requêtes, le programmeur peut construire de manière interactive le texte de la requête. Pour ce faire, sélectionnez les tableaux et champs nécessaires avec la souris, établissez des relations, des regroupements, des totaux, etc. Cette approche permet de gagner du temps et d'éliminer les erreurs possibles. Grâce à son travail, le constructeur de requête génère le texte de la requête.

Le constructeur de requête avec traitement des résultats, en plus de générer le texte de la requête, crée un fragment de code prêt à l'emploi pour recevoir et traiter les données.

Objet RequestSchema

La plateforme vous permet de créer et de modifier par programme le texte de la demande à l'aide de l'objet Schéma de demande. Un objet a une seule propriété Lot de demandes, dans lequel l'objet stocke les propriétés de toutes les requêtes en cours d'édition. L'objet RequestSchema prend en charge les méthodes suivantes :

  • DéfinirTexteRequête(< Текст>) — remplit la propriété Query Packet en fonction du texte de la demande soumise ;
  • ObtenirTexteRequête() - renvoie le texte de la demande généré en fonction de la propriété Request Package ;
  • FindParameters() - renvoie les paramètres de la requête.

Regardons un exemple de travail avec l'objet RequestSchema. Pour générer par programme le texte de la demande

TRIER PAR
Devises.Code

Le code de langue intégré pourrait ressembler à ceci :

RequestScheme = Nouveau RequestScheme ;
Forfait 1 = Schéma de demande. RequêteBatch[ 0 ];
Opérateur1 = Paquet1. Opérateurs[ 0 ];
// ajout de la source
RegisterTable = Opérateur1. Sources. Ajouter( "Répertoire.Devises", "Devises" );
// ajout de champs
Lien sur le terrain = Opérateur1. Champs sélectionnables. Ajouter("Devises.Link" , 0 );
Code de champ = Opérateur1. Champs sélectionnables. Add("Devises.Code", 1);
// spécification des alias de champ
Forfait 1 . Colonnes[ 0 ]. Alias ​​​​= "Devise" ;
Forfait 1 . Colonnes[ 1 ]. Alias ​​​​= "Code" ;
// ajout d'une condition
Opérateur1 . Sélection. Ajouter( "PAS de suppression de drapeau");
// ajoute une commande
Forfait 1 . Commande. Ajouter (Code de champ);
RequestText = RequestScheme. ObtenirTexteRequête();

Pour générer et exécuter des requêtes sur les tables de base de données de la plate-forme 1C, un objet de langage de programmation spécial est utilisé Demande. Cet objet est créé en appelant la construction Nouvelle requête. La requête est pratique à utiliser lorsque vous devez obtenir un échantillon de données complexe, regroupé et trié si nécessaire. Un exemple classique d'utilisation d'une requête consiste à obtenir un résumé de l'état du registre d'accumulation à un moment donné. De plus, le mécanisme de requête facilite l’obtention d’informations sur différentes périodes.

Le corps de la requête est l'instruction selon laquelle la requête doit être exécutée. Le corps de la requête décrit :

  • tables d'infobase utilisées comme sources de données de requête ;
  • les champs de table qui doivent être traités dans la requête ;
  • règles de regroupement ;
  • trier les résultats ;
  • etc.
L'instruction est compilée dans un langage spécial - le langage de requête et se compose de parties distinctes - sections, phrases, mots-clés, fonctions, opérateurs arithmétiques et logiques, commentaires, constantes et paramètres.

Le langage de requête de la plateforme 1C est très similaire à la syntaxe des autres langages SQL, mais il existe des différences. Les principaux avantages du langage de requête intégré sont : les champs de déréférencement, la présence de tables virtuelles, le travail pratique avec les résultats, les champs non typés dans les requêtes.

  • énumérer les valeurs ;
  • données prédéfinies :
  • livres de référence;
  • plans pour les types de caractéristiques ;
  • plans comptables;
  • plans pour les types de calculs;
  • liens vides ;
  • valeurs des points de routage des processus métier.
De plus, le texte de la demande peut contenir les valeurs des énumérations système qui peuvent être attribuées aux champs des tables de la base de données : Type de mouvement d'accumulation, Type de compte et Type de mouvement comptable. Les requêtes accèdent aux données de configuration prédéfinies et aux valeurs d'énumération du système à l'aide d'un littéral de type de fonction SIGNIFICATION. Ce littéral permet d'améliorer la lisibilité de la requête et de réduire le nombre de paramètres de requête.

Exemple d'utilisation d'un littéral SIGNIFICATION:
OÙ Ville = VALEUR(Répertoire.Villes.Moscou)
OÙ Ville = VALEUR (Directory.Cities.EmptyLink)
OÙProductType = VALEUR (Enumeration.ProductTypes.Service)
OÙMovementType = VALEUR(MovementTypeAccumulation.Incoming)
OÙ RoutePoint = VALEUR (BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Utilisation des instructions COMMANDE AUTOMATIQUE La requête peut prendre beaucoup de temps, donc si le tri n'est pas nécessaire, il est préférable de ne pas l'utiliser du tout. Dans la plupart des cas, il est préférable d'utiliser le tri des instructions TRIER PAR.

La commande automatique fonctionne selon les principes suivants :

  • Si la clause ORDER BY a été spécifiée dans la requête, alors chaque lien vers la table trouvée dans cette clause sera remplacé par les champs selon lesquels la table est triée par défaut (pour les ouvrages de référence il s'agit du code ou du nom, pour les documents – le date du document). Si le champ à trier fait référence à un répertoire hiérarchique, alors le tri hiérarchique par ce répertoire sera appliqué.
  • Si la requête ne contient pas la clause ORDER BY, mais qu'il existe une clause TOTAL, alors le résultat de la requête sera ordonné par les champs présents dans la clause TOTAL après le mot-clé BY, dans la même séquence et, si les totaux ont été calculés par champs de référence, puis par le tri des champs par défaut des tables référencées.
  • Si la requête ne contient pas les clauses ORDER BY et TOTAL, mais qu'il existe une clause GROUP BY, alors le résultat de la requête sera ordonné par les champs présents dans la clause dans le même ordre et, si le regroupement a été effectué par champs de référence , puis trions par défaut les tables de champs référencées.
  • Si la requête ne contient pas de clauses ORDER BY, TOTAL ou GROUP BY, le résultat sera classé selon les champs de tri par défaut des tables dans lesquelles les données sont sélectionnées, dans l'ordre dans lequel elles apparaissent dans la requête.

Si la requête contient une clause TOTAL, chaque niveau total est classé séparément.

3) Pour éviter de répéter une requête sur la base de données lors de l'affichage du résultat de la requête à l'utilisateur (par exemple, construire une requête ou afficher le résultat de la requête à l'aide d'un tableur), il est utile d'utiliser l'instruction INTRODUCTIONLIENS, ce qui permet d'obtenir une représentation d'une valeur de référence.

Il est également possible d'utiliser les instructions PERFORMANCE- conçu pour obtenir une représentation sous forme de chaîne d'une valeur d'un type arbitraire. La différence entre ces instructions est que dans le premier cas, si les instructions passent un lien, le résultat sera une chaîne. Dans les autres cas, le résultat sera la valeur du paramètre passé. Dans le deuxième cas, le résultat de l’instruction sera toujours une chaîne !

4) Si la demande contient un champ de type composite, alors pour ces champs, il devient nécessaire de convertir les valeurs du champ en un type spécifique à l'aide d'une instruction EXPRIMER, ce qui vous permettra de supprimer les tables inutiles de la jointure gauche avec un champ d'un type de données complexe et d'accélérer l'exécution des requêtes.

Exemple:
Il existe un registre pour l'accumulation des marchandises restantes, dans lequel le champ Registraire a un type composite. Dans la demande, la date et le numéro du document de réception des marchandises sont sélectionnés, tandis que lors de l'accès aux détails du document via le champ du registraire, de nombreuses connexions gauches de la table du registre d'accumulation avec les tables des documents du registraire ne se produisent pas.

CHOISIR
EXPRESS (Marchandises restantes. Document AS du registraire. Réception des marchandises). Numéro AS Numéro de réception,
EXPRESS (Marchandises restantes. Document AS du registraire. Réception des marchandises). Date AS Date de réception
DEPUIS
Registre des accumulations. Marchandises restantes AS Marchandises restantes

Si une conversion de type n'est pas considérée comme réalisable, alors le résultat de la conversion de type sera NULL.

5) N'oubliez pas les instructions AUTORISÉ, ce qui signifie que la requête sélectionnera uniquement les enregistrements sur lesquels l'utilisateur actuel a des droits. Si ce mot n'est pas spécifié, alors si la requête sélectionne des enregistrements pour lesquels l'utilisateur n'a pas de droits, la requête échouera.

6) Si la requête utilise une jointure et que certaines parties de la jointure contiennent des tables imbriquées (un document avec une partie tabulaire) et d'autres non, il devient nécessaire de compléter la liste de sélection avec des champs - des tables imbriquées vides. Cela se fait à l'aide d'un mot-clé TABLE VIDE, après quoi les alias des champs qui composeront la table imbriquée sont indiqués entre parenthèses.

Exemple:
// Sélectionnez les champs Nombre et Composition
// depuis la table virtuelle Document.Expenditure
SELECT Link.Number, VIDE TABLE.(N°, Article, Quantité) AS Composition
DE Document. Facture de dépenses
COMBINEZ TOUT
SELECT Link.Number, Contents.(LineNumber, Produit, Quantité)
DE Document.Facture Document.Facture.Composition.*
7) Pour éviter que des lignes en double n'apparaissent dans le résultat de la requête, vous devez utiliser l'instruction DIVERS, parce que c'est plus visuel et compréhensible, et les instructions PAR GROUPE utilisé pour le regroupement à l’aide de fonctions d’agrégation. Ksati, lors de l'utilisation de fonctions d'agrégation, une suggestion PAR GROUPE peut ne pas être spécifié du tout, mais tous les résultats de la requête seront regroupés sur une seule ligne.

Exemple:
// Il faut savoir quelles contreparties en général
// les marchandises ont été expédiées pour la période.
Sélectionnez Divers
Document.Facture.Contrepartie

8) Consignes PAR GROUPE permet d'accéder aux champs de niveau supérieur, sans regrouper les résultats par ces champs, si des fonctions d'agrégation sont appliquées aux champs d'une table imbriquée. Bien que l'aide 1C indique que lors du regroupement des résultats d'une requête, des fonctions d'agrégation doivent être spécifiées dans la liste des champs de sélection, et en plus des fonctions d'agrégation dans la liste des champs de sélection, il est permis d'indiquer uniquement les champs par lesquels le regroupement est effectué. .

Exemple:
CHOISIR
Réception de biens et services. Biens. (SOMME (Quantité), Nomenclature),
Réception de biens et de services. Lien,
Réception des biens et services.
DEPUIS
Document Réception des biens et services COMMENT Réception des biens et services
PAR GROUPE
Réception de biens et de services. Biens. (Nomenclature)

9) Consignes EST NUL est destiné à remplacer la valeur NULL par une autre valeur, mais n'oubliez pas que le deuxième paramètre sera converti au type du premier si le type du premier paramètre est une chaîne ou un nombre.

10) Lors de l'accès à la table principale, vous pouvez accéder de manière conditionnelle aux données de la table subordonnée. Cette fonctionnalité est appelée déréférencement des champs d'une table subordonnée.

Exemple (recherche de documents contenant un produit spécifique dans la section tabulaire) :
CHOISIR
Entrée.Lien
DEPUIS
Document.Admission Où Entry.Products.Nomenclature = &Nomenclature.

L'avantage de cette requête par rapport à une requête sur la table subordonnée Receipt.Goods est que s'il y a des doublons dans les documents, le résultat de la requête renverra uniquement des documents uniques sans utiliser le mot-clé DIVERS.

11) Option opérateur intéressante DANS- il s'agit d'une vérification de l'inclusion d'un ensemble ordonné dans un ensemble de tels ensembles (Field1, Field2, ..., FieldN) IN (Field1, Field2, ..., FieldN).

Exemple:
CHOISIR
Contreparties.Link

(Contreparties.Lien, Produits.Lien) B
(SELECT Ventes.Client, Ventes.Produit
DE RegisterAccumulation.Sales AS Sales)
DEPUIS
Annuaire.Contreparties,
Annuaire.Produits

12) Dans la mesure du possible, utilisez tables virtuelles demandes. Lors de la création d'une requête, le système fournit un certain nombre de tables virtuelles comme sources de données. Il s'agit de tables qui sont également le résultat d'une requête que le système génère au moment de l'exécution de la section de code correspondante.

Le développeur peut obtenir indépendamment les mêmes données que celles que le système lui fournit sous forme de tables virtuelles, mais l'algorithme d'obtention de ces données ne sera pas optimisé car :

  • Toutes les tables virtuelles sont paramétrées, c'est-à-dire que le développeur a la possibilité de définir certains paramètres que le système utilisera lors de la génération d'une demande de création d'une table virtuelle. En fonction des paramètres de la table virtuelle spécifiés par le développeur, le système peut générer DIFFÉRENTES requêtes pour obtenir la même table virtuelle, et elles seront optimisées en termes de paramètres transmis.
  • Il n'est pas toujours possible pour un développeur d'accéder aux données auxquelles le système a accès.
13) En mode de fonctionnement client-serveur, la fonction SOUS-CHAÎNE() est implémenté à l'aide de la fonction SUBSTRING() de l'instruction SQL correspondante transmise au serveur de base de données SQL Server, qui calcule le type du résultat de la fonction SUBSTRING() à l'aide de règles complexes en fonction du type et des valeurs de ses paramètres, comme ainsi que selon le contexte dans lequel il est utilisé. Dans la plupart des cas, ces règles n'ont aucun effet sur l'exécution des requêtes, mais il arrive parfois que la longueur maximale des lignes de résultats calculée par SQL Server soit importante pour l'exécution des requêtes. Il est important de garder à l'esprit que dans certains contextes lors de l'utilisation de la fonction SUBSTRING(), la longueur maximale de son résultat peut être égale à la longueur maximale d'une chaîne de longueur limitée, qui dans SQL Server est de 4 000 caractères. Cela peut provoquer un crash inattendu de la requête :
Fournisseur Microsoft OLE DB pour SQL Server : Avertissement : Le processeur de requêtes n'a pas pu produire un plan de requête à partir de l'optimiseur car la longueur totale de toutes les colonnes de la clause GROUP BY ou ORDER BY dépasse 8 000 octets.
HRESULT=80040E14, SQLSTATE=42000, natif=8618
Pour éviter cette erreur, il n'est pas recommandé d'utiliser la fonction SUBSTRING() pour convertir des chaînes de longueur illimitée en chaînes de longueur limitée. Au lieu de cela, il est préférable d'utiliser l'opérateur de conversion EXPRESS().

14) À utiliser avec prudence OU dans la construction WHERE, car l’utilisation d’une condition OR peut « pondérer » considérablement la requête. Le problème peut être résolu en utilisant la conception UNITE EVERYTHING.

Exemple:
CHOISIR

DEPUIS


_Entrepreneurs de démonstration.Link = &Link1

COMBINEZ TOUT

CHOISIR
_Entrepreneurs de démonstration.NameFull
DEPUIS
Annuaire._Contreparties de démonstration COMMENT FAIRE _Contreparties de démonstration

_Entrepreneurs de démonstration.Link = &Link2

15) État PAS DEDANS dans la construction WHERE augmente le temps d'exécution de la requête, car il s'agit d'une sorte de NOT (OR1 OR2 ... ORn), donc pour les grandes tables, essayez d'utiliser un LEFT JOIN avec la condition IS NULL.

Exemple:
CHOISIR
_Démo Entrepreneurs.Link
DEPUIS
Annuaire._Contreparties de démonstration COMMENT FAIRE _Contreparties de démonstration
Document de connexion à gauche._Commande de démonstration de l'acheteur COMMENT FAIRE _Commande de démonstration de l'acheteur
Logiciel _Démo Contreparties. Lien = _Démo Commande de l'Acheteur. Contrepartie

_Commande de démonstration de l'acheteur. La contrepartie est nulle

15) Lors de l'utilisation Tableaux temporaires Vous devez indexer la condition et joindre les champs dans ces tables, MAIS, lors de l'utilisation d'index, la requête peut être encore plus lente. Par conséquent, il est nécessaire d'analyser chaque requête avec et sans index, de mesurer la vitesse d'exécution de la requête et de prendre une décision finale.
Si vous placez des données dans une table temporaire initialement indexée par certains champs, alors la table temporaire n'aura plus d'index sur ces champs.

16) Si vous n'utilisez pas Gestionnaire de tables temporaires, alors il n'est pas nécessaire de supprimer explicitement la table temporaire, elle sera supprimée une fois la requête par lots terminée, sinon vous devez supprimer la table temporaire de l'une des manières suivantes : en utilisant la commande DESTROY dans la requête, en appelant TemporaryTableManager. Méthode Close().

Basic, ce qui facilite l'apprentissage des développeurs novices. Cependant, il ne s’agit d’un analogue direct d’aucune des langues répertoriées.

Voici quelques-unes des fonctionnalités les plus importantes du langage intégré :

  • pré-compilation; avant l'exécution, les modules contenant du texte dans le langage intégré sont convertis en code interne ;
  • mise en cache des modules compilés en mémoire ;
  • typage doux - le type d'une variable est déterminé par le type de la valeur qu'elle contient et peut changer pendant le fonctionnement ;
  • manque de description logicielle des objets de configuration ; le développeur peut utiliser soit des objets intégrés à la plateforme, soit des objets créés par le système à la suite de la conception visuelle de la solution applicative.

Langage intégré orienté événement. Le but du langage intégré au système 1C:Enterprise est déterminé par l'idéologie de création de solutions d'application. Les solutions d'application dans 1C:Enterprise 8.0 ne sont pas entièrement codées. La majeure partie de la solution d'application est créée par le développeur via une conception visuelle - création de nouveaux objets de configuration, définition de leurs propriétés, formulaires de présentation, relations, etc. Le langage intégré est utilisé uniquement pour déterminer le comportement des objets de solution d'application qui diffère de celui standard, et de créer leurs propres algorithmes de traitement des données.

Pour cette raison, les modules contenant du texte dans le langage intégré sont utilisés par le système dans des situations spécifiques, préalablement connues, pouvant survenir lors du fonctionnement de la solution applicative. De telles situations sont appelées événements. Les événements peuvent être associés au fonctionnement des objets de la solution applicative ou à la solution applicative elle-même, en tant que telle.

Par exemple, un certain nombre d'événements sont associés au fonctionnement de l'objet solution d'application Annuaire, parmi lesquels l'événement BeforeWrite. Cet événement se produit juste avant que les données de l'élément de répertoire ne soient écrites dans la base de données. Un développeur, à l'aide d'un langage intégré, peut décrire un algorithme qui, par exemple, vérifiera l'exactitude des données saisies par l'utilisateur. En plaçant cet algorithme dans le module approprié, le développeur s'assurera que chaque fois que l'utilisateur enregistre un élément du répertoire, le système exécutera l'algorithme créé par le développeur et vérifiera si l'utilisateur a oublié de remplir les détails du répertoire requis.

Ainsi, nous pouvons dire que le langage intégré est un langage de script pour programmer la logique métier, et que l'utilisation de modules dans le langage intégré dépend des événements, c'est-à-dire les modules sont exécutés lorsque certains événements surviennent lors du fonctionnement de la solution applicative.

Types de données prédéfinis

La plateforme 1C:Enterprise 8.0 permet au développeur d'utiliser différents types de données.

Il existe un grand nombre de types de données qui sont définis au niveau de la plateforme elle-même. Par exemple ceci types de données primitifs, comme une chaîne, un nombre, une date, etc.


Description types de données primitifs:

  • NUL- valeur manquante. Utilisé, par exemple, dans les requêtes.
  • Indéfini- valeur vide et indéfinie. Il est utilisé, par exemple, lors de l'évaluation du passage de paramètres si ce paramètre est omis lors de l'appel d'une procédure ou d'une fonction. Les détails qui ont un type de données composite sont du type « Non défini » par défaut.
  • Booléen- contient deux valeurs : True ou False. Utilisé par exemple dans les expressions logiques - une expression logique est de type "Booléen".
  • date- contient la date et l'heure. La valeur par défaut est 01/01/01 00:00:00, date de début de notre ère. Le temps est mesuré à partir du début de la journée. Une expression qui a un type littéral « date » s'écrit comme suit : « 00010101000000 ». On écrit d’abord l’année, puis le mois, puis la date et enfin l’heure. L'entrée suivante est possible : "20041031". L'heure par défaut est le début de la journée.
  • Doubler- peut être de longueur variable, fixe ou illimitée. En général, il est recommandé d’utiliser des chaînes de longueur variable.
  • Nombre- la profondeur de bits du nombre a été augmentée à 38 bits.
  • Taper- sert à déterminer les types de valeurs. Utilisé, par exemple, pour comparer les types de données. Il n'a pas de littéral et est renvoyé par les fonctions Type(<Имя типа>) ou TypeValue(<Значение>).

Il y a aussi d'autres types de données complexes. Par exemple, la plateforme prend en charge un certain nombre de types qui sont des collections universelles de valeurs : tableau, structure, liste de valeurs, arbre de valeurs, etc.


Types de données "Collections universelles" - une liste (ensemble) d'objets de données de tout type, dont les valeurs sont accessibles par force brute ou par un index (clé) spécifié. La numérotation des éléments de collection commence à 0. Tous les types de données spécifiés sont créés uniquement par programme.

Tableau. Représente une collection numérotée de valeurs d'un type arbitraire. Un élément de tableau est accessible par son index. Les éléments d'un tableau peuvent être notamment d'autres tableaux. Cela vous permet de créer des tableaux multidimensionnels.

Structure. Représente une collection nommée composée de paires clé-valeur. La clé ne peut être qu'une chaîne, la valeur peut être de type arbitraire. Un élément de structure est accessible par la valeur de sa clé, c'est-à-dire de nom. Généralement utilisé pour stocker un petit nombre de valeurs, chacune avec un nom unique.

Correspondance. Tout comme Structure, il s’agit d’une collection de paires Clé-Valeur. Cependant, contrairement à une structure, une clé peut être de presque n'importe quel type.

Liste de valeurs. Généralement utilisé pour résoudre des problèmes d’interface. Permet de créer des ensembles dynamiques de valeurs et de les manipuler (ajouter, modifier, supprimer des éléments, trier). Il peut contenir des valeurs de n'importe quel type ; de plus, les types de valeurs stockées dans une liste peuvent être différents.

Tableau des valeurs. Une table de valeurs vous permet de créer et de manipuler des ensembles dynamiques de valeurs. Il peut être rempli de valeurs de n'importe quel type, et dans une table, les types de valeurs stockées peuvent être différents.

Arbre de valeurs. Un arbre de valeurs est un ensemble de valeurs généré dynamiquement de tout type, similaire à un tableau de valeurs. Contrairement à une table de valeurs, les lignes d'un arbre de valeurs peuvent former des structures hiérarchiques : chaque ligne de l'arbre peut avoir un ensemble de lignes subordonnées, chacune des lignes subordonnées peut à son tour également avoir un ensemble de lignes subordonnées, et ainsi de suite. Dans ce cas, la recherche de valeurs, le tri et l'obtention des résultats peuvent être effectués soit en fonction du niveau hiérarchique actuel, soit en incluant tous les niveaux subordonnés.

COMSafeArray. Représente un wrapper d'objet sur un tableau SAFEARRAY multidimensionnel de

Procédure SelectFromFileClick(Element) // Sélection d'un fichier avec visualisationFileSelectionDialog = NewFileSelectionDialog(FileSelectionDialogMode.Open); FileSelectionDialog.Directory = ""; FileSelectDialog.Preview = Vrai ; FileSelectionDialog.FilterIndex = 0 ; Si FileSelectDialog.Select() Then File = New File(FileSelectDialog.FullFileName); Image = NewValueStorage(NewImage(FileSelectionDialog.FullFileName)); Afficher l'image(); fin si; Fin de la procédure

Enfin une grosse activité avec beaucoup de texte !

Quel est le but de l’objet de requête de langage intégré ?

Requête – utilisée pour obtenir des informations stockées dans les champs de la base de données sous la forme d'une sélection formée selon des règles spécifiées. Précision importante : dans la demande nous travaillons avec des liens. Autrement dit, c’est comme s’ils prenaient une photo d’une vitrine de magasin et vous la donnaient. À partir de cette photo, vous pouvez découvrir quelle est la gamme de produits, compter combien, par exemple, d'oranges se trouvent dans le coin, etc. Mais si vous prenez un marqueur et dessinez une image d'un pénis en caoutchouc posé sur le comptoir, vous devez vous rappeler que cette action ne fera pas apparaître le pénis en caoutchouc en vente, vous devez donc taper du pied dans le magasin et mettre ceci article ménager important sur le comptoir. Dans le cas de demandes, nous devons obtenir un objet par référence.

A quoi sert un système de composition de données ?

Pour créer des rapports personnalisés dans le système 1C:Enterprise et se compose de plusieurs parties ; En fait, à mon avis, c'est une chose très gênante. Maeby, c'est une question d'habitude.

Quel est l’objectif d’un schéma de composition de données ?

Pour obtenir les données sources pour la mise en page du rapport ;

Le schéma de composition des données est un élément qui décrit le texte de la demande, les ensembles de données, les connexions entre eux, les champs disponibles, les paramètres d'obtention des données, les paramètres de mise en page initiaux ;

A quoi servent les paramètres de composition des données ?

Les paramètres de présentation des données fonctionnent conjointement avec le schéma de présentation des données pour façonner la présentation ;

Quelle est la différence entre les tables réelles et virtuelles ?

Les tables réelles contiennent des données de table qui sont (soudainement) réellement stockées dans la base de données ;

Virtuel – formé à partir des données de plusieurs tables de base de données ; Pour les tables virtuelles, vous pouvez définir un certain nombre de paramètres qui déterminent les données incluses dans les tables virtuelles. L'ensemble de ces paramètres peut être différent pour différentes tables virtuelles ;

De quelles parties se compose le texte de la demande et lesquelles sont obligatoires ?

Description de la demande (obligatoire) – définit les sources de données, les champs de sélection et les regroupements ;

Fusion de requêtes – comment les résultats de l'exécution de plusieurs requêtes seront combinés ;

Ordonner les résultats – une condition pour ordonner les lignes de résultats de requête ;

Ordre automatique – mode de classement automatique des lignes à la suite d'une requête ;

Description des résultats : quels résultats doivent être calculés dans la demande et comment regrouper les résultats ;

Quelles sont les constructions syntaxiques de base d’un langage de requête ?

Choisir<что>DEPUIS<откуда>

COMMANDE<признак>

Quelle est la source des données de la requête ?

La source de données de la requête est une table (réelle ou virtuelle) ;

Que sont les alias dans une source de requête ?

Possibilité d'attribuer un nom aléatoire au champ de sélection. Par exemple, si nous ne sélectionnons pas simplement, mais utilisons isnull, ou multiplions ce champ directement dans la requête, alors à la fin il sera nommé « field1 ». Et donc nous l'appellerons immédiatement, comme cela nous conviendra ;

Que sont les paramètres de la requête ?

Le paramètre est noté & et est utilisé pour transférer certaines données à la requête (par exemple, une date pour un registre) ;

Que sont les paramètres d’une table virtuelle ?

Selon le type de table virtuelle, vous pouvez utiliser les paramètres de table virtuelle pour filtrer les données. Par exemple, dans les registres d'accumulation, les paramètres de la table virtuelle seront Début de Période et Fin de Période ;

Qu'est-ce qu'une jointure gauche ?

Deux tables. Condition. Jointure gauche – TOUTES les données de la première table et seules celles qui satisfont à la condition de la deuxième table seront incluses ;

Comment utiliser le générateur de requêtes ?

Facilement. Ouvrez soit dans le schéma de composition des données, soit cliquez avec le bouton droit sur le constructeur de requête dans n'importe quelle procédure ;

Comment sélectionner des données sur une certaine période pour un rapport ?

Dans le schéma de composition des données - paramètres - dans la fenêtre inférieure du tableau - paramètres.

Comment organiser les données dans un rapport ?

Dans le concepteur de requêtes, sélectionnez l'onglet « Commander », sélectionnez le champ souhaité et la méthode de tri ;

Comment utiliser les données de plusieurs tables dans un rapport ?

Combinez-les à l’aide d’une requête ;

Comment utiliser le regroupement dans la structure du rapport ?

Dans le schéma de composition des données, onglet Paramètres, faites un clic droit sur « Rapport » - sélectionnez un regroupement pour afficher les informations sous la forme d'un rapport linéaire.

Comment obtenir la dernière valeur du registre d'informations ?

Dans les paramètres de la table virtuelle, définissez la période et sélectionnez la table virtuelle "Nom du registre d'informations. Tranche de dernière" ;

Comment afficher des données hiérarchiques dans un rapport ?

Schéma de composition des données – paramètres – nouveau regroupement – ​​type – « hiérarchie »

Comment gérer l'affichage des totaux de regroupement et des totaux globaux ?

Système de composition des données – paramètres – dans la fenêtre inférieure « Autres paramètres » - « Emplacement des totaux » ; « Emplacement des champs de regroupement », « Emplacement vertical des totaux généraux »

Comment créer un rapport contenant un graphique ?

Diagramme de composition des données – Paramètres – Rapport – Clic droit – Nouveau graphique

Comment utiliser les paramètres dans le schéma de composition de données ?

Pour travailler avec des requêtes, un objet langage intégré est utilisé Demande. Il vous permet de recevoir des informations stockées dans les champs de la base de données sous la forme d'un échantillon formé selon des règles spécifiées.

La requête reçoit les informations initiales d'un ensemble de tables. Ces tables représentent les données de tables de bases de données réelles sous une forme facile à analyser. Ils peuvent être divisés en deux grands groupes : réel Et virtuel.

Les tables réelles, à leur tour, peuvent être objets (référence) ou non-objet (non-référence), Fig. 97.

Riz. 97. Tables de requête

Une caractéristique distinctive des tables réelles est qu'elles contiennent des données provenant de n'importe quelle table réelle stockée dans une base de données.. Par exemple, une table réelle est Directory.Clients, correspondant au répertoire Clients, ou la table Accumulation Register.Material Remaining, correspondant au registre d'accumulation de Material Remaining.

Les tables virtuelles sont principalement constituées de données provenant de plusieurs tables de base de données. Par exemple, la table virtuelle est Accumulation Register.Material Remainings.RemainingsAndTurnover, formée de plusieurs tables du registre d'accumulation Material Remaining.

Parfois, des tables virtuelles peuvent être formées à partir d'une table réelle (par exemple, la table virtuelle Prices.SliceLast est formée sur la base de la table du registre d'informations Prices). Cependant, ce que toutes les tables virtuelles ont en commun, c'est qu'elles peuvent recevoir un certain nombre de paramètres qui déterminent quelles données seront incluses dans ces tables virtuelles. L'ensemble de ces paramètres peut être différent pour différentes tables virtuelles et est déterminé par les données stockées dans les tables de la base de données source.

Les tables réelles sont divisées en tables d'objets (référence) et de non-objets (non-référence).

DANS tables d'objets (de référence) des informations sur les types de données de référence sont présentées (répertoires, documents, plans de types caractéristiques, etc.). Et en non-objet (pas de référence)– tous les autres types de données (constantes, registres, etc.).

Particularité tables d'objets (de référence) est qu'ils incluent un champ Lien contenant un lien vers l'enregistrement en cours. De plus, pour de tels tableaux, il est possible obtenir une représentation personnalisée d'un objet. Ces tables peuvent être hiérarchiques et les champs de ces tables peuvent contenir des tables imbriquées (parties de table).

L'algorithme par lequel les données seront sélectionnées dans les tables sources de la requête est décrit dans le texte de la requête dans un langage spécial - langage de requête . Le texte de la demande se compose de plusieurs parties :

· description de la demande ;

· fusionner les requêtes ;

· classement des résultats ;

· COMMANDE AUTOMATIQUE ;

· description des résultats.

La seule partie obligatoire de la demande est la première – la description de la demande. Tous les autres sont présents selon les besoins.

La description de la requête définit les sources de données, les champs de sélection, les regroupements, etc.

La fusion de requêtes définit la manière dont les résultats de plusieurs requêtes sont combinés.

L'ordre des résultats définit les conditions d'ordre des lignes de résultats de la requête.

AUTO ORDER vous permet d’activer l’ordre automatique des lignes de résultats de requête.

La description récapitulative détermine quels totaux doivent être calculés dans la requête et comment le résultat doit être regroupé.

Il convient de noter que lorsqu'un langage de requête est utilisé pour décrire des sources de données dans un système de composition de données, la section récapitulative du langage de requête n'est pas utilisée. Cela est dû au fait que le système de composition des données calcule indépendamment les résultats en fonction des paramètres définis par le développeur ou l'utilisateur.

Système de composition de données conçu pour créer des rapports personnalisés dans le système 1C:Enterprise 8.1 et se compose de plusieurs parties principales.

Les données initiales pour la présentation du rapport contiennent diagramme de disposition des données – ce sont des ensembles de données et des méthodes pour travailler avec eux(Fig. 98).

Le développeur crée un schéma de composition de données dans lequel il décrit le texte de la demande, les ensembles de données, les connexions entre eux, les champs disponibles, les paramètres de récupération des données et définit les paramètres de mise en page initiaux - structure du rapport, mise en page des données, etc.

Par exemple, un diagramme de configuration peut contenir l'ensemble de données suivant (Figure 99).

Riz. 98. Schéma général de travail avec le système de composition de données

Riz. 99. Exemple de schéma de présentation (ensemble de données et requête l'utilisant)

En figue. La figure 99 montre la fenêtre du concepteur de schéma de composition de données, qui contient la source de données, le texte de la requête et les champs sélectionnés par la requête.

Le rapport du système de composition des données que l'utilisateur reçoit n'est pas seulement un tableau d'enregistrements répondant à la requête. Il a une structure hiérarchique complexe et peut être constitué de divers éléments, tels que des regroupements, des tableaux et des graphiques. Dans ce cas, l'utilisateur peut modifier celle existante ou même créer une toute nouvelle structure de rapport, configurer la sélection et la conception des éléments de la structure de rapport dont il a besoin, obtenir une transcription pour chaque élément, etc.

Par exemple, la structure de rapport suivante peut être spécifiée (Fig. 100) :

Riz. 100. Structure d'un éventuel rapport

Le rapport généré peut ressembler à ceci (Fig. 101).

Dans le rapport présenté, le tableau sera composé des entrées du registre d'accumulation Chiffre des ventes sur les clients et les services qui leur sont fournis. Ces fiches sont regroupées par les artisans ayant réalisé les commandes. Et dans le regroupement, une liste de maîtres sera affichée.

En général, un système de composition de données est un ensemble de plusieurs objets. Lors de la génération et de l'exécution d'un rapport, les données sont transférées séquentiellement d'un objet du système de composition de données à un autre, jusqu'à ce que le résultat final soit obtenu - un document présenté à l'utilisateur.

L'algorithme d'interaction de ces objets est le suivant : le développeur crée un schéma de disposition des données et des paramètres par défaut. En général, un grand nombre de rapports différents peuvent être créés sur la base d'un seul schéma de composition de données. Les paramètres de composition des données, créés par le développeur ou modifiés par l'utilisateur, déterminent quel rapport sera produit dans un cas particulier.

Riz. 101. Exemple de rapport

En fonction de la conception de la mise en page et des paramètres disponibles, le générateur de mise en page crée une mise en page des données. C'est l'étape de préparation à l'exécution du rapport. La mise en page de la composition des données est une tâche prête à l'emploi qui peut être exécutée par le processeur de composition. La mise en page contient les requêtes nécessaires, les mises en page des zones de rapport, etc.

Le processeur de composition des données sélectionne les données de l'infobase en fonction de la disposition, agrège et formate ces données.

Le résultat de la mise en page est traité par le processeur de sortie et, par conséquent, l'utilisateur reçoit la feuille de calcul résultante.

La séquence de fonctionnement du système d'aménagement peut être représentée par le schéma suivant (Fig. 102) :

Riz. 102. Schéma de fonctionnement du système d'aménagement

3.12.1. Création d'un rapport "Registre des documents Prestations de services"

Rapport Registre des documents Prestation de services affichera une liste des documents de Prestation de Service existant dans la base de données par ordre de leurs dates et numéros.

Rapport. Donne lui un nom Registre des documents Prestation de services. Sur le marque-page Basique Cliquez sur " Prêt". Dans le concepteur de schéma de composition de données, ajoutez Ensemble de données – Requête Constructeur de requête".

Sélectionnez la table du document objet (de référence) comme source de données pour la requête Fourniture de services. Dans ce tableau, sélectionnez les champs suivants (Fig. 103) :

Date de; Nombre; Action; Maître; Client.

Riz. 103. Champs sélectionnés

Après cela, allez dans le favori Commande et spécifiez que le résultat de la requête doit d'abord être classé par valeur de champ date, puis - par valeur de champ Prestation de Services.Lien(Fig. 104).

Riz. 104. Ordre de sortie des résultats de la requête

Cliquez sur " D'ACCORD" et voyez quelle requête le constructeur de requête a générée.

Aller au favori Paramètres et ajoutez un nouveau regroupement à la structure du rapport (Fig. 105).

Riz. 105. Panneau de commande de l'onglet Paramètres

Dans la fenêtre de sélection du champ de regroupement, cliquez sur le bouton " D'ACCORD" et sur le marque-page Champs sélectionnés définissez les champs qui seront affichés dans le rapport :

Date de; Nombre; Action; Maître; Client (Fig. 106).

Riz. 106. Mise en place de la structure du rapport

Registre des documents pour la prestation de services. Cliquez sur " Formulaire" et regardez le résultat du rapport (Fig. 107).

Riz. 107. Rapport Registre des documents de prestation de services

Rapport. Nomme le Évaluation des services. Sur le marque-page Basique Cliquez sur " Diagramme de composition de données ouvertes". Dans la boîte de dialogue Layout Designer qui s'ouvre, cliquez sur le bouton " Prêt".

Dans le concepteur de schéma de composition de données, créez Ensemble de données – Requête(DataSet1) et cliquez sur " Constructeur de requête".

Nomenclature et table virtuelle du registre d'accumulation Chiffre des ventes. Pour éliminer toute ambiguïté des noms dans la requête, renommez la table Nomenclature en Nomenclature Spr(menu contextuel par clic droit – Renommer la table).

Sélectionnez ensuite dans les tableaux de champs RefNomenclature.Link Et Chiffre d'affaires.RevenueTurnover(Fig. 108).

Riz. 108. Champs sélectionnés

Aller au favori Connexions et notez que le concepteur a déjà créé une connexion entre les deux tables sélectionnées - la valeur du changement de registre Nomenclature doit être égale à la référence à l'élément du répertoire Nomenclature.

La seule chose à faire est de réinitialiser le drapeau Tousà la table des registres et placez-le à la table du répertoire Nomenclature Spr(Fig. 109).

Mettre le drapeau Tous dans le tableau du répertoire signifie que tous les éléments seront sélectionnés dans le répertoire et que ces éléments se verront attribuer la valeur du chiffre d'affaires du registre. Ainsi, à la suite de la demande, tous les services seront présents, et pour certains d'entre eux le chiffre d'affaires sera indiqué. Pour les prestations qui n'ont pas été fournies dans la période sélectionnée, rien ne sera indiqué.

Riz. 109. Établir des liens de tables

Aller au favori Conditions et définir les conditions de sélection des éléments du répertoire Nomenclature (Fig. 110). Vous devrez utiliser des paramètres de requête lors de la définition des conditions de sélection. La première condition doit être que l'élément sélectionné ne soit pas un groupe (pour cela, passez en mode Condition arbitraire– mettre le drapeau gratuit). Puis sur le terrain condition saisissez le texte suivant :

SprNomenclature.ThisGroup = FALSE

La deuxième condition doit être que l'élément sélectionné soit un service (c'est Condition simple) (Fig. 110).

Riz. 110. Conditions de sélection des éléments

Plus tard, avant d'exécuter la requête, dans le paramètre TypeNomenclature vous devez transmettre la valeur d'énumération correspondante.

Aller au favori Syndicats/Alias et spécifiez que la vue de l'élément de répertoire aura un alias Service, et le champ de registre aura un alias Revenu(Fig. 111).

Riz. 111. Syndicats/Alias

Aller au favori Commande et spécifiez que le résultat de la requête doit être trié par ordre décroissant de la valeur du champ Revenu. La création de la demande est terminée, cliquez sur le bouton " D'ACCORD". Regardez le texte de la requête généré par le constructeur.

Aller au favori Ressources et cliquez sur " >> ", afin que le concepteur sélectionne toutes les ressources disponibles pour lesquelles des totaux peuvent être calculés. Dans votre cas, c'est la seule ressource Revenu(Fig. 112).

Riz. 112. Ressources du schéma de composition des données

Aller au favori Possibilités(Fig. 113).

Riz. 113. Options de composition des données

Sur cet onglet, vous verrez trois options : Début de période, Fin de période Et TypeNomenclature. Le premier paramètre est le début de la période de calcul des totaux, le second est la fin de la période. De ce fait, la table source contiendra uniquement le chiffre d'affaires calculé sur la période transférée.

Pour paramètre Début de période définir le titre qui sera affiché à l'utilisateur - date de début.

Ici, vous devez toujours vous rappeler que si vous transmettez une date comme paramètre, la date contient également l'heure précise à la seconde près.

Disons qu'il est connu à l'avance que l'utilisateur ne sera pas intéressé par les résultats du rapport dans les délais spécifiés avec une précision pouvant aller jusqu'à la seconde. Dans ce cas, deux caractéristiques doivent être prises en compte.

Premièrement, l'utilisateur ne doit pas avoir à spécifier l'heure lors de la saisie de la date. Pour ce faire, modifiez la description du type existant pour le paramètre Début de période. Double-cliquez dans une cellule Types disponibles, correspondant au paramètre Début de période, appuyez sur le bouton de sélection " " et en bas de la fenêtre d'édition du type de données, définissez Composition des dates dans le sens date(Fig. 114).

Cliquez sur " D'ACCORD".

La deuxième fonctionnalité est que, par défaut, l'heure de la date est définie sur 00:00:00. Ainsi, si l'utilisateur précise une période de rapport du 01/10/2009 au 31/10/2009, les totaux du registre seront calculés du début de la journée du 01/10/2009 00:00:00 au début de la journée. 31/10/2009 00:00:00. Ainsi, les données du 31ème jour, autre que le début de la journée, ne seront pas incluses dans le calcul, ce qui surprendra grandement l'utilisateur. Pour éliminer cette situation, ajoutez un autre paramètre dans lequel l'utilisateur saisira la date de fin. Valeur du paramètre Fin de période sera calculé automatiquement pour indiquer la fin de journée de la date saisie par l'utilisateur. Donc pour le paramètre Fin de période mettre le drapeau Limite de disponibilité.

Riz. 114. Modification de la composition des dates

À l'aide du bouton de la barre de commandes, ajoutez un nouveau paramètre nommé Date de fin (Figure 115).

Riz. 115. Ajout du paramètre Date de fin

Pour ce paramètre, la plateforme générera automatiquement un titre - date d'expiration. Laissez-le inchangé. Définir le type de valeur du paramètre – date. Dans ce cas, comme pour le paramètre Début de période, indiquer la composition de la date – date.

Veuillez noter que par défaut le paramètre que vous avez ajouté est disponible pour l'utilisateur (la restriction d'accessibilité dans la dernière colonne est effacée).

Aller au paramètre Fin de période. Le système a défini un indicateur de restriction de disponibilité pour celui-ci. Ne la décochez pas car la valeur de ce paramètre sera calculée en fonction de la valeur définie par l'utilisateur pour le paramètre Date d'expiration.

Pour définir la formule par laquelle la valeur du paramètre sera calculée Fin de période, utilisez le langage d'expression du système de composition de données. Il contient la fonction FinPériode(), qui permet d'obtenir la date correspondant à la fin d'une période, par exemple un jour précisé.

Dans une cellule Expression définir le paramètre Fin de période l'expression suivante :

À la suite des actions ci-dessus, les paramètres de mise en page ressembleront à ceci (Fig. 116) :

Riz. 116. Options du système de mise en page

Enfin, configurez le paramètre TypeNomenclature. Étant donné que le rapport doit afficher uniquement les revenus provenant de la vente de services, la valeur du paramètre TypeNomenclature l'utilisateur ne doit pas le modifier. Il doit être précisé directement dans le schéma d'implantation comme . Indicateur de restriction d'utilisation des paramètres TypeNomenclature la plateforme installée par défaut, il vous suffit donc de préciser la valeur d'énumération souhaitée TypesNomenclature dans une cellule Signification, correspondant au paramètre TypeNomenclature(Fig. 117).

Riz. 117. Définition de la valeur du paramètre Type de nomenclature

Passez à la création de la structure du rapport. Sur le marque-page Paramètres ajoutez un regroupement et laissez de nouveau de côté le champ de regroupement. Sur le marque-page Champs sélectionnés spécifier les champs Service Et Revenu(Fig. 118).

Ensuite, allez dans le favori Autres réglages et définissez le titre du rapport - Évaluation des services(Fig. 119).

Riz. 119. Définition du titre du rapport

Démarrez 1C:Enterprise en mode débogage.

Sélectionnez un rapport Évaluation des services, mais avant d'appuyer sur la touche " Formulaire", ouvrir Paramètres et sur le marque-page Options de données définir la période de reporting du 01/03/2004 au 30/04/2004 (Fig. 120). Si les dates de création de vos documents diffèrent de celles données dans l'exemple, alors la période de reporting doit être définie différemment.

Riz. 120. Paramètres du rapport

Cliquez sur " D'ACCORD" et générer un rapport. Le résultat ressemblera à ceci (Fig. 121) :

Riz. 121. Résultat de l'exécution du rapport

Modifiez maintenant la date de fin au 31/03/2004. Les données du 31 mars sont incluses dans le rapport (Fig. 122).

Riz. 122. Résultat de l'exécution du rapport

3.12.3. Création d'un rapport "Revenus des artisans"

Rapport Revenus des artisans contiendra des informations sur le montant des revenus reçus par Master LLC grâce au travail de chacun des maîtres, avec des détails pour tous les jours de la période sélectionnée et une répartition des clients servis chaque jour. En utilisant ce rapport comme exemple, vous apprendrez comment créer des regroupements à plusieurs niveaux dans une requête et comment parcourir toutes les dates de la période sélectionnée.

Créer un nouvel objet de configuration Rapport. Nomme le RevenuMasters et exécutez le concepteur principal de schéma de composition de données.

Ajouter Ensemble de données – Requête(DataSet1) et cliquez sur " Constructeur de requête". Sélectionnez la table virtuelle du registre d'accumulation Chiffre des ventes.

Définissez l'un des paramètres de cette table virtuelle - Périodicité. Pour cela, rendez-vous sur le terrain les tables et cliquez sur " Options de table virtuelle" (Fig. 123).

Riz. 123. Modification des paramètres de la table virtuelle

Dans la fenêtre des paramètres qui s'ouvre, définissez la valeur du paramètre Fréquence – Jour(Fig. 124). Appuie sur le bouton " D'ACCORD".

Riz. 124. Paramètres de la table virtuelle

Après cela, sélectionnez les champs suivants dans le tableau :

· Chiffre d'affaires.Master ;

· Chiffre d'affaires.Période ;

· Chiffre d'affaires.Client ;

· SalesTurnover.RevenueTurnover (Fig. 125).

Riz. 125. Champs sélectionnés

Allez maintenant au signet Syndicats/Alias et définissez un alias Revenu pour le terrain Chiffre d'affaires.RevenueTurnover(Fig. 126).

Riz. 126. Syndicats/Alias

Sur le marque-page Regroupement définir que le regroupement se fera par champs Maître, Période Et Client, et les valeurs des champs Chiffre d'affaires sera résumée (Fig. 127).

Riz. 127. Regroupement des champs

Sur le marque-page Commande spécifier que le résultat de la requête sera trié par ordre croissant de la valeur du champ Période. Cliquez sur " D'ACCORD". Considérez le texte de requête généré par le constructeur.

Passez maintenant à la modification du schéma de présentation des données. Sur le marque-page Ressources Cliquez sur " >> " et assurez-vous que le constructeur a sélectionné la seule ressource disponible - Revenu.

Sur le marque-page Possibilités suivez les mêmes étapes que lors de la création du rapport précédent.

Pour paramètre Début de période définir le titre date de début. Sur le terrain Types disponibles définir la composition de la date – date.

Pour paramètre Fin de période définissez l'expression :

FinPériode(&EndDate, "Jour")

Sur le terrain Limitation disponibilité définit l'indicateur de restriction de disponibilité.

Enfin, ajoutez un paramètre supplémentaire - Date d'expiration, définissez son type comme date, composition des dates – date.

À la suite de ces actions, les paramètres de composition des données ressembleront à ceci (Fig. 128) :

Riz. 128. Options de composition des données

Vous devez maintenant créer la structure du rapport. Sur le marque-page Paramètres créer séquentiellement deux regroupements imbriqués : niveau supérieur - par champ Maître, intégré dedans - par champ Période. Ajoutez ensuite un autre regroupement imbriqué dans le champ regroupement par Période, – Entrées détaillées(sans préciser le champ de regroupement) (Fig. 129).

Riz. 129. Structure du rapport

Maintenant, étant au niveau du rapport global, allez dans l'onglet Champs sélectionnés et ajoutez des champs à la liste Client Et Revenu.

Enfin, depuis le niveau du rapport global, rendez-vous dans l'onglet Autres réglages et modifiez les paramètres suivants. Pour paramètre valeur définie Séparément et seulement en conséquence; pour paramètre définir la valeur Commencer et pour le paramètre Titre définir la valeur Revenus des artisans(Fig. 130).

Riz. 130. Régler la sortie des totaux généraux au début

Exécutez 1C:Enterprise en mode débogage et examinez le résultat du rapport « Revenus des contremaîtres » pour la période du 01/03/2004 au 30/04/2004 (Fig. 131).

Riz. 131. Résultat de l'exécution du rapport

Si vous vous en souvenez, ce rapport doit afficher des données détaillées pour tous les jours de la période sélectionnée. Désormais, seuls les jours pour lesquels il y a des entrées non nulles dans le tableau du registre d'accumulation sont affichés. Par conséquent, il est désormais nécessaire de modifier les paramètres du rapport afin que le rapport inclue toutes les dates de la période pour laquelle le rapport a été généré.

Pour cela, revenez en mode configurateur et affinez la structure du rapport. Jusqu'à présent, tous les paramètres de structure que vous avez définis se sont appliqués à l'ensemble du rapport. Mais le système de composition des données permet également de personnaliser chaque élément de la structure séparément.

Vous devrez modifier le paramètre de regroupement Période. Afin d'accéder aux paramètres de ce regroupement particulier, placez le curseur sur ce regroupement dans le champ structure, puis cliquez sur le bouton " Période" dans le panneau de commande (Fig. 132).

Riz. 132. Paramètres de regroupement Période

Les paramètres disponibles pour ce regroupement seront affichés en bas du formulaire.

Aller au favori Regroupement de champs. Pour le terrain Période installer Type de module complémentaire – Jour(Fig. 133).

Riz. 133. Définition du type d'ajout de période

Ainsi, vous avez indiqué que pour ce regroupement, les enregistrements existants avec une valeur de ressource non nulle seront complétés par des enregistrements pour chacun des jours.

Après cela, vous devez indiquer dans quelle période un tel ajout sera effectué. Dans les champs situés une ligne en dessous, vous pouvez saisir les dates de début et de fin de cette période. Mais préciser explicitement des dates ne convient pas, car... l'utilisateur peut générer un rapport pour une période arbitraire. Il est nécessaire que l'ajout de date soit effectué non pas dans une période fixe, mais précisément dans la période sélectionnée par l'utilisateur pour l'ensemble du rapport.

Afin de vous assurer que le rapport fonctionne exactement ainsi, entrez dans le mode d'édition du premier champ (par exemple en double-cliquant dessus) et cliquez sur le bouton Effacer " X". Après cela, cliquez sur le bouton " T", vous pourrez sélectionner le type de données affichées dans ce champ. Sélectionnez Champ de composition des données(Fig. 134).

Riz. 134. Sélection d'un type de données

Cliquez sur " D'ACCORD". Appuyez maintenant sur le bouton de sélection dans le champ de saisie " " et dans la fenêtre de sélection de champ qui s'ouvre, sélectionnez l'option Début de période(Fig. 135). Cliquez sur " D'ACCORD".

Riz. 135. Sélection des champs

Pour le deuxième champ de saisie, indiquez de la même manière que la date de fin de période sera obtenue à partir du paramètre Date d'expiration(Fig. 136).

Riz. 136. Paramètres de regroupement Période

Démarrez 1C:Enterprise en mode débogage et exécutez le rapport Revenus des artisans pour la période du 20 mars 2004 au 20 avril 2004 (Fig. 137).

Riz. 137. Résultat de l'exécution du rapport

3.12.4. Création d'un rapport "Liste des services"

Rapport Liste des services contiendra des informations sur les services fournis par Master LLC et à quel prix. A l'aide de son exemple, vous vous familiariserez avec la possibilité d'obtenir les dernières valeurs d'un registre périodique d'informations et d'afficher des répertoires hiérarchiques.

Créer un nouvel objet de configuration Rapport. Nomme le Liste des services et exécutez le concepteur de schéma de composition de données. Créez-en un nouveau Ensemble de données – Requête(DataSet1) et appelez le constructeur de requête.

Sélectionnez la table du répertoire d'objets (référence) Nomenclature et table de registre d'informations virtuelle Prix.CoupeDernières. Pour éliminer l'ambiguïté des noms dans la requête, renommez la table Nomenclature en Nomenclature Spr.

Appeler la boîte de dialogue pour saisir les paramètres de la table virtuelle PrixCoupeDernières et indiquer que le point sera passé dans le paramètre Date du compte rendu(Fig. 138).

Riz. 138. Paramètres de la table virtuelle

Sélectionnez ensuite les champs suivants dans les tableaux :

· SprNomenclature.Parent ;

· PrixTranche du Dernier.Prix (Fig. 139).

Riz. 139. Champs sélectionnés

Aller au favori Connexions, réinitialisez le drapeau Tousà la table des registres et définissez-le sur la table du répertoire.

Sur le marque-page Conditions définir la condition de sélection des éléments du répertoire Nomenclature– les éléments sélectionnés doivent correspondre au type d’élément passé dans le paramètre de requête TypeNomenclature(Fig. 140).

Riz. 140. Conditions de sélection des éléments

Sur le marque-page Syndicats/Alias indiquer que le champ Parent aura un surnom Groupe de services, et le terrain Lien – Service(Fig. 141).

Riz. 141. Syndicats/Alias

Aller au favori Regroupement et précisez que le regroupement se fera par domaine SprNomenclature.Parent. Il n'est pas nécessaire de préciser les valeurs des champs additionnés (Fig. 142).

Figure 142. Regroupement de champs

Cliquez sur " D'ACCORD". Regardez le texte de la demande.

Procédez à la modification du diagramme de présentation des données. Sur le marque-page Ressources en appuyant sur la touche " >> " sélectionnez la seule ressource disponible Prix.

Sur le marque-page Possibilités définir la valeur du paramètre TypeNomenclature Comment Transfert Types de nomenclature Service. De plus, supprimez la restriction d'accessibilité pour le paramètre Date du compte rendu et donne-lui un titre - Date du compte rendu. Sur le terrain Types disponibles définir la composition de la date – date. Pour paramètre Période, au contraire, fixez la limite de disponibilité (Fig. 143).

Riz. 143. Paramètres du schéma d'implantation

Passez à la création de la structure du rapport. Aller au favori Paramètres et créer un regroupement par domaine Groupe de services, indiquant le type de regroupement Hiérarchie. Au sein de ce regroupement, créez un autre regroupement sans spécifier de champ de groupe. Il contiendra des entrées de rapport détaillées (Fig. 144).

Riz. 144. Structure du rapport et champs mis en évidence

Aller au favori Champs sélectionnés et précisez que les champs Service et Prix seront affichés dans le rapport (Fig. 145).

Riz. 145. Structure du rapport

Enfin, personnalisez l'apparence du rapport sur l'onglet Autres réglages. Puisque le rapport sera simplement une liste de services fournis, dans lesquels les prix de services spécifiques sont intéressants, affichez les valeurs des ressources Prix pour chacun des groupes et pour l'ensemble du rapport dans son ensemble n'a pas de sens.

Pour empêcher les totaux généraux d'être affichés dans un rapport, définissez l'option Disposition verticale des totaux généraux dans le sens Non.

Accédez ensuite aux paramètres de regroupement spécifiques - Groupe de services. Pour paramètre Localisation des totaux indiquer la valeur de ce regroupement Non. Revenez aux paramètres pour l'ensemble du rapport dans son ensemble.

Pour paramètre Emplacement des champs de regroupement entrez la valeur Séparément et seulement en conséquence(de cette façon le rapport sera mieux « lisible »). Enfin, définissez le titre du rapport - Liste des services.

Démarrez 1C:Enterprise en mode débogage et ouvrez tout d'abord le registre périodique Des prix.

Ajoutez-y une autre valeur pour le service Diagnostique: nouveau prix du service à compter du 1er avril 2004 – 350 (Fig. 146). Cela vous permettra de tester le rapport.

Riz. 146. Registres du registre « Prix »

Maintenant, exécutez le rapport Liste des services au 31 mars 2004 (Fig. 147).

Riz. 147. Résultat de l'exécution du rapport

Votre rapport reflète correctement le prix du service Diagnostic au 31 mars 2004 – 200 roubles.

Exécutez à nouveau le rapport, mais maintenant pour une date différente - 01/04/2004 (Fig. 148).

Riz. 148. Résultat de l'exécution du rapport

Comme vous pouvez le constater, le nouveau prix du service Diagnostic est indiqué - 350 roubles.

Rapport Évaluation du client montrera quels sont les revenus de la fourniture de services à chacun des clients pour toute la période d'exploitation de Master LLC. Cet exemple démontrera la possibilité d'utiliser un diagramme pour afficher le résultat d'une requête.

Diagramme est un élément de contrôle conçu pour être placé dans des tableaux et des formulaires de tableaux et de graphiques de différents types du système 1C:Enterprise.

Logiquement diagramme est une collection de points, de séries et de valeurs de séries en un point(Fig. 149).

En règle générale, les moments ou les objets pour lesquels vous obtenez des valeurs caractéristiques sont utilisés comme points, et les caractéristiques dont les valeurs vous intéressent sont utilisées comme séries.

Par exemple, un diagramme des ventes de types de produits par mois sera composé de points - mois, séries - types de produits et valeurs - chiffre d'affaires.

Un diagramme en tant qu'objet du langage intégré comporte trois zones qui vous permettent de contrôler la conception du diagramme : la zone de traçage, la zone de titre et la zone de légende (Fig. 150).

Le diagramme peut être inséré dans la structure du rapport en tant qu'élément distinct. Lors de la création d'un rapport Évaluation du client le diagramme sera utilisé dans la structure des paramètres du schéma de composition des données.

Riz. 149. Exemple de diagramme

Riz. 150. Zones cartographiques

Créer un nouvel objet de configuration dans le configurateur Rapport. Nomme le Évaluation du client, ouvrez son schéma de présentation de données principal.

Créer ensemble de données - requête(DataSet1) et appelez le constructeur de requête. Sélectionnez la table du registre d'accumulation virtuelle Chiffre des ventes et de là il y a un champ - Chiffre d'affaires.Client.

Ajoutez ensuite un nouveau champ (icône Ajouter dans le panneau de commande au-dessus de la liste des champs) et à l'aide du générateur d'expression, définissez-le comme la différence entre les revenus et les coûts (Fig. 151).

Riz. 151. Éditeur d'expression de champ personnalisé

En conséquence, la liste des champs sélectionnés ressemblera à ceci (Fig. 152) :

Riz. 152. Champs sélectionnés

Sur le marque-page Syndicats/Alias préciser que le champ calculé aura un alias Revenu(Fig. 153).

Riz. 153. Syndicats/Alias

Sur le marque-page Commande spécifier que les lignes de résultats doivent être classées par ordre décroissant de la valeur du champ Revenu. Cliquez sur " D'ACCORD" et voyez quel texte le constructeur de requête a généré.

Aller au favori Ressources et ajoutez un champ Revenu aux ressources du diagramme de présentation. Ensuite, allez dans le favori Paramètres afin de créer la structure du rapport.

Contrairement à tous les rapports précédents, dont la structure contenait des regroupements, cette fois, ajoutez un diagramme à la structure du rapport (Fig. 154).

Riz. 154. Structure du rapport

Ajouter un regroupement par champ aux points du graphique Client. Laissez la série de diagrammes inchangée.

Allez maintenant au signet Champs sélectionnés et sélectionnez le champ Revenu pour la sortie du rapport. La structure du rapport doit prendre la forme suivante (Fig. 155) :

Riz. 155. Structure du rapport et paramètres du graphique

Sur le marque-page Autres réglages définir le titre du rapport – Évaluation du client, et sélectionnez également le type de graphique – Volumétrique circulaire.

Démarrez 1C:Enterprise en mode débogage et ouvrez le rapport Évaluation du client(Fig. 156).

Riz. 156. Diagramme circulaire 3D dans un rapport

Veuillez noter que lorsque vous passez votre curseur sur un secteur du graphique, une info-bulle apparaît.

Ouvrez les paramètres du rapport et modifiez le type de graphique en Mesure. Régénérez le rapport (Fig. 157).

Avez-vous aimé l'article? Partager avec des amis: