Expressions logiques simples en 1s. Opérations logiques (1c entreprise). Langage d'expression du système de composition de données












1. Introduction

Le langage du programme 1C est structural-objet. Ce langage peut être appelé langage intermédiaire entre les langages de haut niveau et les langages de script tels que VBA.
À la base, l'application 1C fonctionne comme avec deux modules. Le premier module est le noyau ou le moteur. En fait, il s'agit d'un compilateur qui traduit le code ainsi que la description des formulaires imprimés et graphiques sur un écran ou une imprimante. Le deuxième module est la base de données avec laquelle fonctionne le premier module. Les deux modules sont interconnectés et ne peuvent pas fonctionner indépendamment. Le deuxième module est responsable de l'accès à la base de données, ainsi que de la manipulation des informations dans la base de données.
Dans la version 1C 7.7, il existe 1 mécanisme intégré pour accéder aux bases de données et un mécanisme qui utilise une interface externe pour accéder aux bases de données.
Le premier mécanisme est l'accès à la base de données au format dbf (en fait, accès non pas à la base de données, mais à chaque fichier individuel). La version de dbf utilisée est DBASE II, avec les limitations et défauts correspondants de cette ancienne version.
Le deuxième mécanisme est l'accès à une base de données au format MS SQL Server à l'aide d'une connexion ODBC (appelée fournisseur ODBC d'accès à MS SQL Server), qui est fournie avec MS SQL Server. Initialement, la version 7.7 a été développée pour SQL Server 6.5 (ou plutôt, il s'agissait de la version 7.5 affinée, qui fonctionnait sur les versions antérieures de SQL Server). Au moment d'écrire ces lignes, la version 1C actuelle (rel 7.70.027) prend en charge les versions de SQL Server 6.5, 7.0. SQL2000, il n'y a aucune information sur la prise en charge de SQL 2005. Mais l'auteur a effectué un test pour se connecter à SQL Server 2005 version 7.70.027 et le test a échoué. Celles. nous pouvons supposer que la version 27 ne prend pas officiellement en charge SQL Server 2005 (mais vous pouvez lire ce problème ici :).
Pour comprendre comment 1C fonctionne, examinons comment 1C stocke et comment il lance le code pour l'exécution. Tout le code 1C est physiquement situé soit dans le fichier 1Cv7.md, soit dans rapports externes traitement (* .ert) (il est également possible de charger des modules à partir de fichiers externes, mais ceci est un cas particulier et ne sera pas pris en compte). Le code est exécuté pour une exécution par étapes. Cela signifie que le code est compilé et exécuté pour être exécuté selon les besoins (ou plutôt, lors de l'accès à un objet ou à la forme d'un objet). La seule exception est le module global, sa compilation se fera au moment du lancement de 1C (plus précisément, après l'initialisation de la base de données). Le reste des modules ne sont pas compilés au moment du lancement de 1C, mais sont copiés uniquement lors de l'accès à ce module via un formulaire ou un objet. Cela conduit au fait que la syntaxe du contrôle doit être vérifiée par soi-même, ou qu'il faut regarder les erreurs de syntaxe au moment où l'application est en cours d'exécution.

2. Structure d'objet de 1C

Logiquement, le code 1C est stocké dans des modules (un module dans la compréhension du langage 1C est un code qui est lancé pour exécution). Dans 1C, tous les modules peuvent être divisés en 3 grandes catégories : 1 - module global, modules d'objets 1C, modules de traitement et de reporting. Du point de vue de 1C, un objet est compris comme faisant partie de l'ensemble général d'entités qui se trouvent dans une base de données particulière, qui ont les mêmes propriétés, ont le même ensemble de méthodes et exécutent le même type de fonctions avec des informations ou avec une base de données. Il convient de noter que tous les objets 1C n'ont pas de modules, mais en même temps, certains objets ont plus d'un module. Les modules se lient généralement à des formulaires. Du point de vue de 1C, un formulaire est une fenêtre avec un ensemble de ses attributs et détails. Tous les objets n'ont pas leurs propres formes, en même temps, certains objets ont plusieurs formes. Il s'agit généralement de la forme d'un élément spécifique ou de la forme d'une liste d'éléments.
Il est à noter que 1C fonctionne avec une base de données, alors que certains objets ne sont pas stockés dans la base de données.
Celles. la première classification des objets peut être selon que les informations sur les objets sont stockées dans la base de données ou non dans la base de données, appelons le premier type d'objets informationnel et le second type - non informationnel. Tous les objets d'information sont stockés dans la base de données, dans une ou plusieurs tables. Travailler avec des objets d'information suppose toujours de se positionner sur un enregistrement spécifique dans la table qui identifie l'objet. Cela signifie que pour accéder à un tel objet, vous devez en quelque sorte accéder à l'enregistrement requis dans la base de données. Habituellement, pour une telle transition, les méthodes 1C sont utilisées.
Une très bonne caractéristique de 1C est que certains des objets nouvellement créés peuvent être du type d'un objet existant. De tels objets sont appelés construction de types. Les types qui ne génèrent pas de données pour les objets nouvellement créés sont sans type. Tous les objets de formation de type sont informatifs, c'est-à-dire ils sont stockés dans la base de données. Dans la compréhension de 1C, les objets de formation de type sont des objets agrégés.
Dans le même temps, dans 1C, il existe des types de base qui existent indépendamment des objets créés. Ces types sont également stockés dans la base de données, mais ces données ne sont pas des objets du point de vue de 1C, mais ce sont des attributs d'objets d'information.
Aussi, une classification importante des objets est leur typification selon les critères selon lesquels ils sont divisés dans la description même de la base de données. Ces objets sont :
  • Constantes.
  • Livres de référence.
  • Documentation.
  • Revues documentaires.
  • Énumérations.
  • Rapports.
  • Traitement.
  • Plans de comptes.
  • Types de subkonto.
  • Opération.
  • Câblage.
  • Registres.
  • Journaux de calcul.
  • Types de calculs.
  • Groupes de calcul.
  • Calendriers.
De plus, il existe des objets non typés qui ne sont pas informatifs et ne sont pas présents dans l'arborescence des paramètres de configuration :
  • Texte.
  • XBase.
  • Résultats comptables.
  • Câblage correct.
  • Règle de recalcul.
  • Séquence.
  • Périodique.
  • Liste des valeurs.
  • Tableau des valeurs.
  • Tableau.
  • Enquête.
  • Image.
  • FS (système de fichiers).
Presque tous les types d'objets répertoriés sont accessibles dans les modules via la fonction de création d'objets CreateObject(). La structure générale des classifications d'objets décrites peut être représentée sous la forme de la matrice suivante :
Types d'objets Information Type-formation CréerObjet () Disponibilité des modules
Constantes
Annuaires + + + +
Documentation + + + +
Journaux de documents +
Énumérations +
Rapports +
Traitement +
Plans de comptes + + + +
Types de sous-conto +
Opération + + +
Câblage + +
Registres +
Journaux de calcul + +
Types de calcul + +
Groupes d'établissement
Calendriers +
Texte +
XBase +
Résultats comptables +
Câblage correct + +
Règle de recalcul +
Séquence + +
Périodique +
Liste de valeurs +
Tableau des valeurs +
tableau +
Enquête +
Image +
FS (système de fichiers) +
Nombre +
Ligne +
Date +

3. Langue 1C. Modularité

Comme déjà mentionné, tout le texte du code du programme est divisé en modules.
En général, les modules peuvent être structurés comme ceci :
Base de données séparée
Module global.
Modules d'annuaire.
Modules des Formulaires des listes d'annuaires.
Module d'élément de répertoire.
Module de groupe d'annuaire
Modules documentaires.
Module de formulaire de document.
Module de documentation.
Modules de journal de documents.
Module de constitution de journaux de documents.
Modules du plan comptable.
Module de formulaire de facture.
Modules de formulaires de listes de plans comptables.
Modules d'exploitation.
Module d'exploitation.
Modules de formulaires de listes d'opérations.
Modules de câblage.
Modules des formulaires de listes de journaux de transactions.
Modules de journal de calcul.
Modules de formulaires pour listes de journaux de calcul.
Modules de type calcul.
Modules de calcul.
Modules de rapport.
Module de formulaire de rapport.
Modules de traitement.
Module de traitement de formulaire.
Celles. au sein d'une même base, seul le module global est disponible à partir de chaque module de l'objet. Tous les autres modules sont isolés et leur interconnexion sans référence à un objet positionné spécifique est impossible. Mais en même temps, les attributs (et certaines des méthodes définies comme des fonctions système) du niveau supérieur sont disponibles à partir de chaque module. Il convient de noter que les fonctions et procédures écrites définies par l'utilisateur ne sont pas des méthodes d'objets et qu'elles ne peuvent pas être appelées en tant que méthodes.
Le niveau d'isolement des attributs et des variables va de bas en haut. Ainsi, les variables du module global sont disponibles dans tous les modules, de même que les fonctions et procédures du module global. Dans le même temps, les attributs d'objet sont disponibles dans tous les modules de ces objets, mais les méthodes sont divisées entre celles qui sont disponibles et celles qui ne sont pas disponibles.

4. Position générale des modules d'écriture

La sémantique du langage 1C est telle que tout le texte du module est divisé en opérateurs et commentaires. La fin de l'opérateur est le caractère ";". Les opérateurs sont composés d'expressions.

4.1. Commentaires

Les commentaires dans 1C sont uniquement ligne par ligne (il n'y a pas de commentaires bloc par bloc). un commentaire commence par deux caractères "//" et se termine par un caractère de fin de ligne (c'est-à-dire jusqu'à la fin de la ligne).

4.2. Noms de variables, de procédures et de fonctions

Le nom d'une variable, d'une procédure définie par l'utilisateur ou d'une fonction peut être n'importe quelle séquence de lettres, de chiffres et de traits de soulignement « _ » commençant par une lettre ou un trait de soulignement « _ ». Les noms nouvellement créés ne doivent pas correspondre aux mots réservés de la langue ou aux noms des procédures et fonctions existantes disponibles au moment de l'exécution. La reconnaissance des noms de variables, de procédures et de fonctions est effectuée sans tenir compte de la casse.

4.3. Mots réservés

Ce qui suit mots clés sont réservés et ne peuvent pas être utilisés comme noms de variables générés et procédures et fonctions déclarées. Dans cette variante de la langue, chacun des mots-clés a deux représentations - russe et anglais. La représentation anglaise est traditionnelle pour les langages de programmation. Les mots-clés dans les représentations russes et anglaises peuvent être librement mélangés dans un texte source. Les mots clés ne sont pas sensibles à la casse. Vous trouverez ci-dessous une liste de mots-clés dans les deux options de présentation.

Sinon, si

Longueur de chaîne

Fin si

Le contexte

Continuez

Avorter

Fin de la procédure

FinFonction

Avertissement

Fin de cycle

Procédure

4.4. La structure du module de programme

La structure du module logiciel peut être divisée en les sections suivantes :

  • section de définition des variables ;
  • section des procédures et des fonctions;
  • partie du programme principal.

L'une des sections peut être manquante dans un module de programme spécifique.

Section de définition des variables est placé du début du texte du module à la première instruction Procedure ou instruction Function ou à toute instruction exécutable. Cette section ne peut contenir que des instructions de déclaration de variable Var.

Section des procédures et fonctions est placé de la première instruction d'une instruction Procedure ou Function à toute instruction exécutable en dehors du corps d'une instruction de procédure ou de fonction.

Section principale du programme est placé à partir de la première instruction exécutable en dehors du corps des procédures ou des fonctions jusqu'à la fin du module. Cette section ne peut contenir que des instructions exécutables. La section du programme principal est exécutée au moment où le module est lancé pour exécution (voir "Types de modules de programme"). Habituellement, dans la section du programme principal, il est logique de placer des instructions d'initialisation de variables avec des valeurs spécifiques qui doivent être transmises avant le premier appel de l'une des procédures ou fonctions du module.

5. Format de la description des dévers et des conversions de type

Comme déjà mentionné, la sémantique du langage 1C est telle que les expressions sont le composant principal des opérateurs. Les expressions, à leur tour, se composent de nombres, de valeurs de chaîne ou de date, d'opérateurs de langage intégrés, d'attributs et de fonctions associés à des symboles arithmétiques.

5.1 Types de données dans les expressions et leur format.

Examinons de plus près les éléments des expressions et les opérations arithmétiques utilisées pour les utiliser.

Nombres

Les nombres sont écrits en chiffres de 0 à 9 ; si nécessaire, notez un nombre fractionnaire partie entière séparé de la partie fractionnaire par un point ".".
Par exemple:
45 est un entier positif
-12 est un entier négatif
16,67 est un nombre fractionnaire positif.

Pour travailler avec des nombres, vous pouvez utiliser les opérations arithmétiques fournies (voir ci-dessous).

Rendez-vous

Les dates sont écrites sous la forme d'une séquence de caractères dans ce format :
"JJ.MM.AA"
ou
"JJ.MM.AAAA",
où:
JJ est le jour du mois. Il doit être écrit sur deux chiffres : si le jour du mois est inférieur à 9, 0 est mis devant, par exemple « 02 » ;
MM - le numéro du mois, également écrit à deux chiffres;
AA (AAAA) - année, peut être écrit en deux ou quatre chiffres.

Par exemple : "01.01.2007"

Veuillez noter que les dates ne sont indiquées qu'entre guillemets simples. Avec un tel enregistrement, la séquence avec un symbole comme "01.01.2007" sera perçue et traitée par le système 1C: Enterprise comme une date, et non comme une séquence de caractères "représentant" la date. Pourquoi c'est important - nous vous le dirons ci-dessous.

En plus des dates spécifiques, il existe une "date vide" dans le langage intégré. Une date vide est spécifiée par la séquence "00.00.00". Habituellement, une date vide est utilisée pour la comparaison. Vous pouvez également obtenir une date vide en utilisant la méthode de conversion Date (0).

Noter.

Il n'y a pas de type Time dans 1C, tout comme il n'y a pas de type DateTime.

Valeurs de chaîne

Les valeurs de chaîne sont des séquences de caractères entourées de guillemets simples ou doubles. Exemple : "Exemple de chaîne".

Si vous devez spécifier des guillemets dans une valeur de chaîne, vous devez utiliser 2 guillemets à la suite. Par exemple, lors de l'écriture du contenu d'une opération dans une formule, une valeur de chaîne de la forme

"Exemple de chaîne "" chaîne entre guillemets "" "

formera une chaîne dans le contenu de l'opération

Exemple de chaîne "chaîne entre guillemets"

Dans l'exemple considéré, dans une valeur de chaîne :
le premier guillemet est le guillemet ouvrant de la valeur de chaîne dans son ensemble ;
2 guillemets d'affilée sont des guillemets ouvrants et dans la chaîne résultante, ils sont remplacés par un guillemet ;
3 guillemets d'affilée sont un groupe composé de : 2 guillemets - les guillemets fermants, qui sont remplacés par un guillemet dans la chaîne résultante, et un guillemet - les guillemets fermants de la valeur de chaîne dans son ensemble.

Comme le montre la pratique, pour une raison quelconque, c'est l'indication de guillemets dans les valeurs de chaîne qui pose certaines difficultés. Bien qu'il n'y ait rien de compliqué à ce sujet, vous devez juste vous rappeler une règle simple : les premier et dernier guillemets sont un caractère à la fois, et tous les guillemets à l'intérieur sont de deux caractères chacun.

Les valeurs de chaîne ont le concept " ligne vide". Une chaîne vide est spécifiée par une paire de guillemets :" ". Une chaîne vide a toutes les propriétés d'une valeur de chaîne" normale ", mais n'a pas de longueur.

5.2. Opérations arithmétiques

Considérons maintenant les opérations arithmétiques utilisées dans le langage 1C (Op - "opérande") :

Cependant, l'utilisation des opérations arithmétiques présente certaines particularités, selon les types des opérandes.

AVEC valeurs numériques toutes les opérations arithmétiques ci-dessus peuvent être utilisées, avec peu ou pas de limitation.

Pour valeurs de chaîne seule l'opération "+" est autorisée, qui dans ce cas est appelée l'opération concaténations (joindre). Cette opération concatène une valeur de chaîne à une autre.

Par exemple, le résultat de l'expression :

"Ligne d'exemple" + "Janvier 2007"

il y aura une ligne

Exemple de chaîne janvier 2007

Notez que les valeurs de chaîne sont concaténées les unes aux autres sans changement - la longueur de la valeur de chaîne résultante est égale à la somme des longueurs des valeurs de chaîne concaténées. Pour que le résultat de l'opération de concaténation soit une chaîne "lisible", vous ne devez pas oublier les espaces de fin et de début dans les chaînes jointes, comme cela est fait, par exemple, dans la ligne "Example string".

L'opération de concaténation peut concaténer plus de deux valeurs de chaîne en même temps. Par exemple, l'expression suivante est valide :

"Ivanov" + "" + "Ivan" + "" + "Ivanovitch"

Le résultat sera la ligne

Ivanov Ivan Ivanovitch

Pour valeurs de type "date" les opérations d'addition et de soustraction sont autorisées, mais les règles d'utilisation de ces opérations sont légèrement plus complexes que pour les nombres et les chaînes.

Vous pouvez ajouter un nombre à la date, par exemple :

"02.08.2000"+2

et le résultat de l'expression sera une date postérieure au premier trimestre du nombre de jours égal au deuxième trimestre. Dans ce cas, le résultat sera le 08/04/2000, ou le 4 août 2000.

"02.03.2000"-2

dans ce cas, on obtient une date antérieure à la date décrémentée. Il convient de noter qu'avec une telle augmentation ou diminution des dates, la transition correcte entre les mois et les années est effectuée, c'est-à-dire que le nombre de jours dans un mois, les années bissextiles, etc. sont pris en compte. Dans notre exemple, le résultat de l'expression ne sera bien sûr pas 00.03.2000, mais 29 juillet 2000 - 29 février 2000.

"02.10.2000" - "02.08.2000"

dans ce cas, le résultat sera le nombre de jours entre le soustrait et le soustrait.

Comme vous l'avez bien évidemment remarqué, contrairement aux opérations sur les nombres et les chaînes, lorsqu'on opère sur des dates, le type du résultat de l'expression diffère du type des opérandes. Cela doit être pris en compte lors de la rédaction de formules : si vous écrivez une expression comme celle ci-dessus dans la formule pour calculer la date de la transaction, nous recevrons très probablement un message d'erreur.

"02.08.2000" + "02.10.2000"

et nous n'aurons même pas de message d'erreur, mais le résultat d'une telle expression n'a aucune signification physique.

Pour avoir une idée plus générale des expressions, il faut dire que non seulement des nombres, des chaînes ou des dates spécifiques peuvent agir comme opérandes d'opérations arithmétiques, mais aussi expressions qui évaluent des nombres, des chaînes ou des dates.

Par exemple, dans l'expression

"Amortissement pour" + Format (WorkingDate (), "D MMMMYYYY")

le deuxième opérande est expression, qui se traduira par une valeur de chaîne représentant le mois en mots et l'année de la date de travail.

5.3. Conversion de type automatique

En général, les opérandes d'une expression doivent être du ou des mêmes types que ceux déterminés par les règles d'expression. Par exemple, les nombres doivent être ajoutés aux nombres, les chaînes doivent être ajoutées aux chaînes, mais vous pouvez soustraire à la fois une date et un nombre d'une date.

Dans le processus de construction d'expressions, il peut être nécessaire de convertir les types de données d'opérandes individuels d'expressions conformément aux règles. Pour cela, il existe des fonctions spécialement conçues pour cela dans le langage intégré. Donnons à titre d'exemple l'expression qui nous est déjà familière :

"Amortissement pour" + Format (WorkingDate (), "D MMMMYYYY")

Dans cette expression, le deuxième opérande WorkingDate(), qui est de type "date", est converti en type "string" à l'aide de la fonction Format().

Cependant, le système 1C : Enterprise « est capable » de convertir automatiquement les opérandes avant d'évaluer les expressions. différents typesà un type, guidé par ce règles de conversion de type.

Les règles de conversion suivantes sont définies pour les types de base :

Nombre -> Chaîne

Si le nombre n'a pas de paramètres de format, sa représentation sous forme de chaîne est la représentation complète du nombre au format à virgule fixe.

Date -> Chaîne

La date convertie en type chaîne a la forme JJ.MM.AA, où AA est deux chiffres de l'année, MM est la désignation numérique du mois (01, ..., 12), JJ est le jour du mois.

Chaîne -> Numéro

La chaîne est convertie en un nombre aussi long que possible. Le nombre résultant est considéré comme le résultat de la conversion. (Par exemple, la chaîne "1.22 Glass" sera convertie en 1.22). S'il n'y a rien au début de la ligne qui puisse être interprété comme un nombre, alors le résultat est 0.

Date -> Date

Le résultat de cette conversion est la représentation numérique de la date.

Chaîne -> Date

Si le début de la ligne contient quelque chose qui peut être interprété comme une représentation sous forme de chaîne de la date sous la forme JJ.MM.AA, où AA représente deux chiffres de l'année, MM est la désignation numérique du mois (01, .. ., 12), DD est le jour mois, la conversion correspondante sera effectuée. Sinon, la valeur de date sera nulle.

Numéro -> Date

Une tentative est faite pour prendre la partie entière du nombre et l'interpréter comme une représentation numérique de la date. Si le nombre est négatif, le total est la date zéro.

Donc, tout d'abord, il faut se rappeler que le type du résultat d'une expression est déterminé par le type du premier opérande de cette expression... Les autres opérandes sont contraints au type du premier opérande. Connaissant cette règle, vous pouvez à la fois prédire le type du résultat de l'expression dans son ensemble et contrôler le type du résultat.

Par exemple, le résultat de l'expression

2+ "A"

sera le nombre 2, car le premier opérande de l'expression a un type numérique, et le deuxième opérande, conformément à la règle de conversion de type, est devenu égal à 0.

Cependant, cela vaut la peine de changer un peu l'expression en l'écrivant comme ceci :

"" + 2+ "A"

comment son résultat va changer radicalement : le résultat de l'expression sera la chaîne "2A".

Pourquoi est-ce arrivé? Ci-dessus, nous avons parlé du concept de "chaîne vide", qui possède toutes les propriétés d'une valeur de chaîne, y compris le type "chaîne". Dans notre exemple, la chaîne vide est le premier opérande de l'expression, et lors de l'évaluation de l'expression, tous ses opérandes ont été convertis en type "chaîne" conformément aux règles de conversion de type.

Encore un exemple. Ci-dessus nous avons souligné qu'une valeur de type "date" est spécifiée par une chaîne de caractères entre guillemets simples, et la même séquence de caractères, mais déjà entre guillemets doubles, est une chaîne. Nous allons maintenant illustrer cela avec des exemples.

Comme nous l'avons déjà dit, le résultat de l'expression "08/02/2000" +2 sera la date 04/08/2000. Mais, en spécifiant le premier opérande entre guillemets :

"02.08.2000"+2

nous obtenons un résultat complètement différent - la ligne "08/02/20002".

Résumons. Vous pouvez contrôler le type du résultat de l'expression entière en définissant le premier opérande sur une valeur vide du type correspondant. L'avantage de cette méthode est que une valeur vide ne change pas le résultat de l'expression. Par exemple, en mettant 0 au début de l'expression :

0+ "23"+45

nous obtenons le nombre 68 en conséquence, car l'expression dans son ensemble a le type "nombre", et la chaîne de caractères, conformément aux règles de conversion de type, a été convertie avec succès en nombre 45.

Ici, il convient également de rappeler la date vide. Quel sera le résultat de l'expression "00.00.00" + 2+ "02.08.2000" ? Bien entendu, la date est le 04/08/2000 (4 août 2000), car le premier opérande de l'expression était une valeur de type "date".

A l'inverse, supprimer la date vide

2+"02.08.2000"

nous obtenons 2451761 en conséquence - c'est le nombre de jours entre la date zéro et le 2 août 2000, plus 2 jours supplémentaires.

5.4. Opérateurs de comparaison booléens

Dans 1C il y a de tels expressions booléennes pour les types de données de base.

> Plus

< Меньше

<>Inégal

Ces expressions booléennes peuvent être appliquées aux trois types de données de base.

Concernant le type de données numériques, il n'y a pas de problèmes, le nombre standard (entier ou fractionnaire) est comparé.

Pour les valeurs de chaîne, la comparaison est faite avec leurs soi-disant « scan-codes » (dans la compréhension de 1C, un tel code peut être obtenu en utilisant la méthode CodeCymb ()). La comparaison se fait caractère par caractère. Ainsi, si des chaînes de longueur égale sont comparées, les codes des caractères correspondants sont comparés séquentiellement. La comparaison se produit jusqu'à la première inégalité de la chaîne (si la chaîne contient plus d'un caractère). Si les chaînes sont comparées différentes longueurs, alors les valeurs manquantes dans l'opérateur sont complétées par des caractères de chaîne vides (pas par un espace (Code = 32)). Celles. la valeur de l'espace (CodeCharacter (32)) est supérieure à la valeur de la chaîne vide.

Pour les types, la date est comparée à la date elle-même (mais il est possible que 1C convertisse la date en un nombre égal au nombre de jours de Date (0) avant comparaison).

6. Problèmes d'arrondi

Lors de la réalisation d'une comptabilité automatisée, les utilisateurs rencontrent souvent des "problèmes d'arrondi" - des situations dans lesquelles, en raison de l'arrondi de diverses valeurs calculées, telles que le prix de revient, toute taxe, à différentes étapes des calculs, des " kopecks gelés " apparaissent dans les résultats finaux ...

Par exemple, une situation comme celle-ci :
Il y a 16 unités de marchandises à un prix (TVA incluse) 110,50 UAH.
- le coût total est de 110,50 * 16 = 1768 UAH.
- La TVA (au taux de 20%, y compris) est de 1768 * 20/120 = 294,67 UAH.

Si désormais ce produit est vendu "à la pièce" sans aucun supplément, la TVA sera différente :
- La TVA pour une unité de marchandise sera de 110,50 * 20/120 = 18,42 UAH.
- La TVA pour les 16 unités sera de 18,42 * 16 = 294,72 UAH.

La différence de TVA entre les recettes "groupe" et les ventes "à la pièce" est de 5 kopecks. N'ayant aucune valeur ajoutée, nous devions 5 kopecks au budget sous forme d'impôt sur celui-ci.

Notez que lorsque les marchandises sont arrivées, nous ne pouvions pas compter la TVA "à la pièce" - en calculant le montant de la taxe dans le coût d'une unité de marchandises et en multipliant par le montant des marchandises. Dans ce cas, les pertes d'arrondi peuvent être encore plus importantes. Par exemple, si le prix d'une unité d'un produit est de 3 kopecks, alors quelle est la TVA ?

Lorsque de tels "résultats arrondis" se produisent, il faut se rappeler que le problème ne réside pas dans le programme, ni dans les formules de calcul, mais dans la précision et la rigueur plus grandes (par rapport à la comptabilité "manuelle") des règles de calcul. Tenant une comptabilité manuelle, un comptable se permet souvent d'ajuster le résultat du calcul, cachant ces "kopecks" dans des calculs intermédiaires.

Dans les configurations typiques 1C : Enterprise, lorsque cela est possible, de telles situations sont prises en compte et correctement gérées. Par exemple, si 3 unités de marchandises d'une valeur totale de 1 hryvnia sont capitalisées, les deux premières unités seront amorties au prix de revient de 33 kopecks et la dernière - 34 kopecks. Mais tous les cas d'arrondi ne peuvent pas être pris en compte dans les algorithmes, y compris l'exemple ci-dessus avec cinq kopecks de TVA ne peut pas être correctement traité dans le programme.
Dans certains cas, de telles erreurs peuvent être évitées en attribuant un prix « approprié » pour les marchandises, de sorte que la TVA est calculée à partir de celui-ci complètement, sans reste. Mais cette règle s'applique uniquement aux prix de vente - les prix d'achat ne doivent pas être sélectionnés. Dans d'autres cas, les utilisateurs du programme doivent analyser d'où viennent les « pennies suspendues » et décider quoi en faire.

7. Limites du système V77

Date
Date - fonctionne correctement dans la plage de dates du 01.01.0000 au 31.12.9999
La date (0) correspond à 1721061 jours à partir du 01.01.0000
Lorsque vous essayez d'aller aux dates moins - 31.12.0001, le système ne fonctionne pas correctement, car il fonctionne à partir de la date 0, c'est-à-dire : Date ("01.01.0000") - 1 = 00.01.00. La fonction de format pour de telles dates ne fonctionne pas du tout.

Nombre
nombre maximum de valeurs = 64 (64 caractères).

Ligne
Nombre maximum de valeurs = limité par la mémoire physique libre (pas de fichier d'échange), on suppose qu'il ne peut pas y avoir plus de 2 ^ 32-1 caractères.

Document
Document - 9999 types de documents peuvent être créés.
Un document peut contenir et fonctionner correctement avec un maximum de 9999 lignes.
La longueur maximale du code est de 20, c'est-à-dire théoriquement un total de (27 + 33 + 10) ^ 20 documents peuvent être créés (70 ^ 20 = 7.9792266297612001e + 36).
Il ne peut plus y en avoir dans le système (la longueur du code ID dans le log = 9), pratiquement la longueur de l'ID est de 6 caractères (3 sur l'URIB) 36 ^ 6 = 2176782336 documents.
Le nombre de documents saisis avec la même heure est limité à 36 ^ 4 = 1679616

Forum ukrainien 1C : tout sur 1C 8.3, 1C 8.2, 1C 8.1, 1C 8.0, 1C 7.7 _ Système de composition de données _ Langage d'expression du système de composition de données

Contenu
1 Langage d'expression du système de composition de données
2 littéraux
2.1 Chaîne
2.2 Nombre
2.3 Date
2.4 Booléen
2.5 Valeur
3 Opérations sur les nombres
3.1 Unaire -
3.2 Unaire +
3.3 Binaire -
3.4 Binaire +
3.5 Oeuvre
3.6 Division
3.7 Reste
4 Opérations sur les cordes
4.1 Concaténation (binaire +)
4.2 Similaire
5 Opérations de comparaison
5.1 Égal
5.2 Pas égal
5.3 Moins
5.4 Plus
5.5 Inférieur ou égal
5.6 Supérieur ou égal
5.7 Étape B
5.8 Opération de vérification de l'existence d'une valeur dans un jeu de données
5.9 Opération de vérification d'une valeur pour NULL
5.10 Opération de vérification d'une valeur pour l'inégalité NULL
6 Opérations logiques
6.1 Fonctionnement NON
6.2 Fonctionnement ET
6.3 Opération OU
7 Fonctions agrégées
7.1 Montant
7.2 Quantité
7.3 Nombre de différents
7.4 Maximum
7.5 Minimum
7.6 Moyenne
8 Autres opérations
8.1 Fonctionnement SÉLECTIONNER
9 Règles pour comparer deux valeurs
10 Travailler avec NULL
11 Priorités d'opérations
12 Fonctions du langage d'expression du système de composition de données
12.1 Calculer
12.2 Niveau
12.3 Numéro par commande
12.4 NuméroOrdreDansGroupe
12.5 Format
12.6 Début de période
12.7 Fin de période
12.8 Ajouter à la date
12.9 Différence de date
12.10 Sous-chaîne
12.11 Longueur de ligne
12.12 Année
12.13 Trimestre
12.14 Mois
12.15 Jour de l'année
12.16 Jour
12.17 Semaine
12.18 Jour de la semaine
12.19 Heure
12.20 minutes
12.21 seconde
12.22 Express
12.23 OuiNull
12.24 Fonctions des modules communs

Langage d'expression du système de composition de données

Le langage d'expression du système de composition de données est conçu pour écrire des expressions utilisées dans diverses parties du système.

Les expressions sont utilisées dans les sous-systèmes suivants :

  • schéma de composition de données - pour décrire les champs calculés, les champs totaux, les expressions de relation, etc.
  • paramètres de composition de données - pour décrire des expressions de champ personnalisées ;
  • modèle de composition de données - pour décrire les expressions de relation d'ensemble de données, décrire les paramètres de modèle, etc.

Littéraux

Les expressions peuvent contenir des littéraux. Les littéraux des types suivants sont possibles :

  • Ligne;
  • Nombre;
  • Date;
  • Booléen.

Ligne

Un littéral de chaîne est écrit en caractères "" ", par exemple :

"chaîne littérale"


Si vous devez utiliser le caractère "" " à l'intérieur d'un littéral de chaîne, vous devez utiliser deux de ces caractères.

Par exemple:

"Littéral" "entre guillemets" ""

Nombre

Le nombre est écrit sans espaces, au format décimal. La partie fractionnaire est séparée par le symbole ".". Par exemple:

Date

Le littéral de date est écrit à l'aide du littéral de clé DATETIME. Après ça mot-clé, entre parenthèses, séparés par des virgules, l'année, le mois, le jour, les heures, les minutes, les secondes sont répertoriés. L'heure est facultative.

Par exemple:
DATE (1975, 1, 06) - 6 janvier 1975
DATE HEURE (2006, 12, 2, 23, 56, 57) - 2 décembre 2006, 23 heures 56 minutes 57 secondes, 23 heures 56 minutes 57 secondes

booléen

Les valeurs booléennes peuvent être écrites en utilisant les littéraux True, False.

Sens

Pour spécifier des littéraux d'autres types (énumérations système, données prédéfinies), le mot-clé Value est utilisé, suivi du nom du littéral entre parenthèses.
Valeur (Type de compte. Actif)

Opérations sur les nombres

Unaire -

Cette opération a pour but d'inverser le signe d'un nombre. Par exemple:
-Ventes.Quantité

Unaire +

Cette opération n'effectue aucune action sur le numéro. Par exemple:
+ Ventes.Quantité

Binaire -

Cette opération est conçue pour calculer la différence entre deux nombres. Par exemple:
Soldes et chiffres d'affaires.Solde initial - Soldes et chiffres d'affaires.Solde final
Soldes ET Chiffre d'affaires Solde initial - 100
400 – 357

Binaire +

Cette opération est conçue pour calculer la somme de deux nombres. Par exemple:
Soldes & Chiffre d'affaires.Solde initial + Soldes & Chiffre d'affaires.Chiffre d'affaires
Soldes ET Chiffre d'affaires Solde initial + 100
400 + 357

Travail

Cette opération est conçue pour calculer le produit de deux nombres. Par exemple:
Nomenclature.Prix * 1.2
2 * 3.14

Division

Cette opération est destinée à obtenir le résultat de la division d'un opérande par un autre. Par exemple:
Nomenclature.Prix / 1.2
2 / 3.14

Reste de la division

Cette opération est destinée à obtenir le reste de la division d'un opérande par un autre. Par exemple:
Nomenclature.Prix% 1.2
2 % 3.14

Opérations de chaîne

Concaténation (binaire +)

Cette opération est destinée à concaténer deux chaînes. Par exemple:
Nomenclature.Article + « : » + Nomenclature.Nom

Comme

Cette opération vérifie si la chaîne correspond au modèle passé.

La valeur de l'opérateur LIKE est TRUE si la valeur<Выражения>correspond au modèle, et FALSE sinon.

Les caractères suivants dans<Строке_шаблона>avoir un sens autre que le caractère de la ligne suivante :

  • % - pourcentage : une séquence contenant zéro ou plusieurs caractères arbitraires ;
  • _ - trait de soulignement : un caractère arbitraire ;
  • [...] - un ou plusieurs caractères dans crochets: un caractère, n'importe lequel de ceux listés entre crochets. L'énumération peut contenir des plages, par exemple, a-z, ce qui signifie un caractère arbitraire inclus dans la plage, y compris les extrémités de la plage ;
  • [^…] - entre crochets une icône de négation suivie d'un ou plusieurs caractères : tout caractère sauf ceux listés après l'icône de négation ;

Tout autre symbole signifie lui-même et n'a aucune signification supplémentaire. S'il est nécessaire d'écrire l'un des caractères énumérés comme soi-même, il doit être précédé de<Спецсимвол>spécifié après le mot-clé ESCAPE.

Par exemple, le modèle
"% ABC [abvg] \ _ abc%" SYMBOLE SPÉCIAL "\"

désigne une sous-chaîne constituée d'une séquence de caractères : la lettre A ; lettres B; lettres B; Un chiffre; l'une des lettres a, b, c ou d ; caractère de soulignement ; lettres a; lettres b; lettres c. De plus, cette séquence peut être localisée à partir d'une position arbitraire dans la ligne.

Opérations de comparaison

Équivaut à

Cette opération est destinée à comparer deux opérandes pour l'égalité. Par exemple:
Ventes.Entrepreneur = Ventes.NomenclatureMainSupplier

Inégal

Cette opération est destinée à comparer deux opérandes d'inégalité. Par exemple:
Sales.Contractor Sales.NomenclatureMainSupplier

Moins

Cette opération a pour but de vérifier que le premier opérande est inférieur au second. Par exemple:
SalesCurrent.Amount

Suite

Cette opération a pour but de vérifier que le premier opérande est supérieur au second. Par exemple:
SalesCurrent.Total> SalesPast.Amount

Inférieur ou égal

Cette opération a pour but de vérifier que le premier opérande est inférieur ou égal au second. Par exemple:
SalesCurrent.Amount

Plus ou égal

Cette opération a pour but de vérifier que le premier opérande est supérieur ou égal au second. Par exemple:
SalesCurrent.Amount> = SalesPast.Amount

Opération B

Cette opération vérifie la présence d'une valeur dans la liste de valeurs passée. Le résultat de l'opération sera True si la valeur est trouvée, ou False sinon. Par exemple:
Article B (& Article1, & Article2)

L'opération de vérification de l'existence d'une valeur dans un jeu de données

L'opération vérifie l'existence d'une valeur dans l'ensemble de données spécifié. L'ensemble de données de validation doit contenir un champ. Par exemple:
Ventes. Contrepartie aux contreparties

Opération de vérification d'une valeur pour NULL

Cette opération renvoie True si la valeur est NULL. Par exemple:
Sales.Contractor EST NULL

L'opération de vérification d'une valeur pour l'inégalité NULL

Cette opération renvoie True si la valeur n'est pas NULL. Par exemple:
Sales.Contractor N'EST PAS NULL

Opérations logiques

Les opérations logiques prennent des expressions booléennes comme opérandes.

Opération NON

L'opération ne renvoie PAS True si son opérande est False, et False si son opérande est True. Par exemple:
PAS Document.Consignataire = Document.Expéditeur

Opération ET

L'opérateur AND renvoie True si les deux opérandes sont True et False si l'un des opérandes est False. Par exemple:
Document.Consignataire = Document.Expéditeur ET Document.Consignataire = & Contrepartie

OU opération

L'opération OR renvoie True si l'un des opérandes est True et False si les deux opérandes sont False. Par exemple:
Document.Consignataire = Document.Transporteur OU Document.Consignataire = & Contrepartie

Fonctions agrégées

Les fonctions d'agrégat effectuent certaines actions sur un ensemble de données.

Somme

La fonction d'agrégation Sum calcule la somme des valeurs d'expression qui lui sont transmises en tant qu'argument pour tous les enregistrements de détail. Par exemple:
Montant (Sales.SumTurnover)

Quantité

La fonction Count calcule le nombre de valeurs non nulles. Par exemple:
Quantité (Ventes. Entrepreneur)

Nombre de différent

Cette fonction calcule le nombre de valeurs distinctes. Par exemple:
Quantité (Ventes diverses. Entrepreneur)

Maximum

La fonction obtient la valeur maximale. Par exemple:
Maximum (Soldes.Quantité)

Le minimum

La fonction obtient valeur minimum... Par exemple:
Minimum (Soldes.Quantité)

La moyenne

La fonction obtient la moyenne des valeurs non NULL. Par exemple:
Moyenne (Soldes.Montant)

Autres opérations

Opération SÉLECTIONNER

Operation Select est conçu pour sélectionner une valeur parmi plusieurs lorsque certaines conditions sont remplies. Par exemple:
Choix Quand Montant> 1000 Puis Montant Sinon 0 Fin

Règles de comparaison de deux valeurs

Si les types des valeurs comparées diffèrent les uns des autres, la relation entre les valeurs est déterminée en fonction de la priorité des types :
NULL (le plus bas);
booléen ;
Nombre;
Date;
Ligne;
Types de référence

Les relations entre les différents types de référence sont déterminées à partir des numéros de référence des tableaux correspondant à un type particulier.

Si les types de données correspondent, les valeurs sont comparées selon les règles suivantes :
Le type booléen a une valeur TRUE supérieure à la valeur FALSE ;
le type Nombre a les règles de comparaison habituelles pour les nombres ;
le type Date a moins de dates antérieures que postérieures ;
pour le type de chaîne - comparaisons de chaînes conformément aux caractéristiques nationales établies de la base de données ;
les types de référence sont comparés en fonction de leurs valeurs (numéros d'enregistrement, etc.).

Travailler avec des valeurs NULL

Toute opération dans laquelle la valeur de l'un des opérandes est NULL se traduira par NULL.

Il y a des exceptions :
l'opération AND ne renverra NULL que si aucun des opérandes n'est False ;
l'opération OR ne retournera NULL que si aucun des opérandes n'est vrai.

Priorités d'exploitation

Les opérations ont les priorités suivantes (la première ligne a la priorité la plus basse) :
OU;
ET;
NE PAS;
B EST NULL N'EST PAS NULL ;
=, <>, <=, <, >=, >;
Binaire +, Binaire - ;
*, /, %;
Unaire +, Unaire -.

Fonctions du langage d'expression du système de composition de données

Calculer

La fonction Calculer est conçue pour évaluer une expression dans le contexte d'un regroupement. La fonction a les paramètres suivants :
Expression. Tapez Chaîne. Contient une expression calculée ;
Regroupement. Tapez Chaîne. Contient le nom du regroupement dans le contexte duquel l'expression doit être évaluée. Si une chaîne vide est utilisée comme nom de regroupement, le calcul sera effectué dans le contexte du regroupement en cours. Si la ligne GeneralTotal est utilisée comme nom de regroupement, le calcul sera effectué dans le contexte du total général. Dans le cas contraire, le calcul sera effectué dans le contexte du regroupement parent du même nom. Par exemple:
Montant (Sales.SumTurnover) / Calculer ("Montant (Sales.SumTurnover)", "TotalTotal")

V cet exemple par conséquent, vous obtenez le rapport entre le montant du champ "Sales.SumTurnover" de l'enregistrement de regroupement et la somme du même champ dans l'ensemble de la mise en page.

Niveau

La fonction est destinée à obtenir le niveau d'enregistrement actuel.

Exemple:
Niveau()

L'ordre des numéros

Obtenez le prochain numéro de séquence.

Exemple:
L'ordre des numéros ()

NuméroOrdreDansGroupe

Renvoie le numéro séquentiel suivant dans le regroupement actuel.

Exemple:
NumberOrderInGrouping ()

Format

Récupère la chaîne formatée de la valeur passée.

La chaîne de format est définie conformément à la chaîne de format 1C : Entreprise.

Paramètres:
Sens;
Chaîne de formatage.

Exemple:
Format (Factures.SumDoc, "NPT = 2")

Début de période

Paramètres:

    • Minute;
    • Jour;
    • Une semaine;
    • Mois;
    • Trimestre;
    • Décennie;
    • Une demi-année.

Exemple:
Début de période (DateHeure (2002, 10, 12, 10, 15, 34), "Mois")

Résultat:

01.10.2002 0:00:00

Fin de période

La fonction est conçue pour extraire une date spécifique d'une date donnée.

Paramètres:

  • Date. Tapez Date. Date spécifiée ;
  • Type de période. Tapez Chaîne. Contient l'une des valeurs :
    • Minute;
    • Jour;
    • Une semaine;
    • Mois;
    • Trimestre;
    • Décennie;
    • Une demi-année.

Exemple:
EndPeriod (DateTime (2002, 10, 12, 10, 15, 34), "Semaine")

Résultat:

13.10.2002 23:59:59

Ajouter à la date

La fonction est destinée à ajouter une certaine valeur à la date.

Paramètres:

  • Type de grossissement. Tapez Chaîne. Contient l'une des valeurs :
    • Minute;
    • Jour;
    • Une semaine;
    • Mois;
    • Trimestre;
    • Décennie;
    • Une demi-année.
Valeur - de combien la date doit être augmentée. Tapez le numéro. La partie fractionnaire est ignorée.

Exemple:
Ajouter à la date (DateHeure (2002, 10, 12, 10, 15, 34), "Mois", 1)

Résultat:

12.11.2002 10:15:34

Différence de date

La fonction est conçue pour obtenir la différence entre deux dates.

Paramètres:

  • Expression. Tapez Date. Date d'origine ;
  • Expression. Tapez Date. Date soustraite ;
  • Type de différence. Tapez Chaîne. Contient l'une des valeurs :
    • Seconde;
    • Minute;
    • Jour;
    • Mois;
    • Trimestre;

Exemple:
DIFFERENCE (DATE HEURE (2002, 10, 12, 10, 15, 34),
DATE (2002, 10, 14, 9, 18, 06), "JOUR")

Résultat:

Sous-chaîne

Cette fonction est conçue pour extraire une sous-chaîne d'une chaîne.

Paramètres:

  • Ligne. Tapez Chaîne. La chaîne à partir de laquelle extraire la sous-chaîne ;
  • Position. Tapez le numéro. La position du caractère à partir duquel la sous-chaîne à extraire de la chaîne commence ;
  • Longueur. Tapez le numéro. La longueur de la sous-chaîne à sélectionner.

Exemple:
SUBSTRAT (Entrepreneurs.Adresse, 1, 4)

Longueur de la ligne

La fonction est conçue pour déterminer la longueur d'une chaîne.

Paramètre:
Ligne. Tapez Chaîne. La chaîne à spécifier en longueur.

Exemple:
Chaîne (Comptes.Adresse)

Cette fonction est destinée à extraire une année d'une valeur de type Date.

Paramètre:
Date. Tapez Date. La date à laquelle l'année est déterminée.

ANNÉE (Date de la facture)

Trimestre

Cette fonction est destinée à extraire un numéro de trimestre d'une valeur de type Date. Le numéro du trimestre est normalement compris entre 1 et 4.

Paramètre
Date. Tapez Date. La date à laquelle le trimestre est déterminé

TRIMESTRE (Date de Consignation)

Mois

Cette fonction est destinée à extraire le numéro du mois d'une valeur de type Date. Le numéro du mois est normalement compris entre 1 et 12.
Date. Tapez Date. La date à laquelle le mois est déterminé.
MOIS (Date de la facture)

Jour de l'année

Cette fonction est conçue pour obtenir le jour de l'année à partir d'une valeur de type Date. Le jour de l'année est normalement compris entre 1 et 365 (366).
Date. Tapez Date. La date à laquelle le jour de l'année est déterminé.
JOUR DE L'ANNÉE (Date de la facture)

Jour

Cette fonction est destinée à récupérer le jour du mois à partir d'une valeur de type Date. Le jour du mois est normalement compris entre 1 et 31.
Date. Tapez Date. La date à laquelle le jour du mois est déterminé.
JOUR (Date de la facture)

Une semaine

Cette fonction est destinée à récupérer le numéro de la semaine de l'année à partir d'une valeur de type Date. Les semaines de l'année sont numérotées à partir de 1.
Date. Tapez Date. La date à laquelle les numéros de semaine sont déterminés.
SEMAINE (Date de la facture)

Jour de la semaine

Cette fonction est destinée à récupérer le jour de la semaine à partir d'une valeur de type Date. Le jour de la semaine est normalement compris entre 1 (lundi) et 7 (dimanche).
Date. Tapez Date. La date à laquelle le jour de la semaine est déterminé.
JOUR DE LA SEMAINE (Date de la facture)

Cette fonction est conçue pour obtenir l'heure du jour à partir d'une valeur de type Date. L'heure de la journée varie de 0 à 23.
Date. Tapez Date. La date à laquelle l'heure du jour est déterminée.
HEURE (Date de Consignation)

Minute

Cette fonction est destinée à récupérer la minute d'une heure à partir d'une valeur de type Date. La minute de l'heure va de 0 à 59.
Date. Tapez Date. La date à laquelle la minute de l'heure est déterminée.
MINUTE (Date de la facture)

Seconde

Cette fonction est destinée à obtenir une seconde d'une minute à partir d'une valeur de type Date. La seconde d'une minute va de 0 à 59.
Date. Tapez Date. La date à laquelle les secondes de la minute sont déterminées.
DEUXIÈME (Date de la facture)

Express

Cette fonction est destinée à extraire un type d'une expression pouvant contenir un type complexe. Si l'expression contient un type différent du type requis, une valeur NULL sera renvoyée.

Paramètres:
L'expression à convertir ;
Indication de type. Tapez Chaîne. Contient une chaîne de type. Par exemple, "Numéro", "Chaîne", etc. Outre les types primitifs chaîne donnée peut contenir le nom de la table. Dans ce cas, une tentative sera faite pour exprimer une référence à la table spécifiée.

Exemple:
Express (Data.Props1, "Nombre (10.3)")

OuiNull

Cette fonction renvoie la valeur du deuxième paramètre si la valeur du premier paramètre est NULL.

Sinon, la valeur du premier paramètre sera retournée.

Exemple:
OuiNULL (Montant (Sales.SumTurnover), 0)

Fonctions communes des modules

Une expression de moteur de composition de données peut contenir des appels à des fonctions de modules de configuration communs globaux. Aucune syntaxe supplémentaire n'est requise pour appeler de telles fonctions.

Exemple:
Nom abrégé (Documents.Link, Documents.Date, Documents.Number)

Dans cet exemple, la fonction "AbbreviatedName" sera appelée depuis le module de configuration générale.

A noter que l'utilisation des fonctions des modules communs n'est autorisée que lorsque le paramètre correspondant du processeur de composition de données est spécifié.

De plus, les fonctions des modules communs ne peuvent pas être utilisées dans les expressions de champ personnalisées.

Php? Http : //wiki.kint.ru/index.php/Data_System_Expression_Language_ (1Cv82) # .D0.9A.D0.BE.D0.BD.D0.B5.D1.86.D0.9F.D0.B5. D1.80.D0.B8.D0.BE.D0.B4.D0.B0

Forum ukrainien 1C : tout sur 1C 8.3, 1C 8.2, 1C 8.1, 1C 8.0, 1C 7.7
http://site

Attention! Il s'agit d'une version d'introduction de la leçon, dont le matériel peut être incomplet.

Connectez-vous en tant qu'étudiant

Connectez-vous en tant qu'élève pour accéder au matériel scolaire

Langage de programmation interne 1C 8.3 pour les programmeurs novices : expressions logiques simples en 1C

Dans la dernière leçon, nous avons appris à donner des noms et à saisir leurs valeurs auprès de l'utilisateur.

Gagnez en force et en patience. Les leçons n° 5 et n° 6 seront difficiles, mais très importantes pour une meilleure compréhension de la programmation en 1C. Par conséquent, si au moins quelque chose reste incompréhensible ou non divulgué - relisez, réfléchissez, posez des questions.

Expressions booléennes simples

Aujourd'hui, aux types de données déjà étudiés (chaîne, nombre et date), nous en ajouterons un de plus - logique un type. Il ne peut prendre que deux valeurs : Vrai ou Mensonge.

valeur booléenne ( Vrai ou Mensonge) est le résultat d'une expression logique.

Une expression booléenne est une expression construite à l'aide d'opérations de comparaison. Vous pouvez comparer des nombres, des dates, des chaînes et d'autres données. Vous lisez une version d'introduction de la leçon, des leçons complètes sont trouvées. On peut dire d'une expression logique qu'elle est vraie ( Vrai) ou incorrect ( Mensonge).

Les opérations de comparaison sont les suivantes :

Je pense que la signification de chacune des opérations est intuitivement claire.

Lisez, par exemple, comme ceci :

  • 1 = 1 ("un est un").
  • 4 <>5 ("quatre n'est pas égal à cinq")
  • 3> 1 ("trois c'est plus qu'un").

J'attire votre attention sur le fait que les trois exemples d'expressions logiques énumérés prennent la valeur Vrai puisqu'ils sont tous corrects.

Prenons un exemple :

Numéro de tâche 14. Spécifiez pour chaque expression booléenne son résultat - Vrai ou Mensonge.

  1. Vénus = Jupiter
  2. "Vénus"<>"Jupiter"
  3. 123 = 321
  4. 123 < 321
  5. 123 <= 321
  6. 123 <= 123
  7. "20000101" <> "20140101"
  8. "20000101" = "20000101"
  9. "20140101" > "20120101"
  10. 25 + 25 = 50
  11. 2 * (10 + 10) > 50
  12. " Youri " + " Gagarine " = " Youri Gagarine "

Essayez de répondre vous-même à toutes les questions. Vous lisez une version d'introduction de la leçon, des leçons complètes sont trouvées. Consultez ensuite les réponses ci-dessous et essayez de déterminer si vous avez fait une erreur quelque part.

  1. "Vénus" = "Jupiter" ( Mensonge, les chaînes ne sont pas égales, mais l'expression indique qu'elles sont égales).
  2. "Vénus"<>"Jupiter" ( Vrai, les chaînes ne sont pas égales les unes aux autres, comme indiqué dans l'expression).
  3. 123 = 321 (Mensonge, puisque les nombres ne sont pas égaux les uns aux autres, mais l'expression indique qu'ils sont égaux).
  4. 123 < 321 (Vrai, puisque 123 est inférieur à 321, comme le dit l'expression).
  5. 123 <= 321 (Vrai, puisque 123 est inférieur à 321, et cette affirmation est vraie si le nombre de gauche est inférieur ou égal à celui de droite).
  6. 123 <= 123 (Vrai, puisque 123 est égal à 123, et cette affirmation est vraie si le nombre de gauche est inférieur ou égal à celui de droite).
  7. "20000101" <> "20140101" (Vrai, puisque la date de gauche 01/01/2000 n'est pas égale au 01/01/2014, comme indiqué dans l'expression).
  8. "20000101" = "20000101" (Vrai, puisque la date de gauche 01/01/2000 est égale au 01/01/2000, comme indiqué dans l'expression).
  9. "20140101" > "20120101" (Vrai, puisque le 1er janvier 2014 est supérieur au 1er janvier 2012, comme indiqué dans l'expression).
  10. 25 + 25 = 50 (Vrai, puisque 25 plus 25 égalent bien cinquante, comme le dit l'expression).
  11. 2 * (10 + 10) > 50 (Mensonge, puisque le résultat de l'expression de gauche est 40 et que 40 est inférieur à 50, bien que l'énoncé dise le contraire).
  12. " Youri " + " Gagarine " = " Youri Gagarine " ( Vrai, puisque la somme des lignes « Youri » et « Gagarine » forme une seule ligne « Youri Gagarine », qui est égale à la ligne de droite, comme indiqué dans l'expression).

Faisons en sorte que ça comptel'ordinateur

Mais que considérons-nous nous-mêmes comme « vrai » ou « faux » ? Après tout, nous avons un ordinateur à portée de main ! Confions-lui cette tâche et vérifions-nous en même temps.

Par exemple, vérifions l'expression 2 * (10 + 10)> 50.
Pour ce faire, nous écrirons le programme suivant :

Rapport (2 * (10 + 10)> 50);

Si nous l'exécutons, l'ordinateur renverra "Non", ce qui signifie - le résultat est Mensonge.

Comment a-t-il calculé cette expression ?

  1. L'ordinateur a vu la commande Rapport.
  2. J'ai regardé quel paramètre nous passons à cette commande.
  3. J'ai vu que l'expression booléenne 2 * (10 + 10)> 50 était spécifiée en paramètre.
  4. A commencé à calculer le résultat d'une expression logique.
  5. Vu que l'expression se compose du côté gauche 2 * (10 + 10), du côté droit 50 et d'un signe plus grand entre les deux.
  6. J'ai compté le résultat sur le côté gauche et j'ai trouvé qu'il était de quarante.
  7. J'ai regardé à nouveau l'expression, seulement sous une forme simplifiée 40> 50, et puisque 40, bien sûr, est inférieur à 50, il a imprimé "Non".

Tâche numéro 15.Évaluez tous les exemples d'expressions booléennes de l'exercice précédent sur l'ordinateur.

Par exemple, l'expression Vénus = Jupiter, dont la valeur, comme nous l'avons découvert, est Mensonge.

Rapport ("Vénus" = "Jupiter");

Au démarrage, l'ordinateur affiche la valeur "Non", ce qui signifie : le résultat est vraiment égal Mensonge et nous l'avons parfaitement compris nous-mêmes.

Solution de référence. D'abord, nous écrivons le code nous-mêmes, le vérifions sur un ordinateur (comme tous les exemples de programmes des leçons), ensuite seulement nous vérifions

Le langage de requête dans 1C 8 est un analogue simplifié du "langage de programmation structuré" bien connu (comme on l'appelle souvent, SQL). Mais dans 1C, il est utilisé uniquement pour lire des données, il est utilisé pour modifier des données modèle d'objet Les données.

Une autre différence intéressante est la syntaxe russe. Bien que, en fait, vous puissiez utiliser des constructions en anglais.

Exemple de requête :

SÉLECTIONNER
Banques. Nom,
Banques.CorrCompte
À PARTIR DE
Annuaire Banques AS Banques

Cette demande nous permettra de voir les informations sur le nom et le compte correspondant de toutes les banques existant dans la base de données.

Le langage de requête est le moyen le plus simple et le plus efficace pour obtenir des informations. Comme vous pouvez le voir dans l'exemple ci-dessus, dans le langage de requête, vous devez faire appel avec les noms des métadonnées (il s'agit d'une liste d'objets système qui composent la configuration, c'est-à-dire des répertoires, des documents, des registres, etc.).

Description des constructions du langage de requête

Structure de la requête

Pour obtenir les données, il suffit d'utiliser les constructions "SELECT" (select) et "FROM" (from). La requête la plus simple ressemble à ceci :

SELECT * FROM Répertoires.Nomenclature

Où "*" signifie la sélection de tous les champs de la table, et References.Nomenclature est le nom de la table dans la base de données.

Regardons un exemple plus complexe et général :

SÉLECTIONNER
<ИмяПоля1>COMMENT<ПредставлениеПоля1>,
Somme(<ИмяПоля2>) COMMENT<ПредставлениеПоля2>
À PARTIR DE
<ИмяТаблицы1>COMMENT<ПредставлениеТаблицы1>
<ТипСоединения>COMPOSÉ<ИмяТаблицы2>COMMENT<ПредставлениеТаблицы2>
AU<УсловиеСоединениеТаблиц>


<УсловиеОтбораДанных>

CHARGER PAR
<ИмяПоля1>

TRIER PAR
<ИмяПоля1>

RÉSULTATS
<ИмяПоля2>
AU
<ИмяПоля1>

Dans cette requête, nous sélectionnons les données des champs "FieldName1" et "FieldName1" des tables "TableName1" et "TableName", affectons des synonymes aux champs à l'aide de l'opérateur "AS", les joignons selon une certaine "TableCondition" état.

À partir des données reçues, nous sélectionnons uniquement les données qui répondent à la condition de "WHERE" "DataFeedback Condition". Ensuite, nous regroupons la requête par le champ "FieldName1", tout en additionnant "FieldName2". Nous créons des totaux pour le champ "FieldNameField1" et le dernier champ "FieldName2".

La dernière étape consiste à trier la requête à l'aide de la construction ORDER BY.

Constructions générales

Considérons les constructions générales du langage de requête 1C 8.2.

PREMIÈREm

Passant par cet opérateur vous pouvez obtenir n le nombre de premiers enregistrements. L'ordre des entrées est déterminé par l'ordre dans la demande.

SÉLECTIONNER EN PREMIER 100
Banques. Nom,
Banques Code AS BIK
À PARTIR DE
Annuaire Banques AS Banques
TRIER PAR
Banques.

La demande recevra les 100 premières entrées du répertoire "Banques", classées par ordre alphabétique.

PERMIS

Cette conception est pertinente pour travailler avec un mécanisme. L'essence du mécanisme est de restreindre la lecture (et d'autres actions) aux utilisateurs pour des enregistrements spécifiques dans la table de base de données, et non la table dans son ensemble.

Si un utilisateur essaie de lire des enregistrements qui lui sont inaccessibles avec une requête, il recevra un message d'erreur. Pour éviter cela, vous devez utiliser la construction "ALLOWED", c'est-à-dire que la requête ne lira que les enregistrements autorisés pour elle.

SÉLECTIONNER AUTORISÉ
Informations supplémentaires Store.Link
À PARTIR DE
Référence.Stockage d'informations supplémentaires

DIVERS

L'utilisation de "DIFFERENT" vous permettra d'exclure les chaînes en double de la saisie du résultat de la requête 1C. La duplication signifie que tous les champs de la demande correspondent.

SÉLECTIONNER EN PREMIER 100
Banques. Nom,
Banques Code AS BIK
À PARTIR DE
Annuaire Banques AS Banques

Table vide

Cette construction est rarement utilisée pour combiner des requêtes. Lors de la jointure, il peut être nécessaire de spécifier une table imbriquée vide dans l'une des tables. L'opérateur "EmptyTable" est juste approprié pour cela.

Exemple de l'aide 1C 8 :

SELECT Reference.Number, BLANK TABLE.(Nom, Tov, Qty) AS Composition
DE Document.Dépense
COMBINEZ TOUT
SELECT Reference.Number, Composition.(LineNumber, Item, Quantity)
FROM Document.Facture Document.Facture.Content.*

EST NULL

Une fonctionnalité très utile qui évite de nombreuses erreurs. YesNULL() vous permet de remplacer la valeur NULL par celle souhaitée. Il est très souvent utilisé dans les tests de présence d'une valeur dans les tables jointes, par exemple :

SÉLECTIONNER
NomenclatureRéf.Réf.
Il y a NULL (Solde de l'article. Solde de la quantité, 0) AS Solde de la quantité
À PARTIR DE


Vous pouvez l'utiliser d'une autre manière. Par exemple, si pour chaque ligne on ne sait pas dans quelle table la valeur existe :

EST NULL (InvoiceInvoiceReceived.Date, InvoiceInvoiced.Date)

AS est un opérateur qui nous permet d'attribuer un nom (synonyme) à une table ou à un champ. Nous avons vu un exemple d'utilisation ci-dessus.

Ces constructions sont très similaires - elles vous permettent d'obtenir une représentation sous forme de chaîne de la valeur souhaitée. La seule différence est que REPRESENTATION convertit toutes les valeurs en un type de chaîne et REFERENCE REPRESENTATION ne convertit que les valeurs de référence. Il est recommandé d'utiliser la REPRÉSENTATION DE RÉFÉRENCE dans les requêtes du système de composition de données pour l'optimisation, à moins, bien sûr, que le champ de données de référence ne soit prévu pour être utilisé dans les filtres.

SÉLECTIONNER
Voir (Lien), // ligne, par exemple "Rapport préalable n°123 du 10/10/2015
Représentation (marque de suppression) AS Texte de marque de suppression, // chaîne, "Oui" ou "Non"
ReferenceRepresentation (Deletion Mark) AS Deletion Mark Boolean // Boolean, True ou False
À PARTIR DE
Document.Rapport préalable

EXPRESS

Express vous permet de convertir les valeurs des champs dans le type de données souhaité. Vous pouvez convertir une valeur en type primitif ou en type référence.

Express pour le type de référence est utilisé pour restreindre les types de données demandés dans les champs d'un type complexe, souvent utilisé pour optimiser les performances du système. Exemple:

EXPRESS (Cost.Subconto1 Table AS A Reference.Cost Articles) .ActivityTypeFor Tax Cost Accounting

Pour les types primitifs, cette fonction est souvent utilisée pour limiter le nombre de caractères dans les champs de longueur illimitée (ces champs ne peuvent pas être comparés). Pour éviter l'erreur " Paramètres non valides dans l'opération de comparaison. Vous ne pouvez pas comparer les champs
longueur illimitée et champs de types incompatibles
", Il est nécessaire d'exprimer ces champs comme suit :

EXPRESS (Commentaire AS Ligne (150))

DIFFÉRENCE

Obtenez gratuitement 267 didacticiels vidéo 1C :

Exemple d'utilisation de IS NULL dans une requête 1C :

CHOISISSEZ PARMI
Spr
LEFT JOIN Accumulation Register.ProductsIn Warehouses.Left AS RemainingGoods
Software NomenclatureRef.Ref = ImplementedCommentsComponentsRemains.Nomenclature
OU EST LE SOLDE DE LA MARCHANDISE.Quantité Le solde EST NULL

Vous pouvez définir le type de données dans une requête comme suit : à l'aide des fonctions TYPE () et TYPE (), ou à l'aide opérateur logique LIEN. Les deux fonctions sont similaires.

Valeurs prédéfinies

En plus d'utiliser les paramètres transmis dans les requêtes dans le langage de requête 1C, vous pouvez utiliser des valeurs prédéfinies ou. Par exemple, des énumérations, des recherches prédéfinies, des plans comptables, etc. Pour cela, la construction "Valeur ()" est utilisée.

Exemple d'utilisation :

O Nomenclature.NomenclatureType = Valeur (Directory.NomenclatureType.Product)

O Contreparties.Type d'informations de contact = Valeur (Énumération.Informations de contact.Type.Téléphone)

O Soldes des comptes.Compte = Valeur (Plan de comptes. Autosuffisant.Perte de bénéfices)

Connexions

Il existe 4 types de connexions : À GAUCHE, À DROITE, COMPLET, INTERNE.

JOINDRE À GAUCHE et À DROITE

Les jointures sont utilisées pour lier deux tables selon une condition spécifique. Fonctionnalité à ARTICULATION GAUCHE en ce que nous prenons la première table spécifiée dans son intégralité et lions la deuxième table par condition. Les champs de la deuxième table qui n'ont pas pu être liés par la condition sont remplis avec la valeur NUL.

Par exemple:

Il renverra l'intégralité du tableau des Contreparties et ne remplira le champ « Banque » qu'aux endroits où la condition « Contreparties.Nom = Banques.Nom » sera remplie. Si la condition n'est pas remplie, le champ Banque sera défini NUL.

ARTICULATION DROITE en langage 1C absolument pareil Connexion GAUCHE, à l'exception d'une différence - dans BONNE CONNEXION La table « principale » est la deuxième, pas la première.

CONNEXION COMPLÈTE

CONNEXION COMPLÈTE diffère de la gauche et de la droite en ce qu'il affiche tous les enregistrements de deux tables, ne joint que ceux qu'il peut joindre par condition.

Par exemple:

À PARTIR DE

CONNEXION COMPLÈTE
Annuaire Banques AS Banques

AU

Le langage de requête ne renverra les deux tables dans leur intégralité que si la condition de jointure des enregistrements est remplie. Contrairement à la jointure gauche/droite, il est possible que des valeurs NULL apparaissent dans deux champs.

CONNEXION INTERNE

CONNEXION INTERNE diffère de la version complète en ce qu'elle n'affiche que les enregistrements qui pourraient être connectés par la condition spécifiée.

Par exemple:

À PARTIR DE
Annuaire Entrepreneurs AS Clients

CONNEXION INTERNE
Annuaire Banques AS Banques

AU
Clients.Name = Banks.Name

Cette demande ne retournera que les lignes dans lesquelles la banque et la contrepartie ont le même nom.

Les associations

Les constructions COMBINE et COMBINE ALL combinent deux résultats en un seul. Celles. le résultat de l'exécution de deux sera "fusionné" en un, commun.

C'est-à-dire que le système fonctionne de la même manière que d'habitude, uniquement pour une table temporaire.

Comment utiliser le LOGICIEL INDEX

Cependant, il y a un point à garder à l'esprit. La création d'un index sur une table temporaire prend également du temps. Par conséquent, il est conseillé d'utiliser la construction "" uniquement si l'on sait avec certitude qu'il n'y aura pas 1-2 enregistrements dans la table temporaire. Sinon, l'effet peut être inverse - les performances des champs indexés ne compensent pas le temps de construction de l'index.

SÉLECTIONNER
Taux de changeSliceLast.Currency AS Currency,
Taux de changeSliceLast.Cours
Taux de change POST
À PARTIR DE
Informations Register.Currency Rates.SliceLast (& Période,) AS Currency RatesSliceLast
INDEX PAR
Devise
;
SÉLECTIONNER
Des prix
TarifsNomenclatures .Prix,
TarifsNomenclatures.Monnaie,
Taux de change.
À PARTIR DE
Informations Register.NomenclaturePrices.SliceLast (& Période,
Nomenclature B (& Nomenclature) ET PriceType = & PriceType) AS Prix
UNION GAUCHE Taux de change AS Taux de change
PAR TauxNomenclature.Devise = TauxDevise.Devise

Regroupement

Le langage de requête 1C vous permet d'utiliser des fonctions d'agrégation spéciales lors du regroupement des résultats de requête. Le regroupement peut également être utilisé sans fonctions d'agrégation pour « éliminer » les doublons.

Les fonctions suivantes sont disponibles :

Montant, Nombre, Nombre de différent, Maximum, Minimum, Moyenne.

Exemple 1:

SÉLECTIONNER
Vente de biens, services, biens, nomenclature,
MONTANT (Vente de Biens, Services, Biens.Quantité) AS Quantité,
MONTANT (Vente de BiensServicesMarchandises.Montant) AS Montant
À PARTIR DE

CHARGER PAR
Réalisation de BiensServicesMarchandises.Nomenclature

La demande reçoit toutes les lignes avec des marchandises et les résume par quantité et montants dans le contexte de l'article.

Exemple n°2

SÉLECTIONNER
Banques. Code,
QUANTITE (DIFFERENT Banks.Link) AS QuantityDoubles
À PARTIR DE
Annuaire Banques AS Banques
CHARGER PAR
Code des banques

Cet exemple affichera une liste de BIC dans le répertoire "Banques" et montrera combien de doublons existent pour chacun d'eux.

Résultats

Les totaux sont un moyen d'obtenir des données à partir d'un système hiérarchique. Pour les champs de synthèse, des fonctions d'agrégat peuvent être utilisées, comme pour les regroupements.

L'une des manières les plus courantes d'utiliser les totaux dans la pratique consiste à annuler des lots de marchandises.

SÉLECTIONNER




À PARTIR DE
Document.Réalisation deBiensServices.Biens COMME Vente deBiensServicesBiens
TRIER PAR

RÉSULTATS
SOMME (Quantité),
SOMME (Montant)
AU
Nomenclature

Le résultat de la requête sera la hiérarchie suivante :

Résumé général

Si vous voulez obtenir des totaux pour tous les "totaux", utilisez l'opérateur "GENERAL".

SÉLECTIONNER
Réalisation de BiensServicesMarchandises. Nomenclature AS Nomenclature,
Réalisation du document GoodsServicesGoods.Link AS,
Réalisation de biens, services, biens Quantité AS Quantité,
Vente de BiensServicesMarchandises.Montant AS Montant
À PARTIR DE
Document.Réalisation deBiensServices.Biens COMME Vente deBiensServicesBiens
TRIER PAR
Mise en œuvre de GoodsServicesGoods.Link.Date
RÉSULTATS
SOMME (Quantité),
SOMME (Montant)
AU
SONT COMMUNS,
Nomenclature

À la suite de l'exécution de la requête, nous obtenons le résultat suivant :

Dans lequel le 1er niveau de regroupement est l'agrégation de tous les champs obligatoires.

Commande

L'opérateur ORDER BY est utilisé pour trier le résultat de la requête.

Le tri des types primitifs (chaîne, nombre, booléen) suit les règles habituelles. Pour les champs de type référence, le tri se fait par la représentation interne du lien (identifiant unique), et non par code ou par la représentation du lien.

SÉLECTIONNER

À PARTIR DE
Référence.Nomenclature AS Nomenclature
TRIER PAR
Nom

La requête affichera une liste des noms du catalogue des stocks, triés par ordre alphabétique.

Commande automatique

Le résultat d'une requête sans tri est un ensemble de lignes présenté de manière chaotique. Les développeurs de la plate-forme 1C ne garantissent pas la sortie de chaînes dans le même ordre lors de l'exécution des mêmes requêtes.

Si vous devez afficher les enregistrements de la table dans un ordre cohérent, vous devez utiliser la construction "Autoorder".

SÉLECTIONNER
Nomenclature Nom AS Nom
À PARTIR DE
Référence.Nomenclature AS Nomenclature
COMMANDE AUTOMATIQUE

Tables virtuelles

Les tables virtuelles dans 1C sont une caractéristique unique du langage de requête 1C, qui ne se trouve pas dans d'autres syntaxes similaires. Table virtuelle - manière rapide obtenir des informations de profil à partir des registres.

Chacun des types de registre possède son propre ensemble de tables virtuelles, qui peuvent différer selon les paramètres du registre.

  • une coupe du premier;
  • une coupe de ce dernier.
  • les restes;
  • révolutions;
  • soldes et chiffres d'affaires.
  • mouvements du subconto;
  • révolutions;
  • RPM Dt Kt ;
  • les restes;
  • soldes et chiffres d'affaires
  • sous-conto.
  • base;
  • données graphiques ;
  • la période de validité effective.

Pour un développeur de solutions, les données sont extraites d'une table (virtuelle), mais en fait, la plate-forme 1C extrait de nombreuses tables, les transformant sous la forme souhaitée.

SÉLECTIONNER
ProduitsEn EntrepôtSoldes et Chiffres d'Affaires.Nomenclature,
ProduitsDans les entrepôtsSoldesEtChiffre d'affaires.QuantitéSolde de début,
MarchandisesEn EntrepôtSoldes et Chiffre d'Affaires.QuantitéChiffre d'Affaires,
MarchandisesDans les entrepôtsSoldesEtChiffre d'affaires.NombreRevenu,
MarchandisesEn EntrepôtSoldes et Chiffre d'Affaires.QuantitéConsommation,
ProduitsDans les entrepôtsSoldesEtChiffre d'affaires.QuantitéSolde final
À PARTIR DE
Registre d'accumulation.MarchandisesDans les entrepôts.Soldes ET Chiffre d'affaires COMME MarchandisesDans les entrepôtsSoldes et Chiffre d'affaires

Une telle requête permet d'obtenir rapidement une grande quantité de données.

Paramètres de table virtuelle

Un aspect très important du travail avec des tables virtuelles est l'utilisation de paramètres. Paramètres de table virtuelle - paramètres spécialisés pour la sélection et le réglage.

Pour de telles tables, il est considéré comme incorrect d'utiliser la sélection dans la construction « WHERE ». Outre le fait que la requête ne devient pas optimale, il est possible de recevoir des données incorrectes.

Un exemple d'utilisation de ces paramètres :

Accumulation Register.ProductsIn Warehouses.RemainsAndTurnovers (& BeginningPeriod, & EndPeriod, Month, Movements And PeriodBorders, Nomenclature = & DesiredNomenclature)

Algorithme des tables virtuelles

Par exemple, la table virtuelle la plus couramment utilisée du type "Résidus" stocke les données de deux tables physiques - les soldes et les mouvements.

Lors de l'utilisation d'une table virtuelle, le système effectue les manipulations suivantes :

  1. Nous obtenons la valeur calculée la plus proche en termes de date et de dimensions dans le tableau des totaux.
  2. « Ajoutez » le montant du tableau des mouvements au montant du tableau des totaux.


De telles actions simples peuvent améliorer considérablement les performances du système dans son ensemble.

Utilisation du générateur de requêtes

Constructeur de requête- un outil intégré au système d'entreprise 1C, qui facilite grandement le développement de requêtes vers la base de données.

Le constructeur de requêtes a une interface assez simple et intuitive. Cependant, examinons de plus près l'utilisation du constructeur de requête.

Le constructeur de texte de requête est lancé par le menu contextuel (avec le bouton droit de la souris) au bon endroit dans le code du programme.

Description du constructeur de requête 1C

Examinons de plus près chaque onglet de conception. L'exception est l'onglet Builder, qui est un sujet pour une autre discussion.

Onglet Tables et champs

Cet onglet spécifie la source de données et les champs que vous souhaitez afficher dans le rapport. En effet, les constructions SELECT .. FROM sont décrites ici.

La source peut être une table de base de données physique, une table de registre virtuel, des tables temporaires, des requêtes imbriquées, etc.

Dans le menu contextuel des tables virtuelles, vous pouvez définir les paramètres de la table virtuelle :

Onglet Liens

L'onglet sert à décrire les connexions de plusieurs tables, crée des constructions avec le mot CONNEXION.

Onglet Regroupement

Sur cet onglet, le système vous permet de regrouper et de synthétiser les champs obligatoires du tableau résultat. Décrit l'utilisation des constructions GROUP BY, SUM, MINIMUM, AVERAGE, MAXIMUM, QUANTITY, NUMBER OF DIFFERENT.

Onglet Conditions

Responsable de tout ce qui se passe dans le texte de la requête après la construction WHERE, c'est-à-dire de toutes les conditions imposées aux données reçues.

Onglet Avancé

Languette en outre regorge de toutes sortes de paramètres très importants. Considérons chacune des propriétés.

Regroupement Récupérer des enregistrements:

  • N premier- un paramètre qui ne renvoie que N enregistrements à la requête (opérateur FIRST)
  • Pas de répétition- assure l'unicité des enregistrements reçus (opérateur DIFFERENT)
  • Permis- vous permet de sélectionner uniquement les enregistrements que le système vous permet de sélectionner en tenant compte (construction AUTORISÉE)

Regroupement Type de demande détermine quel type de requête sera : récupérer des données, créer une table temporaire ou détruire une table temporaire.

Ci-dessous il y a un drapeau Bloquer les données reçues pour modification ultérieure... Il vous permet d'activer la possibilité de définir un verrouillage des données, ce qui garantit la sécurité des données à partir du moment où elles sont lues jusqu'à leur modification (pertinent uniquement pour Mode automatique serrures, conception POUR LE CHANGEMENT).

Onglet Unions / Alias

Sur cet onglet du concepteur de requêtes, vous pouvez définir la possibilité de combiner différentes tables et alias (construction COMMENT). Les tableaux sont indiqués à gauche. Si vous placez les drapeaux devant la table, la construction UNION sera utilisée, sinon - UNION ALL (les deux méthodes diffèrent). Le côté droit indique la correspondance des champs dans les différentes tables, si aucune correspondance n'est spécifiée, la requête renverra NULL.

Onglet Commande

Ici, vous spécifiez l'ordre de tri des valeurs (ORDER BY) - descendant (DESCENT) ou ascendant (RETURN).

Il y a aussi un drapeau intéressant - Commande automatique(dans la demande - COMMANDE AUTOMATIQUE). Par défaut, le système 1C affiche les données dans un ordre "chaotique". Si vous définissez cet indicateur, le système triera les données par données internes.

Onglet Requête de package

Dans l'onglet du concepteur de requêtes, vous pouvez en créer de nouveaux et l'utiliser également comme navigation. Dans le texte de la requête, les paquets sont séparés par le symbole « ; » (virgule).

Bouton de requête dans le générateur de requêtes

Dans le coin inférieur gauche du constructeur de requête, il y a un bouton Requête, avec lequel vous pouvez afficher le texte de la requête à tout moment :

Dans cette fenêtre, vous pouvez apporter des ajustements à la demande et l'exécuter.


Utilisation de la console de requête

La console de requêtes est un moyen simple et pratique de déboguer des requêtes complexes et d'obtenir rapidement des informations. Dans cet article, je vais essayer de décrire comment utiliser la console de requête et donner un lien pour télécharger la console de requête.

Regardons de plus près cet outil.

Télécharger la console de requête 1C

Tout d'abord, pour commencer avec la console de requête, vous devez la télécharger quelque part. Les processus sont généralement divisés en deux types - les formes contrôlées et régulières (ou, parfois, elles sont appelées sur 8.1 et 8.2 / 8.3).

J'ai essayé de combiner ces deux vues en un seul traitement - dans le mode de fonctionnement requis, le formulaire requis s'ouvre (en mode contrôlé, la console ne fonctionne qu'en mode épais).

Description de la console de requête 1C

Commençons par regarder la console de requête avec une description du panneau de traitement principal :

Dans l'en-tête de la console de requête, vous pouvez voir le temps d'exécution de la dernière requête avec une précision de la milliseconde, cela vous permet de comparer différentes constructions en termes de performances.

Le premier groupe de boutons de la barre de commandes est responsable de l'enregistrement des demandes en cours dans fichier externe... C'est très pratique, vous pouvez toujours revenir à l'écriture d'une requête complexe. Ou, par exemple, conserver une liste d'exemples typiques de certaines constructions.

A gauche, dans le champ Requête, vous pouvez créer de nouvelles requêtes et les enregistrer dans une arborescence. Le deuxième groupe de boutons est juste chargé de gérer la liste des demandes. Avec lui, vous pouvez créer, copier, supprimer, déplacer une demande.

  • Exécuterenquête- exécution simple et obtention du résultat
  • Exécuter le package- vous permet de visualiser toutes les demandes intermédiaires dans le lot de demandes
  • Affichage des tables temporaires- permet de voir les résultats renvoyés par les requêtes temporaires dans la table

Paramètres de la requête :

Permet de définir les paramètres actuels de la demande.

Dans la fenêtre des paramètres de requête, ce qui suit est intéressant :

  • Bouton Obtenir de la demande trouve automatiquement tous les paramètres dans la demande pour la commodité du développeur.
  • Drapeau Paramètres uniformes pour toutes les demandes- lorsqu'il est installé, son traitement n'efface pas les paramètres lors du passage d'une requête à une requête dans la liste générale des requêtes.

Définir le paramètre sous forme de liste de valeurs c'est très simple, lorsque vous sélectionnez une valeur de paramètre, appuyez sur le bouton pour effacer la valeur (croix), le système vous proposera de sélectionner un type de données, où vous devez sélectionner « Liste de valeurs » :

Également dans le panneau supérieur, il y a un bouton pour appeler les paramètres de la console de requête :

Ici, vous pouvez spécifier des options pour les requêtes d'enregistrement automatique et des options pour l'exécution d'une requête.

Le texte de la requête est entré dans le champ de requête de la console. Cela peut être fait par une simple suite de tests de requêtes ou en appelant un outil spécial - le concepteur de requêtes.

Le constructeur de requête 1C 8 est appelé depuis menu contextuel (bouton de droite souris) en cliquant sur le champ de saisie :

Aussi dans ce menu il y a de tels fonctions utiles comme effacer ou ajouter des caractères de saut de ligne (« | ») à la demande, ou obtenir le code de la demande sous une forme pratique :

Demande = Nouvelle demande ;
Request.Text = "
| CHOISIR
| Devises.Lien
| DE
| Annuaire Monnaies AS Monnaies ”;
QueryResult = Query.Run ();

Dans le champ inférieur de la console de requête s'affiche le champ résultat de la requête, pour lequel ce traitement a été créé :



De plus, la console de requête, en plus de la liste, peut afficher des données sous forme d'arbre - pour les requêtes contenant des totaux.

Optimisation des requêtes

L'un des points les plus importants pour augmenter la productivité de 1C Enterprise 8.3 est optimisationdemandes... Ce point est également très important lorsque attestation de réussite... Ci-dessous, nous parlerons des raisons typiques du travail sous-optimal des requêtes et des méthodes d'optimisation.

Sélections dans la table virtuelle utilisant la construction WHERE

Il est nécessaire d'appliquer des filtres aux détails de la table virtuelle uniquement via les paramètres BT. En aucun cas, vous ne devez utiliser la construction WHERE pour la sélection dans une table virtuelle, c'est une erreur grossière du point de vue de l'optimisation. Dans le cas d'une sélection utilisant WHERE, en effet, le système recevra TOUS les enregistrements et alors seulement sélectionnera ceux qui sont nécessaires.

À DROITE:

SÉLECTIONNER

À PARTIR DE
Registre d'accumulation.Règlements mutuelsAvecDeponentsOrganizations.Soldes (
,
Organisation = & Organisation
Et Individuel = & Individuel) COMMENT Règlements mutuelsAvec DéposantsOrganisations

PAS CORRECTEMENT:

SÉLECTIONNER
Règlements mutuelsAvecDéposantsOrganisationsSoldes.MontantSolde
À PARTIR DE
Registre d'accumulation. Règlements mutuelsAvec DéposantsOrganisations.Soldes (,) AS Règlements mutuelsAvec DéposantsOrganisationsSoldes

RèglementsAvec DeponentsOrganizationsBalances.Organization = & Organisation
Et Règlements MutuelsAvec DéposantsOrganisationsSoldes.Personnel = & Particuliers

Obtenir la valeur d'un champ de type complexe à travers un point

Lors de la réception de données d'un type composite dans une requête via un point, le système joint avec une jointure à gauche exactement autant de tables qu'il y a de types possibles dans le champ du type composite.

Par exemple, il est hautement indésirable pour l'optimisation de se référer au champ d'enregistrement du registre - le registraire. Le registraire a un type de données composite, comprenant tous les types de documents possibles qui peuvent écrire des données dans le registre.

PAS CORRECTEMENT :

SÉLECTIONNER
Record Set.Recorder.Date,
Ensemble d'enregistrements.Nombre
À PARTIR DE
Registre d'accumulation.ProductsOrganizations AS SetRecords

C'est-à-dire qu'en fait, une telle demande se référera non pas à une table, mais à 22 tables de base de données (ce registre compte 21 types de registrar).

À DROITE:

SÉLECTIONNER
CHOIX
QUAND GoodsOrg.Registrar LINK Document.Réalisation de GoodsServices
ALORS EXPRESS (GoodsOrg.Registrar AS Document.Realization of GoodsServices) .Date
QUAND GoodsOrg.Registrar LINK Document.Arrival of GoodsServices
ALORS EXPRESS (GoodsOrg.Registrar AS Document.Arrival of GoodsServices) .Date
FIN COMME Date,
ProduitsOrg.Quantité
À PARTIR DE
Registre d'accumulation.ProductsOrg

Ou la deuxième option consiste à ajouter de telles informations aux accessoires, par exemple, dans notre cas, ajoutez la date.

À DROITE:

SÉLECTIONNER
ProduitsOrganisations.Date,
ProduitsOrganisations.Nombre
À PARTIR DE
Registre d'accumulation. Biens d'organisations AS Biens d'organisations

Sous-requêtes dans une condition de jointure

Pour l'optimisation, il est inacceptable d'utiliser des sous-requêtes dans des conditions de jointure, cela ralentit considérablement la requête. Il est conseillé d'utiliser VT dans de tels cas. Pour vous connecter, vous devez utiliser uniquement des métadonnées et des objets BT, en les ayant préalablement indexés par les champs de connexion.

PAS CORRECTEMENT :

SÉLECTIONNER …

JOINT GAUCHE (
SÉLECTIONNER DANS LE REGISTRE D'INFORMATIONS.Limites
OÙ …
CHARGER PAR...
) AU …

À DROITE:

SÉLECTIONNER …
Limites du POST
FROM Informations Registre.Limites
OÙ …
CHARGER PAR...
INDEX PAR…;

SÉLECTIONNER …
DU Document.Réalisation de BiensServices
LEFT JOIN Limites
AU …;

Joindre des enregistrements avec des tables virtuelles

Il existe des situations où le système ne fonctionne pas de manière optimale lors de la jonction d'une table virtuelle avec d'autres. Dans ce cas, pour optimiser les performances de la requête, vous pouvez essayer de mettre la table virtuelle dans la table temporaire, en n'oubliant pas d'indexer les champs joints dans la requête de la table temporaire. Cela est dû au fait que les VT sont souvent contenus dans plusieurs tables physiques du SGBD, par conséquent, une sous-requête est faite pour les sélectionner, et le problème est similaire au point précédent.

Utiliser des filtres sur des champs non indexés

L'une des erreurs les plus courantes lors de l'écriture de requêtes est d'utiliser des conditions sur des champs non indexés, cela contredit règles d'optimisation des requêtes. Le SGBD ne peut pas exécuter la requête de manière optimale si un filtrage par champs non indexés est imposé dans la requête. Si une table temporaire est prise, il est également nécessaire d'indexer les champs de jointure.

Il doit y avoir un indice approprié pour chaque condition. Un indice répondant aux exigences suivantes convient :

  1. L'index contient tous les champs répertoriés dans la condition.
  2. Ces champs sont situés au tout début de l'index.
  3. Ces sélections sont consécutives, c'est-à-dire que les valeurs qui ne sont pas impliquées dans la condition de requête ne sont pas "calées" entre elles.

Si le SGBD ne trouve pas les index corrects, la table entière sera analysée - cela aura un impact très négatif sur les performances et peut conduire à un blocage prolongé de l'ensemble des enregistrements.

Utilisation du OU logique dans des conditions

C'est tout, cet article couvrait les bases des aspects d'optimisation des requêtes que tout expert 1C devrait connaître.

Un cours vidéo gratuit très utile sur le développement et l'optimisation de requêtes, recommande fortement pour les débutants et pas seulement !

2022 wisemotors.ru. Comment ça fonctionne. Fer. Exploitation minière. Crypto-monnaie.