Une tentative a été effectuée pour insérer une valeur non unique dans un index unique. Erreur : tentative d'insertion d'une valeur non unique dans un index unique : serveur Microsoft SQL. lors du passage d'un professionnel de la comptabilité à une entreprise et pas seulement Supprimer les index non uniques dans le fichier 1c 8

Vous avez reçu un message contenant les lignes :
Fournisseur Microsoft OLE DB pour SQL Server : CREATE UNIQUE INDEX s'est arrêté car une clé en double a été trouvée pour l'ID d'index
ou
Impossible de dupliquer la ligne de clé I_nsert dans l'objet
ou
Une tentative a été effectuée pour insérer une valeur non unique dans un index unique.

Solutions:

1. Dans SQL Server Management Studio, nous détruisons physiquement l'index défectueux (dans mon cas, il s'agissait d'un index sur la table des totaux du registre comptable). En 1C, nous distribuerons les documents défectueux. En mode test et correction, cochez les cases réindexation des tableaux + recalcul des totaux. 1C recrée l'index sans erreur. Nous réalisons des documents précédemment échoués.

2. 1) À l'aide de Management Studio 2005, j'ai généré un script de création pour créer un index, qui était bogué, et je l'ai enregistré dans un fichier.
2) Tué manuellement l'index du montant de la table _AccumRgTn19455
3) Lancé une demande comme
Code SQL S_elect count(*), index_fields
DE AccumRgTn19455
GROUPE PAR champ_index
AVOIR compte(*)>1
Après la suppression de l'index, 15 enregistrements en double étaient affichés, bien qu'avant l'étape 2, la requête ne renvoyait rien.
4) J'ai parcouru toutes les entrées et nettoyé manuellement les doublons. En fait, j’ai également utilisé le traitement « Structure du rapport » pour comprendre à quoi j’avais affaire. Il s'est avéré que la table _AccumRgTn19455 stocke le registre d'accumulation « Sortie de produits (comptabilité fiscale) ». J'ai également bricolé des requêtes SQL, identifié 15 documents non uniques, et une fois toutes les actions terminées, j'ai vérifié dans 1C que ces documents étaient traités normalement, sans erreurs. Bien sûr, il ne faut pas nettoyer les tables au hasard : il est important de comprendre ce qui est nettoyé et comment cela peut se produire.
5) Lancement d'une demande de création d'un index, qui a été enregistré dans un fichier.
6) Basculez la base de données en mode mono-utilisateur et lancez dbcc checkdb - cette fois, aucune erreur n'a été générée.
7) Remettre la base en mode mono-utilisateur.
Ça y est... le problème est résolu. Eh bien, dans 1C, j'ai lancé "Tests et corrections", tout s'est bien passé là aussi, j'ai arrêté de me plaindre de l'index non unique.

3. Si la non-unicité réside dans des dates avec des valeurs nulles, alors le problème est résolu en créant une base de données avec un paramètre de décalage égal à 2000.

1. Si le problème vient du chargement de la base de données, alors :
1.1. Si vous chargez (à l'aide d'un fichier dt) dans une base de données MS SQL Server, lors de la création de la base de données, avant le chargement, spécifiez le décalage de date - 2000.
Si la base de données a déjà été créée avec le décalage 0, créez-en une nouvelle avec 2000.

1.2. S'il est possible de travailler avec la base de données dans la version fichier, effectuez des tests et des corrections, ainsi que Configuration - Vérification de la configuration - Vérification de l'intégrité logique de la configuration + Recherche des liens incorrects.

1.3. S'il n'y a pas de version de fichier, essayez de charger depuis DT vers une version client-serveur avec DB2 (qui est moins exigeante en unicité), puis effectuez des tests et des corrections, ainsi que Configuration - Vérifier la configuration - Vérifier l'intégrité logique de la configuration. + Recherche de références invalides.

1.4. Pour localiser le problème, vous pouvez déterminer les données de l'objet dont le chargement a échoué. Pour ce faire, vous devez activer le traçage dans l'utilitaire Profiler lors du démarrage ou activer l'enregistrement dans le journal des événements de processus DBMSSQL et EXCP.

2. Si le problème de non-unicité survient pendant que les utilisateurs travaillent :

2.1. Recherchez la requête problématique en utilisant la méthode du paragraphe 1.4.

2.1.2. Parfois, une erreur se produit lors de l'exécution des requêtes, par exemple :

Cette erreur est due au fait que dans le module du registre d'accumulation « Temps de travail des employés des organisations » dans la procédure « Recalculs du registre », le mot de service « DIFFÉRENT » n'est pas inclus dans la demande.
Code 1C v 8.x, c'est-à-dire devrait être:
Demande = Nouvelle demande (
" SÉLECTIONNEZ DIVERS
| Basique.Individuel,
. . . . .
Dans les dernières versions de ZUP et UPP, l'erreur ne se produit pas, car il est écrit "DIFFÉRENT".

2.2. Après avoir trouvé l'index problématique du paragraphe précédent, vous devez trouver un enregistrement non unique.
2.2.1. Script "Fish" pour identifier les enregistrements non uniques à l'aide de SQL :
Code SQL S_elect COUNT(*) Compteur,<перечисление всех полей соответствующего индекса>depuis<имя таблицы>
PAR GROUPE<перечисление всех полей соответствующего индекса>
AYANT Compteur > 1

2.2.2 Exemple. L'index dans l'erreur s'appelle "_Document140_VT1385_IntKeyIndNG".
Liste des champs du tableau :
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393 _RRRef, _Fld1394,_ Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld222 61_RTRef, _Fld22261_RRRef
Avant d'effectuer la procédure ci-dessous, veuillez sauvegarder votre base de données.
Exécuter dans l'analyseur de requêtes MS SQL Server :
Code SQL S_elect count(*), _Document140_IDRRef, _KeyField
à partir du_Document140_VT1385
regrouper par _Document140_IDRRef, _KeyField
ayant count(*) > 1
Utilisez-le pour connaître les valeurs des colonnes _Document140_IDRRef, _KeyField, enregistrements en double (id, clé).

Utilisation de la requête :
Code SQL S_élect *
à partir du_Document140_VT1385
ou _Document140_IDRRef = id2 et _KeyField = key2 ou...
regardez les valeurs des autres colonnes des entrées en double.
Si les deux entrées ont des valeurs significatives et que les valeurs sont différentes, modifiez la valeur _KeyField pour qu'elle soit unique. Pour ce faire, déterminez la valeur maximale occupée de _KeyField (keymax) :
Code SQL S_elect max(_KeyField)
à partir du_Document140_VT1385
où _Document140_IDRRef = id1
Remplacez la valeur _KeyField dans l'une des entrées en double par la bonne :
Mise à jour du code SQL _Document140_VT1385
définir _KeyField = keymax + 1
Ici, _LineNo1386 = est une condition supplémentaire qui vous permet de sélectionner l'un des deux enregistrements répétitifs.

Si l’une (ou les deux) des entrées en double a une signification manifestement incorrecte, alors elle doit être supprimée :
Suppression du code SQL de _Document140_VT1385
où _Document140_IDRRef = id1 et _LineNo1386 = lineno1
Si les entrées en double ont les mêmes valeurs dans toutes les colonnes, vous devez alors en laisser une :
Code SQL S_elec distinct *
dans #tmp1
à partir du_Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

Supprimer du _Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

I_insérer dans _Document140_VT1385
S_électionner #tmp1

Déposer la table #tmp1

La procédure décrite doit être effectuée pour chaque paire d'enregistrements en double.

2.2.3. Deuxième exemple :
Code SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DE _Référence8_
GROUPE PAR _IDRRef, _Description
AVOIR (COUNT(*) > 1)

2.3.4 Un exemple de détermination d'enregistrements non uniques à l'aide d'une requête 1C:Enterprise :
Code 1C v 8.x SELECT Directory.Link
FROM Répertoire.Répertoire AS Répertoire
GROUP BY Annuaire.Lien
AYANT UNE QUANTITÉ(*) > 1

Cet article décrira quoi faire si, lorsque vous travaillez avec 1C:Enterprise 8.1, vous rencontrez un message contenant les lignes :

Impossible d'insérer une ligne de clé en double dans l'objet

Une tentative a été effectuée pour insérer une valeur non unique dans un index unique.

Qu'est-ce qu'un indice ?

Les index sont une structure qui permet un accès rapide aux lignes d'un tableau en fonction des valeurs d'une ou plusieurs de ses colonnes.
Un index contient des clés, construites à partir d'une ou plusieurs colonnes d'une table ou d'une vue, et des pointeurs qui correspondent à l'emplacement de stockage des données spécifiées.
Les index réduisent la quantité de données qui doivent être lues pour renvoyer un ensemble de résultats.

Bien qu'un index soit associé à une ou plusieurs colonnes spécifiques d'une table, il s'agit toujours d'un objet de base de données distinct.

Les index des tables de la base de données 1C:Enterprise sont créés implicitement lors de la création d'objets de configuration, ainsi que lors de certains paramétrages d'objets de configuration.

L'essence physique des index dans MS SQL Server 2005.

Physiquement, les données sont stockées sur des pages de 8 Ko. Immédiatement après sa création, même si la table ne possède pas d'index, elle ressemble à un tas de données. Les enregistrements n'ont pas d'ordre de stockage spécifique.
Lorsque vous souhaitez accéder aux données, SQL Server produira analyse de table(analyse du tableau). SQL Server analyse la table entière pour trouver les enregistrements qu'il recherche.
À partir de là, les fonctions de base des index deviennent claires :
— augmenter la vitesse d'accès aux données,
— prise en charge de l'unicité des données.

Malgré leurs avantages, les indices présentent également un certain nombre d’inconvénients. Le premier concerne les index prendre de l'espace disque supplémentaire et en RAM. Chaque fois que vous créez un index, vous stockez les clés par ordre décroissant ou croissant, qui peuvent avoir une structure à plusieurs niveaux. Et plus la clé est grande/longue, plus la taille de l'index est grande. Le deuxième inconvénient est les opérations ralentissent insertion, mise à jour et suppression d'enregistrements.
Dans l'environnement MS SQL Server 2005, plusieurs types d'index sont implémentés :

  • index non clusterisés ;
  • index clusterisés (ou clusterisés) ;
  • index uniques ;
  • index avec colonnes incluses
  • vues indexées
  • texte intégral

Indice unique

L'unicité des valeurs de la colonne indexée est garantie par des index uniques. S'ils sont présents, le serveur ne vous permettra pas d'insérer une nouvelle valeur ou de modifier une valeur existante de telle sorte qu'à la suite de cette opération, deux valeurs identiques apparaissent dans la colonne.
Un index unique est une sorte de module complémentaire et peut être implémenté pour les index clusterisés et non clusterisés. Une table peut avoir un index clusterisé unique et plusieurs index non clusterisés uniques.
Les index uniques ne doivent être définis que lorsque cela est vraiment nécessaire. Pour garantir l'intégrité des données sur une colonne, vous pouvez définir une contrainte d'intégrité UNIQUE ou PRIMARY KEY plutôt que de recourir à des index uniques. Les utiliser uniquement pour garantir l’intégrité des données constitue un gaspillage d’espace dans la base de données. De plus, le temps CPU est également consacré à leur maintenance.

1C:Enterprise 8.1, à partir de la version 8.1, utilise activement des index uniques clusterisés. Cela signifie que lors d'une conversion depuis la version 8.0 ou d'une migration depuis la version 8.1.7, vous pouvez obtenir une erreur d'index non unique.

Si la non-unicité réside dans les dates avec des valeurs nulles, alors le problème est résolu en créant une base de données avec un paramètre de décalage égal à 2000.

Ce qu'il faut faire?

1. Si le problème vient du chargement de la base de données, alors :

1.1. Si vous effectuez un chargement (à l'aide d'un fichier dt) dans une base de données MS SQL Server, lors de la création de la base de données, avant le chargement, spécifiez le décalage de date - 2000.

Si la base de données a déjà été créée avec le décalage 0, créez-en une nouvelle avec 2000.

1.2. S'il est possible de travailler avec la base de données dans la version fichier, effectuez des tests et des corrections, ainsi que Configuration - Vérification de la configuration - Vérification de l'intégrité logique de la configuration + Recherche des liens incorrects.

1.3. S'il n'y a pas de version de fichier, essayez de charger depuis DT vers une version client-serveur avec DB2 (qui est moins exigeante en unicité), puis effectuez des tests et des corrections, ainsi que Configuration - Vérifier la configuration - Vérifier l'intégrité logique de la configuration. + Recherche de références invalides.

1.4. Pour localiser le problème, vous pouvez déterminer les données de l'objet dont le chargement a échoué. Pour ce faire, vous devez activer le traçage dans l'utilitaire Profiler lors du démarrage ou activer l'enregistrement dans le journal des événements technologiques DBMSSQL et EXCP.

1.5. Si le nœud (plans d'échange) est disponible, effectuez l'échange. Vous pouvez également compléter en plus le paragraphe 2.3.5 avant d'échanger

2. Si le problème de non-unicité survient pendant que les utilisateurs travaillent :

2.1. Recherchez la requête problématique en utilisant la méthode du paragraphe 1.4.

2.1.2. Parfois, une erreur se produit lors de l'exécution des requêtes, par exemple :

Cette erreur est due au fait que dans le module du registre d'accumulation « Temps de travail des employés des organisations » dans la procédure « Recalculs du registre », le mot de service « DIFFÉRENT » n'est pas inclus dans la demande.

Ceux. devrait être:

Demande = Nouvelle demande (
" SÉLECTIONNEZ DIVERS
| Basique.Individuel,

Dans les dernières versions de ZUP et UPP, l'erreur ne se produit pas, car il est écrit « DIFFÉRENT ».

2.2. Après avoir trouvé l'index problématique du paragraphe précédent, vous devez trouver un enregistrement non unique.

2.2.1. Script "Fish" pour identifier les enregistrements non uniques à l'aide de SQL :
SELECT COUNT(*) Compteur,<перечисление всех полей соответствующего индекса>depuis<имя таблицы>
PAR GROUPE<перечисление всех полей соответствующего индекса>
AYANT Compteur > 1

2.2.2 Exemple. L'index dans l'erreur s'appelle "_Document140_VT1385_IntKeyIndNG".

Liste des champs du tableau :

Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_RRRef, _Fld1394,

Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_RTRef, _Fld222 61_RRRef

Avant d'effectuer la procédure ci-dessous, veuillez sauvegarder votre base de données.
Exécuter dans l'analyseur de requêtes MS SQL Server :

sélectionnez le nombre (*), _Document140_IDRRef, _KeyField
à partir du_Document140_VT1385
regrouper par _Document140_IDRRef, _KeyField
ayant count(*) > 1

Utilisez-le pour connaître les valeurs des colonnes _Document140_IDRRef, _KeyField, enregistrements en double (id, clé).

Utilisation de la requête :

sélectionner *
à partir du_Document140_VT1385
ou _Document140_IDRRef = id2 et _KeyField = key2 ou …

regardez les valeurs des autres colonnes des entrées en double.

Si les deux entrées ont des valeurs significatives et que les valeurs sont différentes, modifiez la valeur _KeyField pour qu'elle soit unique. Pour ce faire, déterminez la valeur maximale occupée de _KeyField (keymax) :

sélectionnez max (_KeyField)
à partir du_Document140_VT1385
où _Document140_IDRRef = id1

Remplacez la valeur _KeyField dans l'une des entrées en double par la bonne :

update_Document140_VT1385
définir _KeyField = keymax + 1

Ici, _LineNo1386 = est une condition supplémentaire qui vous permet de sélectionner l'un des deux enregistrements répétitifs.

Si l’une (ou les deux) des entrées en double a une signification manifestement incorrecte, alors elle doit être supprimée :


où _Document140_IDRRef = id1 et _LineNo1386 = lineno1

Si les entrées en double ont les mêmes valeurs dans toutes les colonnes, vous devez alors en laisser une :

sélectionnez distinct *
dans #tmp1
à partir du_Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

supprimer du _Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

insérer dans _Document140_VT1385
sélectionnez #tmp1

déposer la table #tmp1

La procédure décrite doit être effectuée pour chaque paire d'enregistrements en double.

2.2.3. Deuxième exemple :

SELECT COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DE _Référence8_
GROUPE PAR _IDRRef, _Description
AVOIR (COUNT(*) > 1)

2.3.4 Un exemple de détermination d'enregistrements non uniques à l'aide d'une requête 1C:Enterprise :

ou pour la comptabilité

CHOISIR
Sous-requête.Période,
Sous-requête.Registrator,
<измерения>,
SUM (Sous-requête. Nombre d'enregistrements) AS Nombre d'enregistrements
DEPUIS
(CHOISIR
Autonome.Période AS Période,
Autonome.Registraire AS Registraire,
<измерения>,
1 AS Nombre d'enregistrements
DEPUIS
Registre comptable (AS autoportant) AS Sous-requête

PAR GROUPE
Sous-requête.Période,
Sous-requête.Registrator,
<измерения>

AYANT
SOMME (Sous-requête. Nombre d'enregistrements) > 1

2.3.5 Rendre l'index subd non unique. Créez un script pour l'index à l'aide de Management Studio.

2.3.6 Un cas particulier lors des échanges dans le RDB. L'erreur se produit dans les tableaux « auxiliaires » associés au calcul des totaux ou aux analyses. Par exemple:

Erreur lors de l'appel de la méthode contextuelle (Write) : tentative d'insertion d'une valeur non unique dans un index unique :
Fournisseur Microsoft OLE DB pour SQL Server : impossible d'insérer une ligne de clé en double dans l'objet 'dbo._AccntRegED10319' avec l'index unique '_Accnt10319_ByPeriod_TRNRN'.
HRESULT=80040E2F, SQLSrvr : état d'erreur=1, gravité=E, natif=2601, ligne=1

Dans ce cas, avant le chargement, désactivez l'utilisation des totaux, chargez le message, activez l'utilisation des totaux et recalculez.

Vous avez reçu un message contenant les lignes :
Fournisseur Microsoft OLE DB pour SQL Server : CREATE UNIQUE INDEX s'est arrêté car une clé en double a été trouvée pour l'ID d'index
ou
Impossible de dupliquer la ligne de clé I_nsert dans l'objet
ou
Une tentative a été effectuée pour insérer une valeur non unique dans un index unique.

Solutions:

1. Dans SQL Server Management Studio, nous détruisons physiquement l'index défectueux (dans mon cas, il s'agissait d'un index sur la table des totaux du registre comptable). En 1C, nous distribuerons les documents défectueux. En mode test et correction, cochez les cases réindexation des tableaux + recalcul des totaux. 1C recrée l'index sans erreur. Nous réalisons des documents précédemment échoués.

2. 1) À l'aide de Management Studio 2005, j'ai généré un script de création pour créer un index, qui était bogué, et je l'ai enregistré dans un fichier.
2) Tué manuellement l'index du montant de la table _AccumRgTn19455
3) Lancé une demande comme
Code SQL S_elect count(*), index_fields
FR OM AccumRgTn19455
GROUPE PAR champ_index
AVOIR compte(*)>1
Après la suppression de l'index, 15 enregistrements en double étaient affichés, bien qu'avant l'étape 2, la requête ne renvoyait rien.
4) J'ai parcouru toutes les entrées et nettoyé manuellement les doublons. En fait, j’ai également utilisé le traitement « Structure du rapport » pour comprendre à quoi j’avais affaire. Il s'est avéré que la table _AccumRgTn19455 stocke le registre d'accumulation « Sortie de produits (comptabilité fiscale) ». J'ai également bricolé des requêtes SQL, identifié 15 documents non uniques, et une fois toutes les actions terminées, j'ai vérifié dans 1C que ces documents étaient traités normalement, sans erreurs. Bien sûr, il ne faut pas nettoyer les tables au hasard : il est important de comprendre ce qui est nettoyé et comment cela peut se produire.
5) Lancement d'une demande de création d'un index, qui a été enregistré dans un fichier.
6) Basculez la base de données en mode mono-utilisateur et lancez dbcc checkdb - cette fois, aucune erreur n'a été générée.
7) Remettre la base en mode mono-utilisateur.
Ça y est... le problème est résolu. Eh bien, dans 1C, j'ai lancé "Tests et corrections", tout s'est bien passé là aussi, j'ai arrêté de me plaindre de l'index non unique.

3. Si la non-unicité réside dans des dates avec des valeurs nulles, alors le problème est résolu en créant une base de données avec un paramètre de décalage égal à 2000.

1. Si le problème vient du chargement de la base de données, alors :
1.1. Si vous chargez (à l'aide d'un fichier dt) dans une base de données MS SQL Server, lors de la création de la base de données, avant le chargement, spécifiez le décalage de date - 2000.
Si la base de données a déjà été créée avec le décalage 0, créez-en une nouvelle avec 2000.

1.2. S'il est possible de travailler avec la base de données dans la version fichier, effectuez des tests et des corrections, ainsi que Configuration - Vérification de la configuration - Vérification de l'intégrité logique de la configuration + Recherche des liens incorrects.

1.3. S'il n'y a pas de version de fichier, essayez de charger depuis DT vers une version client-serveur avec DB2 (qui est moins exigeante en unicité), puis effectuez des tests et des corrections, ainsi que Configuration - Vérifier la configuration - Vérifier l'intégrité logique de la configuration. + Recherche de références invalides.

1.4. Pour localiser le problème, vous pouvez déterminer les données de l'objet dont le chargement a échoué. Pour ce faire, vous devez activer le traçage dans l'utilitaire Profiler lors du démarrage ou activer l'enregistrement dans le journal des événements de processus DBMSSQL et EXCP.

2. Si le problème de non-unicité survient pendant que les utilisateurs travaillent :

2.1. Recherchez la requête problématique en utilisant la méthode du paragraphe 1.4.

2.1.2. Parfois, une erreur se produit lors de l'exécution des requêtes, par exemple :

Cette erreur est due au fait que dans le module du registre d'accumulation « Temps de travail des employés des organisations » dans la procédure « Recalculs du registre », le mot de service « DIFFÉRENT » n'est pas inclus dans la demande.
Code 1C v 8.x, c'est-à-dire devrait être:
Demande = Nouvelle demande (
" SÉLECTIONNEZ DIVERS
| Basique.Individuel,
. . . . .
Dans les dernières versions de ZUP et UPP, l'erreur ne se produit pas, car il est écrit "DIFFÉRENT".

2.2. Après avoir trouvé l'index problématique du paragraphe précédent, vous devez trouver un enregistrement non unique.
2.2.1. Script "Fish" pour identifier les enregistrements non uniques à l'aide de SQL :
Code SQL S_elect COUNT(*) Compteur,<перечисление всех полей соответствующего индекса>depuis<имя таблицы>
PAR GROUPE<перечисление всех полей соответствующего индекса>
AYANT Compteur > 1

2.2.2 Exemple. L'index dans l'erreur s'appelle "_Document140_VT1385_IntKeyIndNG".
Liste des champs du tableau :
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393 _RRRef, _Fld1394,_ Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld222 61_RTRef, _Fld22261_RRRef
Avant d'effectuer la procédure ci-dessous, veuillez sauvegarder votre base de données.
Exécuter dans l'analyseur de requêtes MS SQL Server :
Code SQL S_elect count(*), _Document140_IDRRef, _KeyField
à partir du _Document140_VT1385
regrouper par _Document140_IDRRef, _KeyField
ayant count(*) > 1
Utilisez-le pour connaître les valeurs des colonnes _Document140_IDRRef, _KeyField, enregistrements en double (id, clé).

Utilisation de la requête :
Code SQL S_élect *
à partir du _Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1 ou _Document140_IDRRef = id2 et _KeyField = key2 ou...
regardez les valeurs des autres colonnes des entrées en double.
Si les deux entrées ont des valeurs significatives et que les valeurs sont différentes, modifiez la valeur _KeyField pour qu'elle soit unique. Pour ce faire, déterminez la valeur maximale occupée de _KeyField (keymax) :
Code SQL S_elect max(_KeyField)
à partir du _Document140_VT1385
où _Document140_IDRRef = id1
Remplacez la valeur _KeyField dans l'une des entrées en double par la bonne :
Mise à jour du code SQL _Document140_VT1385
définir _KeyField = keymax + 1

Ici, _LineNo1386 = est une condition supplémentaire qui vous permet de sélectionner l'un des deux enregistrements répétitifs.

Si l’une (ou les deux) des entrées en double a une signification manifestement incorrecte, alors elle doit être supprimée :
Suppression du code SQL de _Document140_VT1385
où _Document140_IDRRef = id1 et _LineNo1386 = lineno1
Si les entrées en double ont les mêmes valeurs dans toutes les colonnes, vous devez alors en laisser une :
Code SQL S_elec distinct *
dans #tmp1
à partir du_Document140_VT1385

Supprimer du _Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

I_insérer dans _Document140_VT1385
S_électionner #tmp1

Déposer la table #tmp1

La procédure décrite doit être effectuée pour chaque paire d'enregistrements en double.

2.2.3. Deuxième exemple :
Code SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DE _Référence8_
GROUPE PAR _IDRRef, _Description
AVOIR (COUNT(*) > 1)

2.3.4 Un exemple de détermination d'enregistrements non uniques à l'aide d'une requête 1C:Enterprise :
Code 1C v 8.x SELECT Directory.Link
FROM Répertoire.Répertoire AS Répertoire
GROUP BY Annuaire.Lien
AYANT UNE QUANTITÉ(*) > 1

Informations extraites du site

Vous avez reçu un message contenant les lignes :
Fournisseur Microsoft OLE DB pour SQL Server : CREATE UNIQUE INDEX s'est arrêté car une clé en double a été trouvée pour l'ID d'index
ou
Impossible de dupliquer la ligne de clé I_nsert dans l'objet
ou
Une tentative a été effectuée pour insérer une valeur non unique dans un index unique.

Solutions:

1. Dans SQL Server Management Studio, nous détruisons physiquement l'index défectueux (dans mon cas, il s'agissait d'un index sur la table des totaux du registre comptable). En 1C, nous distribuerons les documents défectueux. En mode test et correction, cochez les cases réindexation des tableaux + recalcul des totaux. 1C recrée l'index sans erreur. Nous réalisons des documents précédemment échoués.

2. 1) À l'aide de Management Studio 2005, j'ai généré un script de création pour créer un index, qui était bogué, et je l'ai enregistré dans un fichier.
2) Tué manuellement l'index du montant de la table _AccumRgTn19455
3) Lancé une demande comme
Code SQL S_elect count(*), index_fields
DE AccumRgTn19455
GROUPE PAR champ_index
AVOIR compte(*)>1
Après la suppression de l'index, 15 enregistrements en double étaient affichés, bien qu'avant l'étape 2, la requête ne renvoyait rien.
4) J'ai parcouru toutes les entrées et nettoyé manuellement les doublons. En fait, j’ai également utilisé le traitement « Structure du rapport » pour comprendre à quoi j’avais affaire. Il s'est avéré que la table _AccumRgTn19455 stocke le registre d'accumulation « Sortie de produits (comptabilité fiscale) ». J'ai également bricolé des requêtes SQL, identifié 15 documents non uniques, et une fois toutes les actions terminées, j'ai vérifié dans 1C que ces documents étaient traités normalement, sans erreurs. Bien sûr, il ne faut pas nettoyer les tables au hasard : il est important de comprendre ce qui est nettoyé et comment cela peut se produire.
5) Lancement d'une demande de création d'un index, qui a été enregistré dans un fichier.
6) Basculez la base de données en mode mono-utilisateur et lancez dbcc checkdb - cette fois, aucune erreur n'a été générée.
7) Remettre la base en mode mono-utilisateur.
Ça y est... le problème est résolu. Eh bien, dans 1C, j'ai lancé "Tests et corrections", tout s'est bien passé là aussi, j'ai arrêté de me plaindre de l'index non unique.

3. Si la non-unicité réside dans des dates avec des valeurs nulles, alors le problème est résolu en créant une base de données avec un paramètre de décalage égal à 2000.

1. Si le problème vient du chargement de la base de données, alors :
1.1. Si vous chargez (à l'aide d'un fichier dt) dans une base de données MS SQL Server, lors de la création de la base de données, avant le chargement, spécifiez le décalage de date - 2000.
Si la base de données a déjà été créée avec le décalage 0, créez-en une nouvelle avec 2000.

1.2. S'il est possible de travailler avec la base de données dans la version fichier, effectuez des tests et des corrections, ainsi que Configuration - Vérification de la configuration - Vérification de l'intégrité logique de la configuration + Recherche des liens incorrects.

1.3. S'il n'y a pas de version de fichier, essayez de charger depuis DT vers une version client-serveur avec DB2 (qui est moins exigeante en unicité), puis effectuez des tests et des corrections, ainsi que Configuration - Vérifier la configuration - Vérifier l'intégrité logique de la configuration. + Recherche de références invalides.

1.4. Pour localiser le problème, vous pouvez déterminer les données de l'objet dont le chargement a échoué. Pour ce faire, vous devez activer le traçage dans l'utilitaire Profiler lors du démarrage ou activer l'enregistrement dans le journal des événements de processus DBMSSQL et EXCP.

2. Si le problème de non-unicité survient pendant que les utilisateurs travaillent :

2.1. Recherchez la requête problématique en utilisant la méthode du paragraphe 1.4.

2.1.2. Parfois, une erreur se produit lors de l'exécution des requêtes, par exemple :

Cette erreur est due au fait que dans le module du registre d'accumulation « Temps de travail des employés des organisations » dans la procédure « Recalculs du registre », le mot de service « DIFFÉRENT » n'est pas inclus dans la demande.
Code 1C v 8.x, c'est-à-dire devrait être:
Demande = Nouvelle demande (
" SÉLECTIONNEZ DIVERS
| Basique.Individuel,
. . . . .
Dans les dernières versions de ZUP et UPP, l'erreur ne se produit pas, car il est écrit "DIFFÉRENT".

2.2. Après avoir trouvé l'index problématique du paragraphe précédent, vous devez trouver un enregistrement non unique.
2.2.1. Script "Fish" pour identifier les enregistrements non uniques à l'aide de SQL :
Code SQL S_elect COUNT(*) Compteur,<перечисление всех полей соответствующего индекса>depuis<имя таблицы>
PAR GROUPE<перечисление всех полей соответствующего индекса>
AYANT Compteur > 1

2.2.2 Exemple. L'index dans l'erreur s'appelle "_Document140_VT1385_IntKeyIndNG".
Liste des champs du tableau :
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393 _RRRef, _Fld1394,_ Fld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld222 61_RTRef, _Fld22261_RRRef
Avant d'effectuer la procédure ci-dessous, veuillez sauvegarder votre base de données.
Exécuter dans l'analyseur de requêtes MS SQL Server :
Code SQL S_elect count(*), _Document140_IDRRef, _KeyField
à partir du_Document140_VT1385
regrouper par _Document140_IDRRef, _KeyField
ayant count(*) > 1
Utilisez-le pour connaître les valeurs des colonnes _Document140_IDRRef, _KeyField, enregistrements en double (id, clé).

Utilisation de la requête :
Code SQL S_élect *
à partir du_Document140_VT1385
ou _Document140_IDRRef = id2 et _KeyField = key2 ou...
regardez les valeurs des autres colonnes des entrées en double.
Si les deux entrées ont des valeurs significatives et que les valeurs sont différentes, modifiez la valeur _KeyField pour qu'elle soit unique. Pour ce faire, déterminez la valeur maximale occupée de _KeyField (keymax) :
Code SQL S_elect max(_KeyField)
à partir du_Document140_VT1385
où _Document140_IDRRef = id1
Remplacez la valeur _KeyField dans l'une des entrées en double par la bonne :
Mise à jour du code SQL _Document140_VT1385
définir _KeyField = keymax + 1
Ici, _LineNo1386 = est une condition supplémentaire qui vous permet de sélectionner l'un des deux enregistrements répétitifs.

Si l’une (ou les deux) des entrées en double a une signification manifestement incorrecte, alors elle doit être supprimée :
Suppression du code SQL de _Document140_VT1385
où _Document140_IDRRef = id1 et _LineNo1386 = lineno1
Si les entrées en double ont les mêmes valeurs dans toutes les colonnes, vous devez alors en laisser une :
Code SQL S_elec distinct *
dans #tmp1
à partir du_Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

Supprimer du _Document140_VT1385
où _Document140_IDRRef = id1 et _KeyField = key1

I_insérer dans _Document140_VT1385
S_électionner #tmp1

Déposer la table #tmp1

La procédure décrite doit être effectuée pour chaque paire d'enregistrements en double.

2.2.3. Deuxième exemple :
Code SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
DE _Référence8_
GROUPE PAR _IDRRef, _Description
AVOIR (COUNT(*) > 1)

2.3.4 Un exemple de détermination d'enregistrements non uniques à l'aide d'une requête 1C:Enterprise :
Code 1C v 8.x SELECT Directory.Link
FROM Répertoire.Répertoire AS Répertoire
GROUP BY Annuaire.Lien
AYANT UNE QUANTITÉ(*) > 1




Haut