Cours d'informatique

Fonctionnalité de la fonction substring(). Fonctionnalité de la fonction substring() Utilisation du générateur de requêtes

Dans le langage de requête 1C:Enterprise, la fonction SOUS-CHAÎNE() V formater SOUS-CHAÎNE(<Исходная строка>, <Начало>, <Длина>) peut être appliqué aux données de chaîne et vous permet de sélectionner un fragment<Исходной строки>, en commençant par le numéro du caractère<Начало>(les caractères d'une ligne sont numérotés à partir de 1) et longueur<Длина>personnages. Le résultat du calcul de la fonction SUBSTRING() a un type chaîne de longueur variable, et la longueur sera considérée comme illimitée si<Исходная строка>a une longueur et des paramètres illimités<Длина>n'est pas une constante ou supérieure à 1024.

Calcul de la fonction SUBSTRING() sur serveur SQL :
Dans la version client-serveur de l'ouvrage, la fonction SUBSTRING() est implémentée à 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() en utilisant des règles complexes en fonction du type et des valeurs de ses paramètres, ainsi qu'en fonction du contexte dans lequel il est utilisé.

Dans la plupart des cas, ces règles n'affectent pas l'exécution d'une requête 1C:Enterprise, cependant, il existe des cas où la longueur maximale de la chaîne de résultat calculée par SQL Server est essentielle pour l'exécution de la requête. 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 entraîner l'arrêt inattendu de la demande.

Par exemple, la demande :
Code 1C v 8.x SÉLECTIONNER
CHOIX

AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
CHOIX
QUAND Type = &LegalAddressIndividual
ALORS SUBSTRING(Représentation, 0, 200)
AUTRE NUL
FIN COMME Présentation1
DEPUIS
TRIER PAR
Performance,
Performance1
se termine anormalement avec le message Erreur SGBD :
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

Cela se produit car Microsoft SQL Server calcule la longueur maximale de la chaîne résultant de l'expression :
Code 1C v 8.x SÉLECTION
QUAND Type = &LegalAddressIndividual
ALORS SUBSTRING(Représentation, 0, 200)
AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
équivaut à 4000 caractères. Par conséquent, la longueur d’un enregistrement composé de deux de ces champs dépasse les 8 000 octets autorisés pour l’opération de tri.

En raison de la particularité décrite de l'exécution de la fonction SUBSTRING() sur SQL Server, 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(). En particulier, l’exemple ci-dessus peut être réécrit comme suit :
Code 1C v 8.x SÉLECTIONNER
CHOIX
QUAND Type = &LegalAddressIndividual
AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
CHOIX
QUAND Type = &LegalAddressIndividual
PUIS EXPRESS(Représentation AS String(200))
AUTRE NUL
FIN COMME Présentation1
DEPUIS
Registre d'information Coordonnées COMMENT Coordonnées
TRIER PAR
Performance,
Performance1

Il existe peu de mécanismes pour travailler avec des chaînes dans les requêtes 1C. Tout d'abord, les lignes peuvent être ajoutées. Deuxièmement, vous pouvez extraire une sous-chaîne d’une chaîne. Troisièmement, les chaînes peuvent être comparées, y compris par motif. C'est probablement tout ce qu'on peut faire avec des cordes.

Ajout de chaîne

Pour ajouter des lignes dans une requête, l'opération « + » est utilisée. Vous ne pouvez ajouter que des chaînes de longueur limitée.

SELECT "Nom : " + Contreparties. Nom AS Colonne 1 FROM Répertoire. Contreparties AS Contreparties WHERE Contreparties. Lien = &Lien

Fonction de sous-chaîne

SOUS-CHAÎNE(<Строка>, <НачальнаяПозиция>, <Длина>)

Un analogue de la fonction Environment() du modèle objet. La fonction Substring() peut être appliquée aux données de chaîne et vous permet de sélectionner un fragment <Строки> , en commençant par le numéro du caractère <НачальнаяПозиция> (les caractères d'une ligne sont numérotés à partir de 1) et longueur <Длина> personnages. Le résultat du calcul de la fonction a un type de chaîne de longueur variable, et la longueur sera considérée comme illimitée si <Строка> a une longueur et des paramètres illimités <Длина> n'est pas une constante ou supérieure à 1024.

Si la longueur de la chaîne est inférieure à celle spécifiée dans le deuxième paramètre, la fonction renverra une chaîne vide.

Attention! L'utilisation de la fonction SUBSTRING() pour convertir des chaînes de longueur illimitée en chaînes de longueur limitée n'est pas recommandée. Au lieu de cela, il est préférable d'utiliser l'opérateur de conversion EXPRESS().

Fonction similaire

Si nous devons nous assurer qu'un attribut de chaîne répond à certains critères, nous le comparons :

SELECT Contreparties. Nom AS Colonne 1 FROM Répertoire. Contreparties AS Contreparties WHERE Contreparties. Nom = "Gazprom"

Mais que se passe-t-il si vous avez besoin d’une comparaison plus subtile ? Pas seulement l’égalité ou l’inégalité, mais la similitude avec un certain modèle ? C’est exactement pour cela que la fonction SIMILAIRE a été créée.

LIKE — Opérateur permettant de vérifier la similarité d'une chaîne avec un modèle. Analogue de LIKE en SQL.

L'opérateur SIMILAR vous permet de comparer la valeur de l'expression spécifiée à sa gauche avec la chaîne de modèle spécifiée à droite. La valeur de l'expression doit être de type chaîne. Si la valeur de l'expression correspond au modèle, le résultat de l'opérateur sera VRAI, sinon il sera FAUX.

Les caractères suivants dans la chaîne modèle sont des caractères de service et ont une signification différente de celle du caractère de chaîne :

  • % (pourcentage) : une séquence contenant un nombre quelconque de caractères arbitraires ;
  • _ (trait de soulignement) : un caractère arbitraire ;
  • […] (un ou plusieurs caractères entre crochets) : tout caractère unique répertorié entre crochets. L'énumération peut contenir des plages, par exemple a-z, signifiant un caractère arbitraire inclus dans la plage, y compris les extrémités de la plage ;
  • [^...] (entre crochets un signe de négation suivi d'un ou plusieurs caractères) : tout caractère unique autre que ceux listés après le signe de négation.

Tout autre symbole signifie lui-même et n'entraîne aucune charge supplémentaire. Si l'un des caractères répertoriés doit être écrit tel quel, il doit alors être précédé de<Спецсимвол>. Moi-même<Спецсимвол>(tout caractère approprié) est défini dans la même instruction après le mot clé SPECIAL CHARACTER.

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

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

Exemple de demande :

CHOISIR
Banques.Nom,
Banques.CorrAccount
DEPUIS
Annuaire.Banques COMMENT Banques

Cette demande nous permettra de voir des 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 d’obtenir des informations. Comme le montre l'exemple ci-dessus, dans le langage de requête, vous devez utiliser des noms de 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 requête

Pour obtenir des données, il suffit d'utiliser les constructions « SELECT » et « 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 Directories.Nomenclature – le nom de la table dans la base de données.

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

CHOISIR
<ИмяПоля1>COMMENT<ПредставлениеПоля1>,
Somme(<ИмяПоля2>) COMMENT<ПредставлениеПоля2>
DEPUIS
<ИмяТаблицы1>COMMENT<ПредставлениеТаблицы1>
<ТипСоединения>COMPOSÉ<ИмяТаблицы2>COMMENT<ПредставлениеТаблицы2>
PAR<УсловиеСоединениеТаблиц>


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

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

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

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

Dans cette requête, nous sélectionnons les données des champs « FieldName1 » et « FieldName1 » dans les tables « TableName1 » et « TableName », attribuons des synonymes aux champs à l'aide de l'opérateur « COMMENT » et les connectons en utilisant une certaine condition « TableConnectionCondition ».

À partir des données reçues, nous sélectionnons uniquement les données qui répondent à la condition de "WHERE" "Condition de sélection des données". Ensuite, nous regroupons la demande par le champ "Field Name1", tout en additionnant "Field Name2". Nous créons des totaux pour le champ « Field Name1 » et le dernier champ « Field Name2 ».

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

Conceptions générales

Regardons les structures générales du langage de requête 1C 8.2.

D'ABORDn

En utilisant cet opérateur, vous pouvez obtenir le nombre n de premiers enregistrements. L'ordre des enregistrements est déterminé par l'ordre dans la requête.

SÉLECTIONNER LES 100 PREMIERS
Banques.Nom,
Banques Code AS BIC
DEPUIS
Annuaire.Banques COMMENT Banques
TRIER PAR
Banques.Nom

La requête recevra les 100 premières entrées du répertoire « Banques », classées par ordre alphabétique.

AUTORISÉ

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

Si un utilisateur tente d'utiliser une requête pour lire des enregistrements qui lui sont inaccessibles, il recevra un message d'erreur. Pour éviter cela, vous devez utiliser la construction « AUTORISÉ », c'est-à-dire que la requête lira uniquement les enregistrements qui lui sont autorisés.

SÉLECTION AUTORISÉE
Référentiel d'informations supplémentaires. Lien
DEPUIS
Répertoire.Référentiel d'informations supplémentaires

DIVERS

L'utilisation de « DIFFÉRENT » empêchera les lignes en double d'entrer dans le résultat de la requête 1C. La duplication signifie que tous les champs de demande correspondent.

SÉLECTIONNER LES 100 PREMIERS
Banques.Nom,
Banques Code AS BIC
DEPUIS
Annuaire.Banques COMMENT Banques

Table vide

Cette construction est très rarement utilisée pour combiner des requêtes. Lors de la jointure, vous devrez peut-être spécifier une table imbriquée vide dans l'une des tables. L'opérateur "EmptyTable" est parfait pour cela.

Exemple de l'aide 1C 8 :

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.*

EST NUL

Une fonctionnalité très utile qui permet d’éviter de nombreuses erreurs. YesNULL() vous permet de remplacer la valeur NULL par celle souhaitée. Très souvent utilisé pour vérifier la présence d'une valeur dans des tables jointes, par exemple :

CHOISIR
Lien de référence de la nomenclature,
IsNULL(Item Remaining.QuantityRemaining,0) AS QuantitéRemaining
DEPUIS


Peut être utilisé d'autres manières. Par exemple, si pour chaque ligne on ne sait pas dans quelle table la valeur existe :

ISNULL(InvoiceReceived.Date, InvoiceIssued.Date)

COMMENT 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 type chaîne, tandis que REPRESENTATIONREF convertit uniquement 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 à des fins d'optimisation, à moins, bien sûr, que le champ de données de référence ne soit prévu pour être utilisé dans les sélections.

CHOISIR
View(Link), //string, par exemple « Rapport avancé n°123 du 10/10/2015
View(DeletionMark) AS DeleteMarkText, //string, « Oui » ou « Non »
ViewReferences(DeletionMark) AS DeleteMarkBoolean //booléen, True ou False
DEPUIS
Document.Rapport avancé

EXPRIMER

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

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

EXPRESS (TableCost.Subconto1 AS Directory.Cost Items).Type d'activitéPourTaxAccountingCosts

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

EXPRESS(Commentaire AS Ligne(150))

DIFFÉRENCEDATE

Obtenez 267 leçons vidéo sur 1C gratuitement :

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

CHOISISSEZ PARMI
Réf
CONNEXION GAUCHE RegisterAccumulations.ProductsInWarehouses.Remaining AS Produit Restant
Nomenclature du logicielRef.Link = Marchandises venduesCommitteesRemains.Nomenclature
OÙ PAS de produits restants. La quantité restante est NULL

Le type de données dans une requête peut être déterminé à l'aide des fonctions TYPE() et VALUETYPE(), ou à l'aide de l'opérateur logique REFERENCE. Les deux fonctions sont similaires.

Valeurs prédéfinies

En plus d'utiliser les paramètres transmis dans les requêtes du langage de requête 1C, vous pouvez utiliser des valeurs prédéfinies ou . Par exemple, les virements, les répertoires prédéfinis, les plans comptables… Pour cela, la construction « Value() » est utilisée.

Exemple d'utilisation :

OÙ Nomenclature.Type de Nomenclature = Valeur(Répertoire.Types de Nomenclature.Produit)

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

OÙ Soldes des comptes.Compte comptable = Valeur (Plan comptable.Profit.ProfitsLoss)

Connexions

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

CONNEXION GAUCHE et DROITE

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

Par exemple:

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

RIGHT JOIN en langage 1C absolument similaire Connexion GAUCHE, à l'exception d'une différence - dans DROIT DE CONNEXION La table « principale » est la deuxième, pas la première.

CONNEXION COMPLÈTE

CONNEXION COMPLÈTE diffère de gauche et de droite en ce sens qu'il affiche tous les enregistrements de deux tables et connecte uniquement ceux qu'il peut connecter par condition.

Par exemple:

DEPUIS

CONNEXION COMPLÈTE
Annuaire.Banques COMMENT Banques

PAR

Le langage de requête renverra complètement les deux tables uniquement si la condition de jointure des enregistrements est remplie. Contrairement à une jointure gauche/droite, il est possible que NULL apparaisse dans deux champs.

JOINTURE INTERNE

JOINTURE INTERNE diffère du modèle complet en ce sens qu'il affiche uniquement les enregistrements qui pourraient être connectés selon une condition donnée.

Par exemple:

DEPUIS
Annuaire Contreparties AS Clients

JOINTURE INTERNE
Annuaire.Banques COMMENT Banques

PAR
Clients.Nom = Banques.Nom

Cette requête renverra uniquement les lignes dans lesquelles la banque et la contrepartie portent le même nom.

Les associations

Les constructions JOIN et JOIN ALL combinent deux résultats en un seul. Ceux. le résultat de l’exécution de deux sera « fusionné » en un seul, commun.

Autrement dit, le système fonctionne exactement de la même manière que les systèmes classiques, uniquement pour une table temporaire.

Comment utiliser INDEX PAR

Cependant, un point est à prendre en compte. 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 y aura plus de 1 à 2 enregistrements dans la table temporaire. Sinon, l'effet pourrait être inverse : les performances des champs indexés ne compensent pas le temps nécessaire à la création de l'index.

CHOISIR
Taux de change Dernière coupe transversale Devise AS Devise,
Taux de change Dernière coupe transversale.
Taux de change PUT
DEPUIS
Registre d'informations.Taux de change.Dernière tranche (&période,) AS Taux de changeDernière tranche
INDEX PAR
Devise
;
CHOISIR
PrixNomenclature.Nomenclature,
PrixNomenclatures.Prix,
PrixNomenclatures.Devise,
Taux de change.Taux
DEPUIS
Registre d'informations.Nomenclature Prix.Dernière tranche (&Période,
Nomenclature B (&Nomenclature) ET PriceType = &PriceType) AS PriceNomenclature
REJOINDRE À GAUCHE Taux de change AS Taux de change
Prix ​​​​des logicielsNomenclatures.Currency = Taux de change.Currency

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 existent :

Montant, Quantité, Nombre de différents, Maximum, Minimum, Moyenne.

Exemple 1:

CHOISIR
Ventes de biens et services Biens. Nomenclature,
SUM(Ventes de GoodsServicesGoods.Quantity) AS Quantité,
SUM (Ventes de GoodsServicesGoods.Amount) AS Montant
DEPUIS

PAR GROUPE
Ventes de biens et services Biens.Nomenclature

La demande reçoit toutes les lignes contenant des marchandises et les résume par quantité et montants par article.

Exemple n°2

CHOISIR
Banques.Code,
QUANTITÉ (DIFFÉRENTES Banques.Link) COMME Nombre de doublons
DEPUIS
Annuaire.Banques COMMENT Banques
PAR GROUPE
Banques.Code

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 résultats sont un moyen d'obtenir des données d'un système avec une structure hiérarchique. Les fonctions d'agrégation peuvent être utilisées pour les champs récapitulatifs, tout comme pour les regroupements.

L'un des moyens les plus courants d'utiliser les résultats dans la pratique est la radiation groupée de marchandises.

CHOISIR




DEPUIS
Document. Ventes de biens et services. Biens COMMENT vendre des biens et services Biens
TRIER PAR

RÉSULTATS
SOMME(Quantité),
SOMME(Somme)
PAR
Nomenclature

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

Résultats généraux

Si vous avez besoin d'obtenir des totaux pour tous les « totaux », utilisez l'opérateur « GÉNÉRAL ».

CHOISIR
Ventes de biens et services Biens Nomenclature AS Nomenclature,
Ventes de biens et services Biens. Lien AS Document,
Ventes de biens et services Biens. Quantité AS Quantité,
Ventes de biens et services Biens. Montant AS Montant
DEPUIS
Document. Ventes de biens et services. Biens COMMENT vendre des biens et services Biens
TRIER PAR
Ventes de biens et services Biens. Lien. Date
RÉSULTATS
SOMME(Quantité),
SOMME(Somme)
PAR
SONT COMMUNS,
Nomenclature

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

Dans lequel 1 niveau de regroupement est l'agrégation de tous les champs nécessaires.

Organiser

L'opérateur ORDER BY est utilisé pour trier le résultat d'une 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 s'effectue par la représentation interne du lien (l'identifiant unique), plutôt que par code ou par représentation de référence.

CHOISIR

DEPUIS
Annuaire.Nomenclature AS Nomenclature
TRIER PAR
Nom

La requête affichera une liste de noms du répertoire de la nomenclature, 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 que les lignes seront affichées dans le même ordre lors de l'exécution de requêtes identiques.

Si vous devez afficher les enregistrements de table dans un ordre constant, vous devez utiliser la construction Auto-Order.

CHOISIR
Nomenclature.Nom AS Nom
DEPUIS
Annuaire.Nomenclature AS Nomenclature
COMMANDE AUTOMATIQUE

Tables virtuelles

Les tables virtuelles dans 1C sont une caractéristique unique du langage de requête 1C que l'on ne trouve pas dans d'autres syntaxes similaires. Une table virtuelle est un moyen rapide d'obtenir des informations de profil à partir des registres.

Chaque type de registre possède son propre ensemble de tables virtuelles, qui peuvent différer en fonction des paramètres du registre.

  • coupe du premier;
  • coupe de ce dernier.
  • les restes;
  • révolutions;
  • soldes et chiffre d’affaires.
  • mouvements du sous-conto ;
  • révolutions;
  • vitesse Dt Kt ;
  • les restes;
  • soldes et chiffre d'affaires
  • sous-conto.
  • base;
  • données graphiques ;
  • période de validité réelle.

Pour le développeur de solutions, les données sont extraites d'une table (virtuelle), mais en fait la plateforme 1C extrait de plusieurs tables, les transformant sous la forme requise.

CHOISIR
Produits en entrepôts, restes et chiffre d'affaires. Nomenclature,
Produits dans les entrepôts restants et le chiffre d'affaires. Quantité initiale restante,
ProduitsDansEntrepôtsRemainsAndTurnover.QuantityTurnover,
Marchandises dans les entrepôts restent et chiffre d'affaires. Quantité entrante,
Marchandises dans les entrepôts restent et chiffre d'affaires. Quantité Consommation,
ProduitsDansEntrepôtsRemainingsAndTurnover.QuantityFinalRemaining
DEPUIS
S'inscrireAccumulations.GoodsInWarehouses.RemainsAndTurnover AS GoodsInWarehousesRemainsAndTurnover

Cette requête permet de récupérer rapidement une grande quantité de données.

Options de table virtuelle

Un aspect très important du travail avec des tables virtuelles est l'utilisation de paramètres. Les paramètres de table virtuelle sont des paramètres spécialisés pour la sélection et la configuration.

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 devient sous-optimale, il est possible de recevoir des données incorrectes.

Un exemple d'utilisation de ces paramètres :

Registre des Accumulations. Marchandises en Entrepôts. Soldes et Chiffres d'Affaires (& Début de Période, & Fin de Période, Mois, Mouvements et Bordures de Période, Nomenclature = & Nomenclature Obligatoire)

Algorithme pour tables virtuelles

Par exemple, la table virtuelle la plus utilisée de type « Restes » 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 mesures dans le tableau des totaux.
  2. Nous « ajoutons » 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

Générateur de requêtes– un outil intégré au système 1C Enterprise qui facilite grandement le développement de requêtes de bases de données.

Le générateur de requêtes possède une interface assez simple et intuitive. Néanmoins, examinons plus en détail l'utilisation du constructeur de requêtes.

Le constructeur de texte de requête est lancé depuis le menu contextuel (bouton droit de la souris) à l'endroit souhaité dans le code du programme.

Description du constructeur de requêtes 1C

Examinons chaque onglet du concepteur plus en détail. L'exception est l'onglet Builder, qui fait l'objet d'une autre discussion.

Onglet Tables et Champs

Cet onglet spécifie la source de données et les champs qui doivent être affichés dans le rapport. Essentiellement, 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 des tables virtuelles :

Onglet Connexions

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

Onglet Regroupement

Sur cet onglet, le système permet de regrouper et de résumer les champs obligatoires du résultat du tableau. Décrit l'utilisation des constructions GROUP PAR, SOMME, MINIMUM, MOYENNE, MAXIMUM, QUANTITÉ, NOMBRE DE DIFFÉRENTS.

Onglet Conditions

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

Onglet Avancé

Languette En plus rempli de toutes sortes de paramètres très importants. Examinons chacune des propriétés.

Regroupement Sélection d'enregistrements:

  • N premier– un paramètre qui renvoie uniquement N enregistrements à la requête (le PREMIER opérateur)
  • Pas de doublons– assure l’unicité des enregistrements reçus (opérateur DIFFÉRENT)
  • Autorisé– 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 sera le type de requête : récupération de données, création d'une table temporaire ou destruction d'une table temporaire.

En dessous il y a un drapeau Verrouiller les données reçues pour une modification ultérieure. Il permet d'activer la possibilité de définir le verrouillage des données, ce qui garantit la sécurité des données depuis leur lecture jusqu'à leur modification (pertinent uniquement pour le mode de verrouillage automatique, conception POUR CHANGEMENT).

Onglet Jointures/Alias

Sur cet onglet du concepteur de requêtes, vous pouvez définir la possibilité de joindre différentes tables et alias (la construction COMMENT). Les tableaux sont indiqués sur le côté gauche. Si vous placez les drapeaux en face du tableau, la construction UNITE sera utilisée, sinon - UNITE ALL (différences entre les deux méthodes). Sur le côté droit, la correspondance des champs dans les différentes tables est indiquée ; si la correspondance n'est pas précisée, la requête renverra NULL.

Onglet Commande

Celui-ci précise l'ordre dans lequel les valeurs sont triées (ORDER BY) - décroissant (DESC) ou croissant (ASC).

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 Lot de requêtes

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

Bouton « Requête » dans le concepteur de requêtes

Dans le coin inférieur gauche du concepteur de requêtes se trouve un bouton Requête, avec lequel vous pouvez consulter le texte de la requête à tout moment :

Dans cette fenêtre, vous pouvez apporter des modifications à 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 de fournir 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êtes 1C

Tout d'abord, pour commencer à travailler avec la console de requêtes, vous devez la télécharger quelque part. Les traitements sont généralement divisés en deux types : les formes contrôlées et les formes conventionnelles (ou, parfois, elles sont appelées 8.1 et 8.2/8.3).

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

Description de la console de requête 1C

Commençons par examiner la console de requêtes 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 à la milliseconde, cela vous permet de comparer différentes conceptions en termes de performances.

Le premier groupe de boutons de la barre de commandes est chargé d'enregistrer les requêtes en cours dans un fichier externe. C'est très pratique, vous pouvez toujours revenir à la rédaction d'une demande complexe. Ou, par exemple, stockez une liste d'exemples typiques de certaines conceptions.

A gauche, dans le champ « Demande », vous pouvez créer de nouvelles demandes et les enregistrer dans une arborescence. Le deuxième groupe de boutons est chargé de gérer la liste des demandes. Grâce à lui, vous pouvez créer, copier, supprimer, déplacer une demande.

  • Exécuterdemande– exécution et résultats simples
  • Exécuter le package– permet de visualiser toutes les requêtes intermédiaires dans un lot de requêtes
  • Affichage des tables temporaires– vous permet de voir les résultats que renvoient les requêtes temporaires sur une table

Paramètres de la requête :

Vous 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 Récupérer à partir d'une demande trouve automatiquement tous les paramètres dans la demande pour la commodité du développeur.
  • Drapeau Paramètres communs à toutes les requêtes– une fois installé, son traitement n'efface pas les paramètres lors du passage de requête en requête dans la liste générale des requêtes.

Définir un paramètre avec une liste de valeurs C'est très simple, juste au moment de choisir une valeur de paramètre, cliquez sur le bouton d'effacement de la valeur (croix), le système vous demandera de sélectionner le type de données, où vous devrez sélectionner « Liste de valeurs » :

Dans le panneau supérieur se trouve également un bouton permettant d'appeler les paramètres de la console de requête :

Ici, vous pouvez spécifier les paramètres de sauvegarde automatique des requêtes et les paramètres d'exécution des requêtes.

Le texte de la demande est saisi dans le champ de demande de la console. Cela peut être fait en tapant simplement un test de requête ou en appelant un outil spécial - le concepteur de requêtes.

Le concepteur de requêtes 1C 8 est appelé depuis le menu contextuel (bouton droit de la souris) lorsque vous cliquez sur le champ de saisie :

Ce menu a également des fonctions utiles telles que l'effacement ou l'ajout de sauts de ligne (« | ») à la requête, ou la réception du code de la requête sous cette forme pratique :

Demande = Nouvelle demande ;
Demande.Texte = "
|SÉLECTIONNER
| Devises.Lien
|DE
| Annuaire.Devises AS Devises”;
RequestResult = Request.Execute();

Le champ inférieur de la console de requête affiche le champ résultat de la requête, c'est pourquoi ce traitement a été créé :



De plus, la console de requêtes, en plus de la liste, peut afficher les données sous forme d'arborescence - 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 passer la certification. Ci-dessous, nous parlerons des raisons typiques des performances de requête non optimales et des méthodes d'optimisation.

Sélections dans une 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 VT. Vous ne devez en aucun cas utiliser la construction WHERE pour la sélection dans une table virtuelle, c'est une grave erreur du point de vue de l'optimisation. Dans le cas d'une sélection par OÙ, en effet, le système recevra TOUS les enregistrements et sélectionnera ensuite seulement ceux nécessaires.

DROITE:

CHOISIR

DEPUIS
Registre des accumulations. Règlements mutuels avec les participants des organisations. Soldes (
,
Organisation = &Organisation
ET Individuel = &Individu) COMMENT Règlements mutuels avec les participants des organisations Soldes

FAUX:

CHOISIR
Règlements mutuels avec les participants des organisations Soldes. Montant Solde
DEPUIS
Registre des accumulations Règlements mutuels avec les participants des organisations Soldes (,) COMMENT Règlements mutuels avec les participants des organisations Soldes

Règlements mutuels avec les participants des organisations Soldes. Organisation = & Organisation
ET Règlements mutuels avec les participants des soldes des organisations. Individuel = &Individu

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

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

Par exemple, il est hautement indésirable pour l'optimisation d'accéder au champ d'enregistrement du registre – registraire. Le registraire dispose d'un type de données composite, parmi lequel se trouvent tous les types de documents possibles pouvant écrire des données dans le registre.

FAUX:

CHOISIR
Ensemble d'enregistrements.Enregistreur.Date,
RecordSet.Quantité
DEPUIS
RegisterAccumulations.ProductsOrganizations AS SetRecords

Autrement dit, une telle requête accédera non pas à une table, mais à 22 tables de base de données (ce registre comporte 21 types de registraires).

DROITE:

CHOISIR
CHOIX
QUAND ProductsOrg.Registrar LINK Document.Ventes de produits et services
PUIS EXPRESS (ProductsOrganization.Registrar AS Document.Sales of GoodsServices).Date
QUAND GoodsOrg.Registrar LINK Document.Réception de GoodsServices
PUIS EXPRESS (GoodsOrg.Registrar AS Document.Receipt of GoodsServices).Date
FIN À LA DATE,
ProduitsOrg.Quantité
DEPUIS
S'inscrireAccumulations.ProductsOrganizations AS ProductsOrganization

Ou la deuxième option consiste à ajouter ces informations aux détails, par exemple, dans notre cas, en ajoutant une date.

DROITE:

CHOISIR
ProduitsOrganisations.Date,
ProduitsOrganisations.Quantité
DEPUIS
Registre des Accumulations Biens des Organisations AS Biens des Organisations

Sous-requêtes dans une condition de jointure

Pour l'optimisation, il est inacceptable d'utiliser des sous-requêtes dans les 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 VT, après les avoir préalablement indexés par des champs de connexion.

FAUX:

CHOISIR …

JOINT GAUCHE (
SELECT FROM RegisterInformation.Limits
OÙ …
PAR GROUPE...
) PAR …

DROITE:

CHOISIR …
METTRE les limites
FROM Registre d'informations.Limites
OÙ …
PAR GROUPE...
INDEX PAR... ;

CHOISIR …
AVEC Document Ventes de biens et de services
Limites de jointure à gauche
PAR …;

Joindre des enregistrements avec des tables virtuelles

Il existe des situations où, lors de la connexion d'une table virtuelle à d'autres, le système ne fonctionne pas de manière optimale. Dans ce cas, pour optimiser les performances de la requête, vous pouvez essayer de placer la table virtuelle dans une table temporaire, sans oublier d'indexer les champs joints dans la requête de table temporaire. Cela est dû au fait que les VT sont souvent contenus dans plusieurs tables physiques du SGBD ; du coup, une sous-requête est compilée pour les sélectionner, et le problème s'avère similaire au point précédent.

Utiliser des sélections basées sur des champs non indexés

L'une des erreurs les plus courantes lors de l'écriture de requêtes consiste à utiliser des conditions sur des champs non indexés, ce qui contredit règles d'optimisation des requêtes. Le SGBD ne peut pas exécuter une requête de manière optimale si la requête inclut une sélection sur des champs non indexables. Si vous prenez une table temporaire, vous devez également indexer les champs de connexion.

Il doit y avoir un index approprié pour chaque condition. Un index approprié est celui qui satisfait aux exigences suivantes :

  1. L'index contient tous les champs répertoriés dans la condition.
  2. Ces champs se trouvent 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 « coincées » entre elles.

Si le SGBD ne sélectionne pas les bons index, 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.

Utiliser le OU logique dans des conditions

C'est tout, cet article a couvert les aspects de base de l'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, Je recommande fortement pour les débutants et plus encore !

Voyons maintenant le reste.

Fonctions pour travailler avec des chaînes dans les requêtes 1C

Il existe peu de fonctions et d'opérateurs pour travailler avec des données de chaîne dans les requêtes 1C.

Premièrement, des chaînes dans les requêtes peuvent être ajoutées. Pour cela, utilisez l'opérateur « + » :

Demande. Texte = "SÉLECTIONNER
" "Doubler: " " + Source.Nom
;

Deuxièmement, vous pouvez sélectionner une partie de la ligne. Pour ce faire, utilisez la fonction SUBSTRUCTION. La fonction est similaire au langage 1C intégré. Il comporte trois paramètres :

  1. Chaîne source.
  2. Le numéro du caractère par lequel la ligne sélectionnée doit commencer.
  3. Personnages.

Demande. Texte= "CHOISIR
SOUS-CHAÎNE("
"Doubler: " ", 4, 3) EN RÉSultat"; // Résultat : ok

Fonction EST NUL

NULL est un type de données spécial sur la plateforme 1C:Enterprise. C'est aussi la seule valeur possible de ce type. NULL peut apparaître dans les requêtes dans plusieurs cas : lors de la connexion des sources de requêtes, si une valeur correspondante n'a pas été trouvée dans l'une des tables ; lors de l'accès aux détails d'un objet inexistant ; si NULL a été spécifié dans la liste des champs de requête (par exemple, lors de la combinaison des résultats de sélection de plusieurs tables), etc.

Parce que NULL n'est ni null, ni la chaîne vide, ni même une valeur Indéfini, il est souvent utile de le remplacer par un type de données plus utile. C'est pour cela que la fonction est conçue. EST NUL.

Il possède deux paramètres :

  1. La valeur en cours de vérification.
  2. La valeur par laquelle remplacer le premier paramètre s’il s’avère être NULL.

Demande. Texte= "CHOISIR
ISNULL(Source.Remainder, 0) AS Reste"
; // Si le résultat de la requête est le champ reste = NULL,
// alors il sera remplacé par 0, et vous pourrez effectuer des opérations mathématiques avec

Les fonctions PERFORMANCE Et INTRODUCTIONLIENS

Ces fonctions sont conçues pour obtenir des représentations sous forme de chaîne de diverses valeurs. Autrement dit, ils convertissent les références, les nombres, les booléens, etc. en texte brut. La différence entre eux est que la fonction PERFORMANCE convertit tous les types de données en texte (chaîne) et la fonction INTRODUCTIONLIENS- uniquement des liens, et renvoie les valeurs restantes telles quelles, non converties.

Demande. Texte= "CHOISIR
REPRÉSENTATION(VRAI) COMME Booléen,
REPRÉSENTATION (4) SOUS FORME DE Numéro,
REPRÉSENTATION (Source.Link) AS Link,
REPRÉSENTATION(DATETIME(2016,10,07)) AS Date"
;
// Booléen = "Oui", Numéro = "4", Lien = "Document Ordre d'encaissement N°.... de..."
//Date="07.10.2016 0:00:00"

Demande. Texte= "CHOISIR
REPRÉSENTATIONRÉFÉRENCE(TRUE) COMME Booléen,
REPRÉSENTATIONRÉFÉRENCE(4) COMME NUMÉRO
PRESENTINGLINK(Source.Link) AS Lien,
REPRESENTATIONREFERENCE(DATETIME(2016,10,07)) AS Date"
;
// Booléen = VRAI, Numéro = 4, Lien = "Document N° d'ordre d'encaissement.... de..."
//Date=07.10.2016 0:00:00

Les fonctions TAPER Et VALEURS DE TYPE

Fonction TAPER renvoie le type de données de la plateforme 1C:Enterprise.

Demande. Texte= "CHOISIR
TYPE (Numéro)
TYPE (Chaîne),
TYPE (Document. Bon de commande des dépenses)"
;

Fonction VALEURS DE TYPE renvoie le type de la valeur qui lui est transmise.

Demande. Texte= "CHOISIR
TYPE DE VALEURS (5) AS Nombre,
TAPER ("
"Doubler" ") En tant que chaîne,
TYPE (Source.Link) AS Référence
À partir du Répertoire.Source AS Source"
;
//Nombre=Nombre, String=Chaîne, Répertoire = DirectoryLink.Source

Ces fonctions sont pratiques à utiliser, par exemple, lorsque vous devez savoir si un champ reçu dans une requête est une valeur d'un certain type. Par exemple, récupérons les coordonnées des contreparties à partir du registre d'informations ContactInformation (les contacts non seulement des contreparties, mais également des organisations, des individus, etc. y sont stockés) :

Demande. Texte= "CHOISIR

DEPUIS


VALEURS TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)"
;

Fonction SIGNIFICATION

Fonction Signification permet d'utiliser des objets de configuration 1C directement dans une requête, sans utiliser .

Ajoutons une condition supplémentaire à l'exemple précédent. Il vous suffit d'obtenir les numéros de téléphone de vos contreparties.

Demande. Texte= "CHOISIR
ContactInformation.Introduction
DEPUIS
Registre d'information Coordonnées COMMENT Coordonnées

VALEURS TYPE(ContactInformation.Object) = TYPE(Répertoire.Contreparties)
ET ContactInfo.Type = VALEUR(Enum.ContactInfoTypes.Phone)"
;

Il est à noter que cette fonction ne peut être utilisée qu'avec des valeurs prédéfinies, c'est-à-dire avec des valeurs accessibles directement depuis le configurateur. C'est-à-dire la fonction SIGNIFICATION ne peut pas être utilisé avec des éléments de répertoire créés par les utilisateurs, mais peut fonctionner avec des énumérations, avec des éléments de répertoire prédéfinis, avec des valeurs Lien vide.

Opérateur LIEN

Opérateur LIEN est conçu pour vérifier les valeurs renvoyées par une requête pour voir si elles appartiennent à un type de référence spécifique. La même tâche peut être accomplie en utilisant des fonctions TAPER Et VALEURS DE TYPE(qui ont une portée plus large et ont été discutés ci-dessus).

Par exemple, la tâche de sélection des coordonnées des contreparties pourrait être résolue de la manière suivante :

Demande. Texte= "CHOISIR
ContactInformation.Introduction
DEPUIS
Registre d'information Coordonnées COMMENT Coordonnées

ContactInformation.Object LINK Annuaire.Contreparties"
;

Opérateur EXPRIMER

Opérateur EXPRIMER utilisé dans les requêtes 1C dans deux cas :

  • lorsque vous devez modifier les caractéristiques d'un type primitif ;
  • lorsque vous devez transformer un champ avec un type de données composé en un champ avec un type unique.

Les types de données primitifs incluent : nombre, chaîne, date, booléen. Certains de ces types de données possèdent des caractéristiques supplémentaires. Taper Nombre a de la longueur et de la précision, tapez Doubler - durée ou illimité.

Opérateur EXPRIMER vous permet de modifier non pas le type de données, mais des caractéristiques supplémentaires. Par exemple, il peut transformer une chaîne de longueur illimitée en une chaîne de longueur limitée. Cela peut être utile si vous devez regrouper les résultats d’une requête selon un tel champ. Vous ne pouvez pas regrouper par champs d'une longueur illimitée, nous le convertissons donc en une chaîne d'une longueur de 200 caractères.

Demande. Texte= "CHOISIR
QUANTITÉ (Arrivée DIFFÉRENTE de Biens et Services. Lien) AS Lien
DEPUIS
Document Réception des biens et services COMMENT Réception des biens et services
PAR GROUPE
EXPRESS (Réception de biens et de services. Commentaire AS ROW (200))"
;

Dans certains cas, les requêtes sur des champs avec un type de données composite peuvent ne pas être traitées de manière optimale par la plateforme 1C. Cela entraîne des temps de requête plus longs, il peut donc être utile de convertir à l'avance un type composé en un type unique.

Demande. Texte= "CHOISIR
EXPRESS (Mouvement de chiffre d'affaires des marchandises. Commande AS Document. Commande client). Date AS Date de commande,
Mouvement des marchandisesChiffre d'affaires.Nomenclature
DEPUIS
RegistreAccumulations.Mouvement de marchandises.Chiffre d'affaires AS Mouvement de marchandisesChiffre d'affaires

Mouvement des marchandisesChiffre d'affaires.Document LIEN de commande.Commande client"
;

Les opérateurs CHOIX Et EST NULL

Opérateur CHOIX similaire à l'opérateur SI dans le langage 1C intégré, mais a des fonctionnalités quelque peu réduites.

Disons que nous souhaitons recevoir les informations de contact du registre d'informations ContactInformation et, en même temps, indiquer dans un champ de demande séparé si elles appartiennent à une contrepartie ou à un particulier.

Demande. Texte= "CHOISIR
ContactInformation.Introduction,
CHOIX
QUAND VALEURS TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
ALORS "
Contrepartie "
AUTRE CHOIX
QUAND VALEURS TYPE(ContactInformation.Object) = TYPE(Directory.Individuals)
ALORS "
Individuel"
AUTRE "Quelqu'un d'autre" "
FIN
FIN COMME PROPRIÉTAIRE
DEPUIS
Registre d'informations. Coordonnées AS Coordonnées"
;

Comme le montre l'exemple, dans la conception CHOIX il y a toujours une condition après le mot QUAND; valeur appliquée si la condition est vraie après le mot ALORS et la valeur appliquée si la condition n'est pas remplie, après le mot SINON. Les trois éléments de conception CHOIX sont obligatoires. Omettre l'élément SINON, de la même manière que lors de l'utilisation de l'opérateur SI dans le langage 1C intégré, c'est impossible. Également de l'opérateur CHOIX il n'y a pas d'analogue du design AUTRE, mais vous pouvez en investir un CHOIX dans un autre, comme cela a été fait dans notre exemple.

Opérateur EST NULL utilisé dans la conception CHOIX pour comparer un champ de requête de type NULL.

Demande. Texte= "CHOISIR
CHOIX
QUAND LA VALEUR EST NULLE ALORS 0
AUTRE Signification
FIN"
;

De plus, l'opérateur EST NULL peut être utilisé dans des conditions de requête, comme dans une phrase OÙ.

Dans le langage de requête 1C:Enterprise, la fonction SOUS-CHAÎNE() V formater SOUS-CHAÎNE(<Исходная строка>, <Начало>, <Длина>) peut être appliqué aux données de chaîne et vous permet de sélectionner un fragment<Исходной строки>, en commençant par le numéro du caractère<Начало>(les caractères d'une ligne sont numérotés à partir de 1) et longueur<Длина>personnages. Le résultat du calcul de la fonction SUBSTRING() a un type chaîne de longueur variable, et la longueur sera considérée comme illimitée si<Исходная строка>a une longueur et des paramètres illimités<Длина>n'est pas une constante ou supérieure à 1024.

Calcul de la fonction SUBSTRING() sur serveur SQL :
Dans la version client-serveur de l'ouvrage, la fonction SUBSTRING() est implémentée à 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() en utilisant des règles complexes en fonction du type et des valeurs de ses paramètres, ainsi qu'en fonction du contexte dans lequel il est utilisé.

Dans la plupart des cas, ces règles n'affectent pas l'exécution d'une requête 1C:Enterprise, cependant, il existe des cas où la longueur maximale de la chaîne de résultat calculée par SQL Server est essentielle pour l'exécution de la requête. 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 entraîner l'arrêt inattendu de la demande.

Par exemple, la demande :
Code 1C v 8.x SÉLECTIONNER
CHOIX

AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
CHOIX
QUAND Type = &LegalAddressIndividual
ALORS SUBSTRING(Représentation, 0, 200)
AUTRE NUL
FIN COMME Présentation1
DEPUIS

TRIER PAR
Performance,
Performance1
se termine anormalement avec le message Erreur SGBD :
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

Cela se produit car Microsoft SQL Server calcule la longueur maximale de la chaîne résultant de l'expression :
Code 1C v 8.x SÉLECTION
QUAND Type = &LegalAddressIndividual
ALORS SUBSTRING(Représentation, 0, 200)
AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
équivaut à 4000 caractères. Par conséquent, la longueur d’un enregistrement composé de deux de ces champs dépasse les 8 000 octets autorisés pour l’opération de tri.

En raison de la particularité décrite de l'exécution de la fonction SUBSTRING() sur SQL Server, 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(). En particulier, l’exemple ci-dessus peut être réécrit comme suit :
Code 1C v 8.x SÉLECTIONNER
CHOIX
QUAND Type = &LegalAddressIndividual
AUTRE NUL
LA FIN EN FORME DE PRÉSENTATION,
CHOIX
QUAND Type = &LegalAddressIndividual
PUIS EXPRESS(Représentation AS String(200))
AUTRE NUL
FIN COMME Présentation1
DEPUIS
Registre d'information Coordonnées COMMENT Coordonnées
TRIER PAR
Performance,
Performance1