» Carnet du programmeur. À l'aide de la directive «Autorisé», sélectionnez 1c autorisé

Carnet du programmeur. À l'aide de la directive «Autorisé», sélectionnez 1c autorisé
   

17 règles pour établir une REQUETE optimale pour les données de la base de données 1C

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

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

  • tables d'infobase utilisées comme sources de données de requête ;
  • les champs de table qui doivent être traités dans la requête ;
  • règles de regroupement ;
  • trier les résultats ;
  • etc.

L'instruction est compilée dans un langage spécial - le langage de requête et se compose de parties distinctes - sections, phrases, mots-clés, fonctions, opérateurs arithmétiques et logiques, commentaires, constantes et paramètres.

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

Recommandations pour l'écriture de requêtes de base de données dans le langage de requête de la plateforme 1C :

1) Le corps de la demande peut contenir des données de configuration prédéfinies, telles que :

  • énumérer les valeurs ;
  • données prédéfinies :
  • livres de référence;
  • plans pour les types de caractéristiques ;
  • plans comptables;
  • plans pour les types de calculs;
  • liens vides ;
  • valeurs des points de routage des processus métier.

De plus, le texte de la demande peut contenir les valeurs des énumérations système qui peuvent être attribuées aux champs des tables de la base de données : Type de mouvement d'accumulation, Type de compte et Type de mouvement comptable. Dans les requêtes, les données de configuration prédéfinies et les valeurs d'énumération système sont accessibles à l'aide d'un littéral du type de fonction VALUE. Ce littéral permet d'améliorer la lisibilité de la requête et de réduire le nombre de paramètres de requête.

Exemple d'utilisation d'un littéral SIGNIFICATION:

  • OÙ Ville = VALEUR(Répertoire.Villes.Moscou)
  • OÙ Ville = VALEUR (Directory.Cities.EmptyLink)
  • OÙProductType = VALEUR (Enumeration.ProductTypes.Service)
  • OÙMovementType = VALEUR(MovementTypeAccumulation.Incoming)
  • OÙ RoutePoint = VALEUR (BusinessProcess.BusinessProcess1.RoutePoint.Action1

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

La commande automatique fonctionne selon les principes suivants :

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

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

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

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

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

Code 1C v 8.x SÉLECTIONNER
EXPRESS (Marchandises restantes. Document AS du registraire. Réception des marchandises). Numéro AS Numéro de réception,
EXPRESS (Marchandises restantes. Document AS du registraire. Réception des marchandises). Date AS Date de réception
DEPUIS
Registre des accumulations. Marchandises restantes AS Marchandises restantes

Si une conversion de type est considérée comme irréalisable, alors le résultat de la conversion de type sera la valeur NUL.

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

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

Code 1C v 8.x // Sélectionnez les champs Nombre et Composition
// depuis la table virtuelle Document.Expenditure
SELECT Link.Number, VIDE TABLE.(N°, Article, Quantité) AS Composition
DE Document. Facture de dépenses
COMBINEZ TOUT
SELECT Link.Number, Contents.(LineNumber, Produit, Quantité)
DE Document.Facture Document.Facture.Composition.*

7) Pour éviter que des lignes en double n'apparaissent dans le résultat de la requête, vous devez utiliser l'instruction DIVERS, parce que c'est plus visuel et compréhensible, et les instructions PAR GROUPE utilisé pour le regroupement à l’aide de fonctions d’agrégation. Ksati, lors de l'utilisation de fonctions d'agrégation, une suggestion PAR GROUPE peut ne pas être spécifié du tout, mais tous les résultats de la requête seront regroupés sur une seule ligne. Exemple:

Code 1C v 8.x // Il faut savoir quelles contreparties
// les marchandises ont été expédiées pour la période.
Sélectionnez Divers
Document.Facture.Contrepartie

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

Code 1C v 8.x SÉLECTIONNER
Réception de biens et services. Biens. (SOMME (Quantité), Nomenclature),
Réception de biens et de services. Lien,
Réception des biens et services.
DEPUIS
Document Réception des biens et services COMMENT Réception des biens et services
PAR GROUPE
Réception de biens et de services. Biens. (Nomenclature)

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

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

Exemple (recherche de documents contenant un produit spécifique dans la section tabulaire) :

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

11) Une variante intéressante de l'opérateur B consiste à vérifier si un ensemble ordonné est inclus dans l'ensemble de tels ensembles (Field1, Field2, ..., FieldN) B (Field1, Field2, ..., FieldN).

Code 1C v 8.x SÉLECTIONNER
Contreparties.Link

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

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

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

Toutes les tables virtuelles sont paramétrées, c'est-à-dire que le développeur a la possibilité de définir certains paramètres que le système utilisera lors de la génération d'une demande de création d'une table virtuelle. En fonction des paramètres de la table virtuelle spécifiés par le développeur, le système peut générer DIVERS requêtes pour obtenir la même table virtuelle, et elles seront optimisées en termes de paramètres passés.

Il n'est pas toujours possible pour un développeur d'accéder aux données auxquelles le système a accès.

13) En mode de fonctionnement client-serveur, la fonction SOUS-CHAÎNE() est implémenté à l'aide de la fonction SUBSTRING() de l'instruction SQL correspondante transmise au serveur de base de données SQL Server, qui calcule le type du résultat de la fonction SUBSTRING() à l'aide de règles complexes en fonction du type et des valeurs de ses paramètres, comme ainsi que selon le contexte dans lequel il est utilisé. Dans la plupart des cas, ces règles n'ont aucun effet sur l'exécution des requêtes, mais il arrive parfois que la longueur maximale des lignes de résultats calculée par SQL Server soit importante pour l'exécution des requêtes. Il est important de garder à l'esprit que dans certains contextes lors de l'utilisation de la fonction SUBSTRING(), la longueur maximale de son résultat peut être égale à la longueur maximale d'une chaîne de longueur limitée, qui dans SQL Server est de 4 000 caractères. Cela peut provoquer un crash inattendu de la requête :

Fournisseur Microsoft OLE DB pour SQL Server : Avertissement : Le processeur de requêtes n'a pas pu produire un plan de requête à partir de l'optimiseur car la longueur totale de toutes les colonnes de la clause GROUP BY ou ORDER BY dépasse 8 000 octets.

HRESULT=80040E14, SQLSTATE=42000, natif=8618

14) À utiliser avec prudence OU en conception , car l'utilisation d'une condition OR peut alourdir considérablement la requête. Le problème peut être résolu par la conception COMBINEZ TOUT. Exemple:

Code 1C v 8.x SÉLECTIONNER

DEPUIS


_Entrepreneurs de démonstration.Link =Link1
COMBINEZ TOUT
CHOISIR
_Entrepreneurs de démonstration.NameFull
DEPUIS
Annuaire._Contreparties de démonstration COMMENT FAIRE _Contreparties de démonstration

_Entrepreneurs de démonstration.Link = Link2

15) État PAS DANS en conception augmente le temps d'exécution des requêtes, car il s'agit d'une sorte de NON (OR1 OR2 ... ORn), donc pour les grandes tables, essayez d'utiliser LEFT JOIN avec la condition EST NULL. Exemple:

Code 1C v 8.x SÉLECTIONNER
_Démo Entrepreneurs.Link
DEPUIS
Annuaire._Contreparties de démonstration COMMENT FAIRE _Contreparties de démonstration
Document de connexion à gauche._Commande de démonstration de l'acheteur COMMENT FAIRE _Commande de démonstration de l'acheteur
Logiciel _Démo Contreparties. Lien = _Démo Commande de l'Acheteur. Contrepartie

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

16) Lors de l'utilisation Tableaux temporaires Vous devez indexer la condition et joindre les champs dans ces tables, MAIS, lors de l'utilisation d'index, la requête peut être encore plus lente. Par conséquent, il est nécessaire d'analyser chaque requête avec et sans index, de mesurer la vitesse d'exécution de la requête et de prendre une décision finale.

Si vous placez des données dans une table temporaire initialement indexée par certains champs, alors la table temporaire n'aura plus d'index sur ces champs.

17) Si vous n'utilisez pas Gestionnaire de tables temporaires, il n'est alors pas nécessaire de supprimer explicitement la table temporaire, elle sera supprimée une fois la requête par lots terminée, sinon vous devez supprimer la table temporaire en utilisant l'une des méthodes suivantes : commande DÉTRUIRE dans la requête, appelez la méthode TemporaryTableManager.Close().

Et en plus de la vidéo d'Evgeny Gilev : Erreurs typiques lors de l'écriture de requêtes en 1C :

Le langage de requête 1C 8 est un outil indispensable pour un programmeur 1C : il vous permet d'écrire un code plus concis, simple et compréhensible et d'utiliser moins de ressources système lorsque vous travaillez avec des données. Cet article ouvre une série de leçons dédiées au langage de requête 1C 8. Dans la première leçon, nous examinerons la structure de l'opérateur principal de ce langage - CHOISIR.À l'aide de cet opérateur, vous pouvez créer des sélections à partir de tables de base de données. Les données de table sélectionnées peuvent être triées, des conditions y sont placées, liées et combinées avec des données d'autres tables, regroupées par divers champs, et bien plus encore.

Langage de requête 1C entreprise 8 - Structure de l'opérateur SELECT

Regardons la structure de l'opérateur SELECT (les parties facultatives de l'opérateur sont indiquées entre crochets). Le langage de requête 1C fournit une large gamme d'outils pour créer des échantillons de données.

SELECT [ALLOWED] [DIFFERENT] [FIRST A] [Field1] [AS Alias1], [Field2] [AS Alias2], ... [FieldM] [AS AliasB] [PUT TemporaryTableName] [FROM Table1 AS AliasTableTable1 [[INNER JOIN ][LEFT JOIN][FULL JOIN] Table2 AS Alias ​​​​Table2 [[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS Alias ​​​​TablesC BY Expression1 [Et Expression2]...[Et ExpressionD]] .. . ... BY Expression1 [Et Expression2]...[Et ExpressionE]] ... [TableF AS TableF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [WHERE Expression1 [AND Expression2] ... [ET ExpressionH]] [UNIER TOUS...] [; ...] [INDEX PAR Alias1 ... AliasB] [TOTALS [AggregationFunction(Field1)][,] [AggregationFunction(Field2)][,] ... [AggregationFunction(FieldI)] BY [GENERAL][,] [ GroupingField1][,] ... [GroupingFieldj]]

Mots-clés et blocs pour travailler avec des champs

  • CHOISIR— un mot-clé indiquant le début de l'opérateur ;
  • AUTORISÉ indique que la sélection doit inclure les enregistrements de table disposant d'un accès en lecture pour l'utilisateur donné ;
  • DIVERS indique que l’échantillon ne doit inclure que des flux différents (dans tous les domaines). En d’autres termes, les lignes en double seront exclues de l’échantillon ;
  • PREMIER UN si vous spécifiez ce mot-clé, alors seule la première A des lignes sélectionnées par la requête sera incluse dans la sélection, où A est un nombre naturel ;
  • Bloc de champ— ce bloc indique les champs qui doivent être inclus dans la sélection. Ces champs seront des colonnes sélectionnées. Dans le cas le plus simple, le champ ressemble à ceci : Table Alias.TableFieldName AS Field Alias

    De cette façon, nous indiquons de quelle table nous extrayons ce champ. Le langage de requête 1C vous permet de spécifier n'importe quel alias, mais ils ne doivent pas être répétés dans la même instruction SELECT. Un champ peut être plus complexe, constitué de diverses combinaisons de champs de table, de fonctions de langage de requête et de fonctions d'agrégation, mais nous ne couvrirons pas ces cas dans ce didacticiel ;

Mots-clés et blocs pour travailler avec des tables

  • PUT NomTableTemporaire- mot-clé LIEU est destiné à créer une table temporaire avec un nom spécifique, qui sera stockée dans la RAM dans une session 1C 8 donnée jusqu'à sa fin ou jusqu'à ce que la table temporaire soit détruite. Il convient de noter que les noms des tables temporaires dans une session 1C 8 ne doivent pas être répétés ;
  • Bloc de tables et de relations— le bloc indique toutes les tables utilisées dans cette requête, ainsi que les relations entre elles. Le bloc commence par un mot-clé DEPUIS, suivi du nom et de l'alias de la première table. Si cette table est liée à d'autres tables, alors les relations sont indiquées. Le langage de requête 1C contient l'ensemble de types de connexion suivant :
    • JOINTURE INTERNE— un enregistrement de la table de gauche ne sera inclus dans la sélection que si la condition de connexion est remplie, un enregistrement de la table de droite ne sera inclus dans la sélection que si la condition de connexion est remplie ;
    • CONNEXION GAUCHE— un enregistrement de la table de gauche sera inclus dans la sélection dans tous les cas, un enregistrement de la table de droite ne sera inclus dans la sélection que si la condition de connexion est remplie ;
    • CONNEXION COMPLÈTE— un enregistrement de la table de gauche sera dans tous les cas inclus en premier dans la sélection, puis seulement si la condition de connexion est remplie, un enregistrement de la table de droite sera dans tous les cas inclus en premier dans la sélection, puis seulement si la condition de connexion est rencontré. Dans ce cas, les lignes en double résultantes sont exclues de l’échantillon.

    Après le type de connexion, le nom et l'alias de la deuxième table sont indiqués. Vient ensuite le mot-clé PAR, suivis de conditions de communication reliées entre elles par des opérateurs logiques ET, OU. Chaque expression de la condition doit renvoyer une valeur booléenne (Vrai, Faux). Si la première table est connectée à d'autres tables que la seconde, alors le type de connexion est à nouveau indiqué, et ainsi de suite. Chacune des tables participant à la connexion, à son tour, peut être connectée à d'autres tables, comme le montre le diagramme de structure de requête. Si la table n'est pas liée à la première, alors elle est indiquée sans type de connexion, alors ses connexions peuvent suivre, et ainsi de suite ;

Mots-clés et blocs de conversion de données

  • Blocage de groupe— ce bloc est utilisé pour regrouper les lignes du tableau. Les lignes sont combinées en une seule si les valeurs des champs spécifiés après le mot-clé PAR GROUPE s'avère être le même. Dans ce cas, tous les autres champs sont additionnés, moyennés, maximisés ou minimisés à l'aide de fonctions d'agrégation. Les fonctions d'agrégation sont utilisées dans un bloc de champ. Exemple : Maximum(TableAlias.TableFieldName) AS FieldAlias
  • Bloc de condition- dans ce bloc après le mot clé les expressions conditionnelles séparées par des opérateurs logiques sont indiquées ET, OU, pour que l'une des lignes sélectionnées soit incluse dans l'échantillon, il est nécessaire que toutes les conditions de l'agrégat aient une valeur Vrai.
  • COMBINEZ TOUT— ce mot clé est utilisé pour combiner des requêtes (opérateurs CHOISIR). Le langage de requête 1C vous permet de combiner plusieurs requêtes en une seule. Pour que les requêtes soient fusionnées, elles doivent avoir le même ensemble de champs ;
  • «;» - les points-virgules sont utilisés pour séparer les instructions indépendantes les unes des autres CHOISIR;
  • INDEX PAR— le mot-clé est utilisé pour indexer les champs spécifiés après ;
  • Bloc récapitulatif- utilisé pour créer des échantillons arborescents. Pour chacun des champs de regroupement précisés après le mot-clé PAR, une ligne distincte sera créée dans la sélection. Dans cette ligne, à l'aide de fonctions d'agrégation, les valeurs totales des champs spécifiés après le mot-clé seront calculées RÉSULTATS.

Voulez-vous continuer à apprendre le langage de requête 1C 8 ? Alors lisez l’article suivant.

L'objet de configuration « rôle » donne un ensemble de droits sur les opérations (actions) sur les objets de configuration.

Rôle "Pleins droits".

Il s'agit simplement d'un rôle (non prédéfini) dans lequel tous les types de droits sur tous les objets de configuration sont vérifiés.

Ce qui le distingue des autres rôles est la présence du droit « Administration ».

Si au moins un utilisateur est créé, le système commence à vérifier la présence du droit « Administration » - au moins un utilisateur doit l'avoir.

Restrictions d'accès au niveau de l'enregistrement

Sécurité au niveau des lignes (RLS) – restriction au niveau de l'enregistrement.

Le mécanisme de restrictions d'accès aux données permet de gérer les droits d'accès non seulement au niveau des objets de métadonnées, mais également au niveau des objets de base de données. Les objets suivants peuvent être utilisés pour restreindre l'accès aux données :

  • les rôles,
  • paramètres de séance,
  • options fonctionnelles,
  • modules partagés privilégiés,
  • mot-clé ALLOWED dans le langage de requête.

Le mécanisme est conçu pour restreindre l'accès aux enregistrements des tables d'objets de métadonnées en fonction de conditions arbitraires imposées sur les valeurs des champs de ligne de ces tables. Par exemple, pour voir les enregistrements uniquement pour « vos » contreparties, organisations, etc.

Mise en œuvre technique des restrictions d'accès dans 1C

1C génère une requête au SGBD. Le cluster de serveurs ajoute une section OÙ à la requête, qui contient le texte de la condition de restriction d'accès via RLS, puis cette requête est envoyée au SGBD, les données extraites sont renvoyées au client 1C.


Ce mécanisme fonctionnera pour toute demande du client :

  • dans les rapports,
  • dans des listes dynamiques et dans des formulaires de liste réguliers
  • dans les requêtes personnalisées.

Une telle mise en œuvre du mécanisme affecte grandement les performances.

Moyens de contourner les restrictions d'accès.

Dans les grandes opérations gourmandes en ressources (traitement de republication de documents par exemple), une partie du code peut être déplacée vers des modules privilégiés.

UN) Module privilégié est un module commun avec le drapeau « Privilégié » dans les propriétés.

Sa particularité est que le code qu'il contient est exécuté sans aucun contrôle des droits d'accès, y compris RLS.


B) Aussi privilégié le mode peut être activé pour les modules d'objets de document. Cela se fait dans les propriétés du document, flag

  • Traitement privilégié lors de la conduite
  • Mode privilégié lors de l'annulation d'une transaction


B) Méthode SetPrivilegedMode()

La commande système vous permet de rendre privilégiée une partie du code de n’importe quel module.

A partir de la ligne de code suivante, le mode d'exécution privilégié fonctionnera.

Il fonctionnera jusqu'à la ligne pour désactiver ce mode ou jusqu'à la fin de la procédure/fonction

(Vrai);

// tout code ici sera exécuté sans contrôle des droits ni RLS

Définir le mode privilégié(Mensonge ); // ou fin de procédure/fonction

Le nombre de fois où le mode privilégié est activé doit correspondre au nombre de fois où il est désactivé. Cependant, si dans une procédure ou une fonction le mode privilégié a été activé (une ou plusieurs fois), mais n'a pas été désactivé, le système s'arrêtera automatiquement autant de fois qu'il y aura d'activations incomplètes dans la procédure ou la fonction laissée.

Si dans une procédure ou une fonction appelle une méthode Définir le mode privilégié(Faux) a fait plus que des appels de méthode Définir le mode privilégié(True ), alors une exception sera levée

Fonction Mode Privilégié() renvoie True si le mode privilégié est toujours activé, et False s'il est complètement désactivé. Cela n’analyse pas le nombre de paramètres de mode privilégié dans une fonction particulière.

Toutes les procédures et fonctions appelées seront également exécutées en mode privilégié.


Il est également possible de démarrer une session privilégiée. Il s'agit d'une session dans laquelle le mode privilégié est établi dès le début du système. De plus, pendant le fonctionnement, la méthode Mode Privilégié() renverra toujours True et la possibilité de désactiver le mode privilégié n'est pas prise en charge. Seul un utilisateur disposant de droits d'administration (droit d'administration) peut démarrer une session privilégiée. La session peut être démarrée à l'aide du commutateur de ligne de commande de lancement de l'application client UsePrivilegedMode ou du paramètre de chaîne de connexion à l'infobase prmod .


La question se pose naturellement : pourquoi alors imposer des restrictions d’accès si elles peuvent être si facilement contournées ?

Mode sans échec.

Oui, vous pouvez écrire des traitements externes avec un mode d'exécution privilégié et décharger/corrompre des données. Pour éviter cela, le système dispose d'une méthode de contexte global

Définir le mode sécurisé().

Le mode sans échec, entre autres, ignore le mode privilégié.

Il doit être installé avant d'appeler par programme des processeurs externes ou d'exporter des procédures et des fonctions à partir de leurs modules.

Lors de l'exécution d'opérations interdites, une exception est levée au moment de l'exécution.

De plus, au niveau des paramètres du rôle, vous pouvez désactiver la possibilité pour les utilisateurs de lancer de manière interactive des rapports et des traitements externes.

Configuration des restrictions d'accès

RLS ne peut être configuré que pour les droits :

  • lire (sélectionner)
  • ajouter (insérer)
  • changer (mettre à jour)
  • supprimer

Pour les opérations de lecture et suppression, un objet résidant dans la base de données doit se conformer aux restrictions d'accès aux données.

Pour l'opération d'ajout La restriction d'accès aux données doit correspondre à l'objet dont l'écriture est prévue dans la base de données.

Pour opération de changement la restriction d'accès aux données doit être conforme à l'objet à la fois avant le changement (pour que l'objet soit lu) et après le changement (pour que l'objet soit écrit).

Pour tous les autres droits, cette option n’existe pas.

Ajoutons une nouvelle restriction pour le droit « lecture » du répertoire « Nomenclature ». Une liste de champs pour lesquels vous pouvez configurer la restriction ajoutée s'ouvrira.

Cela signifie que si vous essayez d'accéder aux champs cochés, la restriction sera déclenchée, mais si vous essayez d'accéder aux champs non cochés, la restriction ne fonctionnera pas.

Si vous sélectionnez le drapeau " Autres domaines", la restriction sera configurée pour tous les champs de la table, à l'exception des champs pour lesquels des restrictions sont explicitement définies.


*Fonction : pour les droits d'ajout, de modification, de suppression :

  • La restriction ne peut être configurée que pour tous les champs.
  • Il ne peut y avoir qu'une seule restriction.

Pour le droit « Lire », vous pouvez configurer plusieurs conditions ; elles seront combinées avec l'opérateur logique « ET ».

Tous les champs de l'objet de données de contrainte principal ne peuvent pas être utilisés dans les restrictions sur les types d'objets de base de données suivants :

  • dans les registres d'accumulation, les restrictions d'accès ne peuvent contenir que des mesures de l'objet principal de la restriction ;
  • dans les registres comptables, les restrictions ne peuvent utiliser que les mesures du bilan de l'objet principal de la restriction

Si, dans des conditions d'accès limité aux données du registre d'accumulation circulant, des mesures non incluses dans les totaux sont utilisées, alors lors de l'accès au tableau virtuel des tours, les totaux stockés ne sont pas utilisés et la demande est effectuée entièrement selon la table de mouvement.

Mécanisme permettant d'imposer des restrictions d'accès.

Toute opération sur les données stockées dans une base de données dans 1C:Enterprise conduit finalement à un appel à la base de données avec une demande de lecture ou de modification des données. Lors du processus d'exécution de requêtes sur la base de données, les mécanismes internes de 1C:Enterprise imposent des restrictions d'accès. Où:

  • Une liste de droits est générée(lire, ajouter, modifier, supprimer), une liste de tables de base de données et une liste de champs utilisés par cette requête.
  • De tous les rôles de l'utilisateur actuel les restrictions d'accès sont sélectionnées aux données pour tous les droits, tables et champs impliqués dans la demande. De plus, si un rôle ne contient pas de restrictions d'accès aux données d'une table ou d'un champ, cela signifie que les valeurs des champs obligatoires de n'importe quel enregistrement sont disponibles dans cette table. En d'autres termes, l'absence de restriction d'accès aux données signifie la présence d'une restriction OÙ EST LE VRAI.
  • Récupère les valeurs actuelles de tous les paramètres de session et options fonctionnelles participer aux restrictions sélectionnées.

Pour obtenir la valeur d'un paramètre de session ou d'une option de fonctionnalité, l'utilisateur actuel n'a pas besoin d'être autorisé à obtenir cette valeur. Cependant, si la valeur d'un paramètre de session n'a pas été définie, une erreur se produira et la requête de base de données ne sera pas exécutée.

Les contraintes dérivées d'un rôle sont combinées à l'aide de l'opération AND.

Les contraintes dérivées de différents rôles sont combinées à l'aide de l'opération OR.

Les conditions construites sont ajoutées aux requêtes SQL avec lesquelles 1C : Enterprise accède au SGBD. Lors de l'accès aux données à partir de conditions de restriction d'accès, la vérification des droits n'est pas effectuée (ni pour les objets de métadonnées ni pour les objets de base de données). De plus, le mécanisme d'ajout de conditions dépend du mode de fonctionnement choisi des restrictions « toutes » ou « autorisées ».


*Fonctionnalité : Si un utilisateur a accès à plusieurs rôles avec des restrictions configurées au niveau de l'enregistrement pour un objet, alors dans ce cas, les conditions des restrictions sont ajoutées à l'aide de l'opération logique « OU ». Autrement dit, les pouvoirs de l'utilisateur sont cumulatifs.

Cela conduit à la conclusion suivante : ne laissez pas se croiser les conditions de restriction d'accès à un objet dans différents rôles, car dans ce cas, le texte de la requête sera très compliqué et cela affectera les performances.

Méthode "Tout".

Lors de l'imposition de restrictions à l'aide de la méthode « tout », des conditions et des champs sont ajoutés aux requêtes SQL afin que 1C:Enterprise puisse obtenir des informations indiquant si, lors de l'exécution d'une requête de base de données, des données interdites pour un utilisateur donné ont été utilisées ou non. Si des données interdites ont été utilisées, la demande plantera en raison d'une violation d'accès.

L'imposition de restrictions d'accès à l'aide de la méthode « tous » est présentée schématiquement dans la figure :


Méthode « Autorisée ».

Lors de l'application de restrictions à l'aide de la méthode « autorisée », des conditions sont ajoutées aux requêtes SQL afin que les enregistrements interdits pour l'utilisateur actuel n'affectent pas le résultat de la requête. Autrement dit, lorsque des restrictions sont imposées en mode « autorisé », les enregistrements interdits pour un utilisateur donné sont considérés comme manquants et n'affectent pas le résultat de l'opération, qui est schématiquement présenté sur la figure :


Des restrictions d'accès aux données sont imposées sur les objets de la base de données au moment où 1C:Enterprise accède à la base de données.

Dans la version client-serveur de 1C:Enterprise, des restrictions sont appliquées sur le serveur 1C:Enterprise.

Cependant, cette option (ALLOWED) ne fonctionnera pas si dans une requête nous faisons référence à une table pour laquelle les restrictions d'accès ne sont pas configurées, mais qui contient des références à des lignes de table avec des restrictions configurées. Dans ce cas, le résultat de la requête affichera «<Объект не найден>......" au lieu de la valeur du champ de référence.


Si vous développez un rapport ou un traitement à l'aide de requêtes de configuration standard ou personnalisées, vérifiez toujours le drapeau "Autorisé" pour que le rapport fonctionne sous n'importe quel utilisateur avec n’importe quel ensemble de droits.

Dans le cas d'une lecture par objet des données de la base de données, il n'est pas possible de positionner l'indicateur « Autorisé ». Il faut donc configurer les sélections pour la lecture des objets, en tenant compte des éventuelles restrictions de droits d'accès pour l'utilisateur. Il n'existe aucun moyen d'obtenir uniquement les données autorisées dans la technologie objet.

Il est important que si une requête ne spécifie pas le mot-clé ALLOWED, toutes les sélections spécifiées dans cette requête ne doivent entrer en conflit avec aucune des restrictions de lecture sur les objets de base de données utilisés dans la requête. De plus, si la requête utilise des tables virtuelles, alors les sélections correspondantes doivent être appliquées aux tables virtuelles elles-mêmes.

Pratique 1. Générateur de requêtes dans les paramètres RLS.

Composons le texte de la section « WHERE » dans la requête vers le répertoire. Vous pouvez utiliser le générateur de requêtes.
Le designer a une apparence épurée.


Onglet « Tableaux »

La table principale sera la table de l'objet pour lequel la contrainte est configurée.

Vous pouvez également sélectionner d'autres tables et établir diverses connexions entre elles dans l'onglet « Relations ».

Onglet "Conditions"

Ici, vous pouvez configurer les conditions réelles de restriction d'accès

Ajoutons des conditions à l'attribut « Prix » du répertoire de nomenclature pour le droit de « lire » sur tous les champs de la table.

«Nomenclature OÙ Nomenclature.Prix > 500»

Voyons comment fonctionne cette règle simple. La table répertoire contient les éléments suivants :


Après avoir mis en place une restriction d'accès, le tableau affichera uniquement les éléments qui satisfont à la condition :


Des groupes ont également disparu. Modifions le texte de la restriction

« Nomenclature OÙ Nomenclature.Prix > 500

Nomenclature OR. Ceci est un groupe"

Eh bien, maintenant c'est ce dont vous avez besoin.


Si vous supprimez l'affichage du champ « code » dans les paramètres de la liste, tous les éléments du répertoire seront affichés, c'est-à-dire la restriction n'a pas fonctionné. Si vous définissez le champ « Code » à afficher, la restriction fonctionnera.


Dans ce cas, malgré le fait que l'élément répertoire soit visible dans le champ liste, son formulaire ne peut pas être ouvert car une restriction sur l'attribut est configurée. La même chose se produit dans une requête arbitraire : lorsque vous essayez d'obtenir une propriété « restreinte », il y aura une erreur d'accès.


Si vous essayez d’obtenir les informations d’identification « restreintes » par programme, une erreur d’accès sera également générée.


De plus, il ne sera pas possible d'accéder à aucun champ d'un objet via un lien, car lors de la réception d'un lien, le système lit l'intégralité de l'objet, et s'il contient des détails « restreints », l'objet ne sera pas lu.

Par conséquent, lorsque vous travaillez par programmation avec des objets de base de données, vous devez garder à l'esprit les restrictions possibles au niveau de l'enregistrement et obtenir toutes les données d'objet nécessaires sur demande, puis les placer dans une structure ou exécuter une partie du code dans un module privilégié.

Après avoir paramétré la restriction d'accès, l'affichage de la ligne dans la liste des droits a changé : elle est devenue grise et une icône est apparue.

Restrictions lors de la configuration de l'accès (RLS).

  • Il n'y a pas de section Résumé ;
  • Les tables de registre virtuel ne sont pas accessibles ;
  • Vous ne pouvez pas utiliser les paramètres explicitement ;
  • Peut être utilisé dans des requêtes imbriquées any>/span> outils de langage de requête sauf :
    • opérateur DANS LA HIÉRARCHIE ;
    • propositions de RÉSULTATS ;
    • résultats de requête imbriqués ne doit pas contenir de parties de tableau>/span> ;
    • tables virtuelles, notamment les soldes et les chiffres d'affaires

Pratique 2. Nomenclature avec prix actuel.

Effectuez une restriction d'accès si vous devez afficher des articles dont le prix actuel est supérieur à une certaine valeur, par exemple 100.

Solution:

Nous ajoutons une nouvelle règle de restriction d'accès au répertoire « Nomenclature » avec le droit « lire ».
Sélectionnez « autres champs ».
Dans le constructeur, nous ajoutons une requête imbriquée. Dans celui-ci, sélectionnez le tableau du registre d'informations « Prix des articles ».
Il n'y a pas d'onglet « Ordre » - il s'agit d'une fonctionnalité du concepteur de requêtes permettant de créer une demande de restriction d'accès.
Dans l'onglet « Avancé », définissez « premier 999999999 », l'onglet « commande » apparaît.
Nous mettons en place un classement par champ « Période » par ordre décroissant.
Ensuite, nous établissons une connexion entre la table principale et la sous-requête par référence.


Modèles de restrictions d'accès.

Pratique 3. Restriction des « contreparties » par valeur dans une constante.

Mettons en place une restriction d'accès au répertoire Contreparties en fonction de la valeur stockée dans la Constante.

De plus, vous devez mettre en place une restriction pour tous les objets qui utilisent le répertoire « Contreparties » dans le détail.

Solution

Pour le répertoire « Contreparties », nous allons mettre en place une restriction pour le droit « lecture » en ajoutant une requête imbriquée à la constante dans la section « Conditions ». N'oubliez pas qu'il s'agit d'un groupe.

Nous constatons un problème, le répertoire Contreparties est filtré correctement, et tous les documents avec l'attribut « Contrepartie » sont affichés, certains avec des liens « rompus » dans l'attribut « Contrepartie ».

Vous devez maintenant configurer les restrictions d'accès pour tous les objets qui utilisent le lien vers « Comptes ». Retrouvons-les grâce au service « recherche de liens vers un objet ».

Copions et modifions légèrement le texte de la condition RLS du répertoire « Contreparties ». Cela doit être fait autant de fois qu’il y a d’objets trouvés.

Ou utilisez un modèle de restrictions d'accès pour éviter les problèmes de duplication de code.

Les modèles de restriction d'accès sont configurés au niveau du rôle et peuvent être utilisés pour n'importe quel objet au sein du rôle modifié.

Vous pouvez ajouter n’importe quel morceau de texte de restriction d’accès au modèle. Le modèle est appelé à l'aide du symbole « # ». Par exemple, #TemplateCounterparty.

Grâce à # dans 1C, les instructions sont écrites dans le préprocesseur. Dans le cadre de l'exécution des paramètres de restriction d'accès, la plateforme remplace le texte d'appel du modèle par le texte du modèle.

Ajoutons le texte après le mot OÙ au modèle « Modèle d'entrepreneur », à l'exception du texte sur EtoGroup.

Paramètres dans les modèles de restriction d'accès.

Continuons à résoudre le problème 2.

Le problème maintenant est que la table principale du répertoire s'appelle « contrepartie », dans le document « Réception de facture ». Le champ en cours de vérification dans l'annuaire s'appelle « lien », dans le document il s'appelle « Contrepartie ».

Changeons le nom de la table principale dans le texte du modèle en « #CurrentTable »

"#CurrentTable" est un paramètre prédéfini.

Et à travers un point, nous indiquons le numéro du paramètre d'entrée - « .#Parameter(1)

« #Parameter » est également une valeur prédéfinie. Peut contenir un nombre arbitraire de paramètres d'entrée. Ils sont adressés par numéro de série.

Dans le texte des restrictions d'accès à l'annuaire, nous indiquons ce qui suit :

Pour le document ce qui suit :

« Ventes de marchandises OÙ #TemplateCounterparty (« Contrepartie ») »

Lors de l'appel d'un modèle de restriction d'accès, les paramètres doivent lui être transmis uniquement sous forme de chaîne, c'est-à-dire entre guillemets.

Tableau principal - Nomenclature

Le texte du modèle est :

#CurrentTable OÙ #CurrentTable.#Paramètre(1) = #Paramètre(2)

Le texte du modèle contient une partie du texte dans le langage de restriction d'accès aux données et peut contenir des paramètres mis en évidence à l'aide du symbole « # ».

Le symbole "#" peut être suivi de :

  • Un des mots-clés :
    • Un paramètre suivi du numéro du paramètre dans le modèle entre parenthèses ;
    • CurrentTable – indique l'insertion dans le texte du nom complet de la table pour laquelle la contrainte est en cours de construction ;
    • Nom de la table actuelle– désigne l'insertion dans le texte du nom complet de la table (sous forme de valeur de chaîne, entre guillemets) à laquelle l'instruction est appliquée, dans la version actuelle du langage intégré ;
    • NomCurrentAccessRight– contient le nom du droit pour lequel la restriction en cours est exécutée : READ, ADD, INSERT, CHANGE, UPDATE, DELETE ;
  • nom du paramètre de modèle – signifie l'insertion de la contrainte de paramètre de modèle correspondante dans le texte ;
  • symbole « # » – indique l'insertion d'un caractère « # » dans le texte.

Une expression de restriction d'accès peut contenir :

  • Modèle de restriction d'accès, spécifié au format #TemplateName("Valeur du paramètre modèle 1", "Valeur du paramètre modèle 2",...). Chaque paramètre de modèle est entouré de guillemets doubles. Si vous devez spécifier un guillemet double dans le texte du paramètre, vous devez utiliser deux guillemets doubles.
  • Fonction StrContains (WhereWeLook, WhatWeLook). La fonction est conçue pour rechercher une occurrence de la chaîne WhatWeLook dans la chaîne WhereWeLook. Renvoie True si l'occurrence est trouvée et False sinon.
  • L'opérateur + est destiné à la concaténation de chaînes.

Pour faciliter la modification du texte du modèle, sous l'onglet Modèles de restriction du formulaire de rôle, cliquez sur le bouton Définir le texte du modèle. Dans la boîte de dialogue qui s'ouvre, saisissez le texte du modèle et cliquez sur OK.

Ils ne peuvent pas être installés à l'aide de DéfinirParamètre() ou quelque chose de similaire.

Les paramètres dans ce cas sont :

  • Options de séance
  • Options fonctionnelles

La lecture des paramètres de session dans une demande de restriction d'accès s'effectue en mode privilégié, c'est-à-dire sans contrôler les droits d'exploitation avec eux.

Pratique 4. Accès à « vos » contreparties

Il est nécessaire de configurer la restriction de l’accès de l’utilisateur actuel à « leurs » contreparties.

Il existe un répertoire « Utilisateurs », un répertoire « Contreparties », des documents avec le détail « Contrepartie ».

L'utilisateur actuel ne doit voir les données que des contreparties pour lesquelles une connexion a été établie avec lui.

La communication doit également être configurée.

Options possibles :

Établir des liens entre l'utilisateur et la contrepartie

  • Détails dans l'annuaire des contreparties
  • Registre des informations

Solutions possibles au problème :

  • Stocker un utilisateur dans une constante est une mauvaise option ; la constante est disponible pour tous les utilisateurs.
  • Stocker un tableau fixe des contreparties de l'utilisateur actuel dans les paramètres de session n'est pas une très bonne option ; il peut y avoir de nombreuses contreparties
  • Stocker dans la session les paramètres de l'utilisateur actuel, puis demander la liste de « ses » contreparties est une option acceptable.
  • Autres options.

Solution.

Créons un nouveau paramètre de session "CurrentUser" et remplissons-le dans le module de session.

Créons un registre d’informations « Conformité des gestionnaires et des entrepreneurs »

Créons un nouveau rôle et dans celui-ci une nouvelle restriction d'accès pour le document « Facture ».

Dans le texte de la demande, nous connecterons la table principale avec le registre d'informations pour Account = Account et Manager = &CurrentUser. Type de connexion Interne.

Si possible, il est préférable d'éviter les requêtes imbriquées dans les textes de restriction d'accès, car elles seront exécutées à chaque fois que des données seront lues à partir de cet objet depuis la base de données.

Vérification - les restrictions fonctionnent

*Fonctionnalité : Si vous modifiez la liste des contreparties utilisateurs dans le registre, les restrictions d'accès prendront effet immédiatement sans redémarrer la session utilisateur.

Pratique 5. Date d'interdiction des modifications.

Il est nécessaire de mettre en œuvre une restriction sur l'édition des données avant la date fixée pour interdire les modifications.
Vous devez le limiter pour les utilisateurs.

Créons un registre d'informations « Dates d'interdiction de modifications » avec la dimension Utilisateur, ressource Date d'interdiction.

Construisons la logique de la solution de cette façon :

  • si un utilisateur n'est pas spécifié, alors l'interdiction s'applique à tous les utilisateurs
  • s'il existe une restriction pour tous les utilisateurs et une restriction pour un utilisateur spécifique, alors la restriction s'applique à un utilisateur spécifique et aux autres selon le principe général.

Évidemment, une telle contrainte peut être configurée pour les objets de base de données ayant une certaine position sur l'axe du temps. Ça peut être

  • Documentation
  • Registres d'informations périodiques

Créons un nouveau rôle « Restrictions par date d'interdiction de modification ».

Dans celui-ci, pour le document « Réception de facture » pour le droit « modification », nous ajouterons une nouvelle restriction d'accès.

Nous spécifions le paramètre pour tous les champs.

Le texte de la restriction est le suivant :

ReçuInvoice FROM Document.ReceiptInvoice AS ReçuInvoice

Modifier les dates d'interdiction. Date d'interdiction AS Date d'interdiction
DEPUIS

JOINTURE INTÉRIEURE (SÉLECTIONNER
MAX (Modifier les dates interdites. Utilisateur) AS Utilisateur
DEPUIS
Registre des informations Dates d'interdiction de modifications AS Dates d'interdiction de modifications

(Modifier les dates interdites.User = &CurrentUser
OU Dates ProhibitedChanges.User = VALUE(Directory.users.EmptyLink))) AS VZ_User
BY Date d'interdiction des modifications.User = VZ_User.User) AS NestedQuery
Facture de réception du logiciel.Date > Requête imbriquée.Date d'interdiction

Vérifions : la restriction fonctionne.

Utilisation des instructions du préprocesseur

#Si Condition1 #Alors

Demander le fragment 1

#AutreSi Condition2 #Alors

Demander le fragment 2

#Sinon

Demander le fragment 3

#Fin si

Dans certaines conditions, vous pouvez utiliser des opérations logiques (et, ou, non, etc.) et accéder aux paramètres de session.

Cette approche dans le contexte de la construction de restrictions d'accès est pratique dans la mesure où, en fonction des conditions, un texte de demande plus court sera compilé. Une requête plus simple charge moins le système.

L'inconvénient est que le constructeur de requêtes ne fonctionnera pas avec un tel texte.

*Particulaire :

Contrairement aux instructions adressées au préprocesseur du langage intégré dans les textes de restriction d'accès, avant l'opérateur Ensuite, vous devez mettre un hachage - #Alors

Pratique 6. Changer « Utiliser RLS »

Complétons notre système de restrictions avec un interrupteur qui active/désactive l'utilisation des restrictions au niveau de l'enregistrement.

Pour ce faire, nous ajouterons une Constante et un paramètre de session nommé « UseRLS ».

Écrivons dans le module de session pour définir la valeur du paramètre de session à partir de la valeur de la constante.

Ajoutons le code suivant à tous les textes de restriction d'accès :

« #Si &UtiliserRLS #Alors….. #EndIf »

Nous vérifions - tout fonctionne.

Cependant, maintenant, après avoir activé le drapeau « utiliser le radar », les modifications ne prendront pas effet immédiatement. Pourquoi?

Parce que le paramètre de session est défini au démarrage de la session.

Il est possible de définir la valeur du paramètre de session à réinitialiser lorsqu'une nouvelle valeur constante est écrite, mais cela ne fonctionnera que pour la session utilisateur en cours. Les autres utilisateurs doivent être invités à redémarrer le système.


Fin de la première partie.

). L'utilisation de ce mot-clé permet d'éviter les erreurs lors de la récupération d'enregistrements pour lesquels l'utilisateur ne dispose pas de droits.

Problème: Dans certains cas, le résultat des restrictions d'accès aux données dans 1C 8.3 peut dépendre du plan de requête du SGBD. Cet article examine les situations possibles et donne des recommandations sur la manière d'éviter cela.

Le problème d'une éventuelle dépendance du résultat des restrictions d'accès aux données sur le plan de requête du SGBD peut survenir lors de l'exécution d'une requête de base de données sans mot-clé AUTORISÉ, si l'utilisateur actuel a des restrictions d'accès aux données et que la demande contient une ou plusieurs comparaisons du formulaire :

  • <Выражение над полями>(DANS|PAS DANS) (<Вложенный запрос>)
  • (<Выражение над полями 1>, …, <Выражение над полями N>) (DANS|PAS DANS) (<Вложенный запрос>)

Si dans ce cas < > (une requête dans une requête) utilise des tables de bases de données sur lesquelles des restrictions d'accès sont imposées, il est possible que sur certains SGBD la requête soit exécutée avec succès, tandis que sur d'autres un message sera émis à condition que les données dans les bases d'informations soient totalement identiques .

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

Raison des différences

La différence de comportement possible est due à la mise en place de restrictions d'accès aux données sans mot-clé AUTORISÉ dans 1C Entreprise 8.3.

Requête sans mot clé AUTORISÉ ne sera exécuté avec succès que si, lors de son exécution, aucun accès aux données interdites ne se produit. Pour ce faire, un champ de signal spécial est ajouté, qui prend la valeur Vrai pour les enregistrements à la formation desquels seules les données autorisées ont participé, et la valeur Mensonge pour toutes les autres entrées. Si au moins un exemple d'enregistrement contient la valeur Mensonge dans le champ signal, l'exécution de la requête se termine anormalement.

Le même champ de signal est ajouté aux résultats des requêtes imbriquées dans la comparaison DANS/PAS DEDANS. De plus, la vérification de la valeur de la colonne de signal dans ce cas est effectuée à l'aide d'outils SGBD. Ainsi, si lors de l'exécution d'une requête imbriquée, des données interdites ont été accédées, alors la requête devrait échouer avec une erreur L'utilisateur ne dispose pas des droits suffisants pour effectuer une opération sur la base de données.

Cependant, lors de la création d'un plan de requête, le SGBD peut ne pas recevoir l'échantillon complet <Вложенным запросом> , et recevez uniquement les enregistrements réellement nécessaires pour vérifier l'état DANS/PAS DEDANS. Dans ce cas, la demande peut aboutir même si le <Вложенного запроса> en tant que demande indépendante, l'accès à des données interdites pourrait avoir lieu.

Regardons un exemple simple. Laisser sur la table Annuaire.Individus des restrictions d’accès aux données sont imposées. Dans ce cas la demande :

Tableau.Individu AS Individuel

sera exécuté avec une erreur due à une tentative d’accès à des données interdites. Si cette requête intervient en comparaison, par exemple :

Tableau.Individu AS Individuel

Annuaire.Individus AS Table)

puis, en fonction du plan de requête SGBD sélectionné, la requête peut être exécutée avec succès ou avec une erreur. Ce comportement de requête n'est pas une erreur car les données interdites peuvent ou non être accessibles pendant l'exécution de la requête. Pour obtenir un résultat plus prévisible, il est nécessaire de construire une requête de telle manière que la requête imbriquée soit garantie de ne pas accéder à des données manifestement inutiles. En particulier, si la requête précédente est réécrite comme ceci :

Accord pour l'exécution d'un travail avec un particulier.Employé.Particulier

Document. Accord pour l'exécution de travaux avec une personne physique COMME Accord pour l'exécution de travaux avec une personne physique

Accord pour l'exécution du travail avec l'individu.employé.individuel B (

Tableau.Individu AS Individuel

Table Annuaire.Individus AS

Une requête est un outil puissant qui permet d'obtenir et de traiter rapidement (par rapport à toutes les autres méthodes) les données contenues dans divers objets de la base d'informations 1C.

Créer une demande

La demande est créée en tant qu'objet distinct doté d'un attribut obligatoire Texte, où la demande elle-même est réellement placée. De plus, divers paramètres nécessaires à son exécution peuvent être transmis à la requête. Une fois le texte et les paramètres de la requête renseignés, la requête doit être exécutée et le résultat de l'exécution placé dans une sélection ou un tableau de valeurs. Tout ressemble à ceci :

//Créer une requête
Demande = nouvelle demande ;

//Remplissez le texte de la demande
Demande. Texte= "Ici, nous écrivons le texte de la demande";

// Passer les paramètres à la requête
Demande. SetParameter("ParameterName" , ParameterValue) ;

//Exécuter la requête
Résultat = Requête. Courir() ;

// Téléchargez le résultat de la requête dans la sélection
Échantillon = Résultat. Choisir() ;

// Téléchargez le résultat de la requête dans la table de valeurs
Tableau = Résultat. Décharger() ;

//Les dernières actions peuvent être combinées
Récupérer = Requête. Courir() . Choisir() ;
//ou
Tableau = Requête. Courir() . Décharger() ;

Bases du langage de requête 1C

Les requêtes les plus simples et les plus fréquemment utilisées sont utilisées pour obtenir des données à partir d'une source donnée. La source peut être presque tous les objets contenant des données quelconques : répertoires, documents, registres, constantes, énumérations, plans de types de caractéristiques, etc.

A partir de ces objets, à l'aide d'une requête, vous pouvez obtenir les valeurs des détails, des parties de tableau, des détails des parties de tableau, des modifications, des ressources, etc.

Pour obtenir le texte de la demande, il est souvent pratique d'utiliser Constructeur de requête. Il est appelé lorsque vous cliquez avec le bouton droit n'importe où dans le module du programme.

Par exemple, si vous avez besoin d'obtenir les valeurs de tous les détails du répertoire Contreparties, alors la requête ressemblera à ceci :

Demande. Texte = "CHOISIR
| *
|DE
| Annuaire. Contreparties"
;

Si vous n'avez besoin d'obtenir que des détails individuels, procédez comme suit :

Demande. Texte = "CHOISIR
| Code,
| Nom,
| Parent
|DE
| Annuaire. Contreparties"
;

Pour recevoir une telle demande par SMS Constructeur de requête vous devez sélectionner les champs appropriés dans l'onglet Tableaux et champs.

Vous pouvez attribuer des alias aux éléments et sources sélectionnés dans la requête et les utiliser ultérieurement à la fois dans la requête elle-même et lorsque vous travaillez avec le résultat. De plus, la requête peut contenir des champs avec une valeur spécifique prédéfinie, ou avec une valeur calculée :

Demande. Texte = "CHOISIR
| Clients.Code AS Numéro,

| 1000 AS ChampAvecValeur
|DE
;

Récupérer = Requête. Courir() . Choisir() ;

Au revoir la sélection. Boucle Suivant()
ClientNumber = Échantillon. Nombre;
ClientName = Sélection. Nom;
Valeur = Échantillon. ChampAvecValeur ;
Fin du cycle ;

Utilisez l'onglet pour définir des alias Syndicats/Alias V Générateur de requêtes.

Un champ à valeur fixe ou calculée est créé manuellement sur l'onglet Tables et champs, dans une colonne Des champs.

Tous les éléments sélectionnés peuvent être disposés dans l'ordre direct ou inverse. Vous pouvez sélectionner un ou plusieurs champs pour la commande. En plus de l'organisation, il peut parfois être utile de sélectionner un ou quelques-uns des premiers éléments.

//Classez les clients par nom de A à Z et sélectionnez les 10 premiers
Demande. Texte = "SÉLECTIONNEZ LES 10 PREMIERS
| Clients.Code AS Numéro,
| Clients.Nom AS Nom,
| 1000 AS ChampAvecValeur
|DE

|COMMANDER PAR
| Nom"
;

//Sélectionnez le client alphabétique le plus récent
Demande. Texte = "SÉLECTIONNER LE TOP 1
| Clients.Code AS Numéro,
| Clients.Nom AS Nom,
| 1000 AS ChampAvecValeur
|DE
| Annuaire Contreparties AS Clients
|COMMANDER PAR
| Nom DIMINUTION"
;

Vous pouvez limiter la sélection des éléments à ceux pour lesquels l'utilisateur dispose de droits d'accès. Ou supprimez les lignes en double du résultat de la requête.

//Données d'échantillonnage autorisées à l'utilisateur
Demande. Texte = "SÉLECTION AUTORISÉE
| Clients.Code AS Numéro,
| Clients.Nom AS Nom,
| 1000 AS ChampAvecValeur
|DE
| Annuaire "Contreparties AS Clients"
;

//Sélection d'éléments non répétitifs
Demande. Texte = " SÉLECTIONNEZ DIVERS
| Clients.Code AS Numéro,
| Clients.Nom AS Nom,
| 1000 AS ChampAvecValeur
|DE
| Annuaire "Contreparties AS Clients"
;

La commande est définie sur l'onglet Commande V Générateur de requêtes le nombre d'éléments sélectionnés, les paramètres de résolution et de répétabilité sont sur l'onglet En plus.

À suivre…