Er is geprobeerd een niet-unieke waarde in te voegen in een unieke index. Wat is een index?

U bent een bericht tegengekomen met de regels:
Microsoft OLE DB-provider voor SQL Server: CREATE UNIQUE INDEX beëindigd omdat er een dubbele sleutel is gevonden voor index-ID
of
Kan geen dubbele sleutelrij in object I_nsert
of
Er is geprobeerd een niet-unieke waarde in te voegen in een unieke index.

Oplossingsopties:

1. In de beheerstudio van SQL Server vernietigen we fysiek de mislukte index (in mijn geval was het een index op de totalentabel van het boekhoudregister). In 1C zullen we defecte documenten verspreiden. Vink in de test- en correctiemodus de selectievakjes aan voor het opnieuw indexeren van tabellen + het herberekenen van totalen. 1C maakt de index foutloos opnieuw. We voeren eerder mislukte documenten uit.

2. 1) Met Management Studio 2005 heb ik een aanmaakscript gegenereerd om een ​​index met fouten te maken en deze in een bestand op te slaan.
2) Handmatig de index verwijderd uit de tabel _AccumRgTn19455
3) Een verzoek gelanceerd zoals
SQL-code S_elect count(*), index_fields
VANAF AccumRgTn19455
GROEP OP index_field
HEBBEN telling(*)>1
Nadat de index was uitgeschakeld, heb ik 15 dubbele records weergegeven, hoewel de query vóór stap 2 niets opleverde.
4) Ik heb alle records doorgenomen en de duplicaten handmatig opgeschoond. In feite heb ik ook de "Rapportstructuur" -verwerking gebruikt om te begrijpen waar ik in het algemeen mee te maken had. Het bleek dat de tabel _AccumRgTn19455 het accumulatieregister "Productoutput (tax accounting)" opslaat. Ik snuffelde ook rond met sql-query's, identificeerde 15 niet-unieke documenten en nadat alle acties waren voltooid, controleerde ik in 1C of deze documenten normaal werden verwerkt, zonder fouten. Het is natuurlijk niet de moeite waard om zomaar willekeurig tafels op te ruimen: het is belangrijk om te begrijpen wat er wordt schoongemaakt en wat het kan worden.
5) Een query gestart om een ​​index te maken, die in een bestand is opgeslagen.
6) Schakelde de database naar de modus voor één gebruiker en voerde dbcc checkdb uit - deze keer waren er geen fouten.
7) Het basisstation teruggezet naar de modus voor één gebruiker.
Alles... het probleem is overwonnen. Nou, zelfs in 1C lanceerde ik "Testing and Correction", ook daar ging alles goed, het stopte met vloeken bij een niet-unieke index.

3. Als niet-uniekheid ligt in datums met nulwaarden, dan wordt het probleem opgelost door een basis te maken met een offsetparameter van 2000.

1. Als het probleem het laden van de database is, dan:
1.1. Als u (met behulp van een dt-bestand) in de MS SQL Server-database laadt, geeft u bij het maken van de database vóór het laden de datumverschuiving - 2000 op.
Als de basis al is gemaakt met offset 0, maak dan een nieuwe met 2000.

1.2. Als het mogelijk is om met de database in de bestandsversie te werken, voer dan Testing en Fixing uit, evenals Configuratie - Controle van de configuratie - Controle van de logische integriteit van de configuratie + Zoeken naar onjuiste koppelingen.

1.3. Als er geen bestandsvariant is, probeer dan te laden van DT naar een DB2-client/server-variant (die minder kieskeurig is wat betreft uniciteit), en voer vervolgens Test and Repair and Configuration - Configuration Check - Configuration Logical Integrity Check + Bad Reference Finder uit.

1.4. Om het probleem te lokaliseren, kunt u de gegevens bepalen van het object waarvan het laden is mislukt. Om dit te doen, moet u tracering tijdens het opstarten inschakelen in het Profiler-hulpprogramma, of logboekregistratie naar het DBMSSQL- en EXCP-procesgebeurtenislogboek inschakelen.

2. Als het probleem van niet-uniekheid zich manifesteert tijdens het werk van gebruikers:

2.1. Vind het problematische verzoek met behulp van de methode van paragraaf 1.4.

2.1.2. Soms treedt er een fout op tijdens het uitvoeren van verzoeken, bijvoorbeeld:

Deze fout treedt op doordat in de module van het opbouwregister "Arbeidsuren van medewerkers van organisaties" in de procedure "Herberekeningen registreren" in de aanvraag geen servicewoord "VERSCHILLEND" staat.
Code 1C v 8.x I.e. zou moeten zijn:
Verzoek = Nieuw Verzoek(
"KIES ANDERS
| Basis.Individueel,
. . . . .
In de nieuwste releases van ZUP en UPP treedt de fout niet op, omdat. er staat "DIVERS".

2.2. Nadat u de problematische index uit de vorige paragraaf hebt gevonden, moet u een niet-uniek item vinden.
2.2.1. "Fish"-script voor het definiëren van niet-unieke records met behulp van SQL:
SQL-code S_elect COUNT(*) Teller,<перечисление всех полей соответствующего индекса>van<имя таблицы>
GROEP OP<перечисление всех полей соответствующего индекса>
MET Teller > 1

2.2.2 Voorbeeld. De index in de fout heet "_Document140_VT1385_IntKeyIndNG".
Lijst met tabelvelden:
_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, _Fld22261_RRRef
Maak een back-up van uw database voordat u de onderstaande procedure volgt.
Uitvoeren in MS SQL Server Query Analyzer:
SQL-code S_elect count(*), _Document140_IDRRef, _KeyField
van _Document140_VT1385
groeperen op _Document140_IDRRef, _KeyField
met telling(*) > 1
Gebruik het om de waarden van de kolommen _Document140_IDRRef, _KeyField, dubbele records (id, key) te achterhalen.

Met een verzoek:
SQL-code S_elect *
van _Document140_VT1385
of _Document140_IDRRef = id2 en _KeyField = key2 of ...
kijk naar de waarden van andere kolommen met dubbele vermeldingen.
Als beide vermeldingen zinvolle waarden hebben en deze waarden verschillen, zorg er dan voor dat de waarde van _KeyField uniek is. Om dit te doen, definieert u de maximale bezette waarde van _KeyField(keymax):
SQL-code S_elect max(_KeyField)
van _Document140_VT1385
waar _Document140_IDRRef = id1
Vervang de _KeyField-waarde in een van de dubbele vermeldingen door de juiste:
Update van SQL-code _Document140_VT1385
set _KeyField = keymax + 1
Hier is _LineNo1386 = een aanvullende voorwaarde waarmee u een van de twee dubbele vermeldingen kunt selecteren.

Als een (of beide) van de dubbele vermeldingen een duidelijk verkeerde waarde heeft, moet deze worden verwijderd:
SQL-code verwijderen uit _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _LineNo1386 = lineno1
Als dubbele vermeldingen in alle kolommen dezelfde waarden hebben, moet er een worden achtergelaten:
SQL-code S_select onderscheiden *
in #tmp1
van _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

Verwijderen uit _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

I_invoegen in _Document140_VT1385
S_elect #tmp1

D_rop tafel #tmp1

De beschreven procedure moet worden uitgevoerd voor elk paar dubbele vermeldingen.

2.2.3. Tweede voorbeeld:
SQL-code S_elect COUNT(*) AS Uitdr2, _IDRRef AS Uitdr1, _Description
VAN _Referentie8_
GROEP OP _IDRRef, _Beschrijving
HEBBEN (COUNT(*) > 1)

2.3.4 Een voorbeeld van het definiëren van niet-unieke records met een 1C:Enterprise-query:
Code 1C v 8.x KIES Handboek. Link
VAN Directory. Directory AS Directory
GROEP OP
MET HOEVEELHEID(*) > 1

U bent een bericht tegengekomen met de regels:
Microsoft OLE DB-provider voor SQL Server: CREATE UNIQUE INDEX beëindigd omdat er een dubbele sleutel is gevonden voor index-ID
of
Kan geen dubbele sleutelrij in object I_nsert
of
Er is geprobeerd een niet-unieke waarde in te voegen in een unieke index.

Oplossingsopties:

1. In de beheerstudio van SQL Server vernietigen we fysiek de mislukte index (in mijn geval was het een index op de totalentabel van het boekhoudregister). In 1C zullen we defecte documenten verspreiden. Vink in de test- en correctiemodus de selectievakjes aan voor het opnieuw indexeren van tabellen + het herberekenen van totalen. 1C maakt de index foutloos opnieuw. We voeren eerder mislukte documenten uit.

2. 1) Met behulp van Management Studio 2005 heb ik een aanmaakscript gegenereerd voor het maken van een index, die fouten bevatte, en deze in een bestand opgeslagen.
2) Handmatig de index verwijderd uit de tabel _AccumRgTn19455
3) Een verzoek gelanceerd zoals
SQL-code S_elect count(*), index_fields
VAN OM AccumRgTn19455
GROEP OP index_field
HEBBEN telling(*)>1
Nadat de index was uitgeschakeld, heb ik 15 dubbele records weergegeven, hoewel de query vóór stap 2 niets opleverde.
4) Ik heb alle records doorgenomen en de duplicaten handmatig opgeschoond. In feite heb ik ook de "Rapportstructuur" -verwerking gebruikt om te begrijpen waar ik in het algemeen mee te maken had. Het bleek dat de tabel _AccumRgTn19455 het accumulatieregister "Productoutput (tax accounting)" opslaat. Ik snuffelde ook rond met sql-query's, identificeerde 15 niet-unieke documenten en nadat alle acties waren voltooid, controleerde ik in 1C of deze documenten normaal werden verwerkt, zonder fouten. Het is natuurlijk niet de moeite waard om zomaar willekeurig tafels op te ruimen: het is belangrijk om te begrijpen wat er wordt schoongemaakt en wat het kan worden.
5) Een query gestart om een ​​index te maken, die in een bestand is opgeslagen.
6) Schakelde de database naar de modus voor één gebruiker en voerde dbcc checkdb uit - deze keer waren er geen fouten.
7) Het basisstation teruggezet naar de modus voor één gebruiker.
Alles... het probleem is overwonnen. Nou, zelfs in 1C lanceerde ik "Testing and Correction", ook daar ging alles goed, het stopte met vloeken bij een niet-unieke index.

3. Als niet-uniekheid ligt in datums met nulwaarden, dan wordt het probleem opgelost door een basis te maken met een offsetparameter van 2000.

1. Als het probleem het laden van de database is, dan:
1.1. Als u (met behulp van een dt-bestand) in de MS SQL Server-database laadt, geeft u bij het maken van de database vóór het laden de datumverschuiving - 2000 op.
Als de basis al is gemaakt met offset 0, maak dan een nieuwe met 2000.

1.2. Als het mogelijk is om met de database in de bestandsversie te werken, voer dan Testing en Fixing uit, evenals Configuratie - Controle van de configuratie - Controle van de logische integriteit van de configuratie + Zoeken naar onjuiste koppelingen.

1.3. Als er geen bestandsvariant is, probeer dan te laden van DT naar een DB2-client/server-variant (die minder kieskeurig is wat betreft uniciteit), en voer vervolgens Test and Repair and Configuration - Configuration Check - Configuration Logical Integrity Check + Bad Reference Finder uit.

1.4. Om het probleem te lokaliseren, kunt u de gegevens bepalen van het object waarvan het laden is mislukt. Om dit te doen, moet u tracering tijdens het opstarten inschakelen in het Profiler-hulpprogramma, of logboekregistratie naar het DBMSSQL- en EXCP-procesgebeurtenislogboek inschakelen.

2. Als het probleem van niet-uniekheid zich manifesteert tijdens het werk van gebruikers:

2.1. Vind het problematische verzoek met behulp van de methode van paragraaf 1.4.

2.1.2. Soms treedt er een fout op tijdens het uitvoeren van verzoeken, bijvoorbeeld:

Deze fout treedt op doordat in de module van het opbouwregister "Arbeidsuren van medewerkers van organisaties" in de procedure "Herberekeningen registreren" in de aanvraag geen servicewoord "VERSCHILLEND" staat.
Code 1C v 8.x I.e. zou moeten zijn:
Verzoek = Nieuw Verzoek(
"KIES ANDERS
| Basis.Individueel,
. . . . .
In de nieuwste releases van ZUP en UPP treedt de fout niet op, omdat. er staat "DIVERS".

2.2. Nadat u de problematische index uit de vorige paragraaf hebt gevonden, moet u een niet-uniek item vinden.
2.2.1. "Fish"-script voor het definiëren van niet-unieke records met behulp van SQL:
SQL-code S_elect COUNT(*) Teller,<перечисление всех полей соответствующего индекса>van<имя таблицы>
GROEP OP<перечисление всех полей соответствующего индекса>
MET Teller > 1

2.2.2 Voorbeeld. De index in de fout heet "_Document140_VT1385_IntKeyIndNG".
Lijst met tabelvelden:
_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, _Fld22261_RRRef
Maak een back-up van uw database voordat u de onderstaande procedure volgt.
Uitvoeren in MS SQL Server Query Analyzer:
SQL-code S_elect count(*), _Document140_IDRRef, _KeyField
van _Document140_VT1385
groeperen op _Document140_IDRRef, _KeyField
met telling(*) > 1
Gebruik het om de waarden van de kolommen _Document140_IDRRef, _KeyField, dubbele records (id, key) te achterhalen.

Met een verzoek:
SQL-code S_elect *
van _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1 of _Document140_IDRRef = id2 en _KeyField = key2 of ...
kijk naar de waarden van andere kolommen met dubbele vermeldingen.
Als beide vermeldingen zinvolle waarden hebben en deze waarden verschillen, zorg er dan voor dat de waarde van _KeyField uniek is. Om dit te doen, definieert u de maximale bezette waarde van _KeyField(keymax):
SQL-code S_elect max(_KeyField)
van _Document140_VT1385
wh ere_Document140_IDRRef=id1
Vervang de _KeyField-waarde in een van de dubbele vermeldingen door de juiste:
Update van SQL-code _Document140_VT1385
set _KeyField = keymax + 1

Hier is _LineNo1386 = een aanvullende voorwaarde waarmee u een van de twee dubbele vermeldingen kunt selecteren.

Als een (of beide) van de dubbele vermeldingen een duidelijk verkeerde waarde heeft, moet deze worden verwijderd:
SQL-code verwijderen uit _Document140_VT1385
waar _Document140_IDRRef = id1 en _LineNo1386 = lineno1
Als dubbele vermeldingen in alle kolommen dezelfde waarden hebben, moet er een worden achtergelaten:
SQL-code S_select onderscheiden *
in #tmp1
van _Document140_VT1385

Verwijderen uit _Document140_VT1385
waar _Document140_IDRRef = id1 en _KeyField = key1

I_invoegen in _Document140_VT1385
S_elect #tmp1

D_rop tafel #tmp1

De beschreven procedure moet worden uitgevoerd voor elk paar dubbele vermeldingen.

2.2.3. Tweede voorbeeld:
SQL-code S_elect COUNT(*) AS Uitdr2, _IDRRef AS Uitdr1, _Description
VAN _Referentie8_
GROEP OP _IDRRef, _Beschrijving
HEBBEN (COUNT(*) > 1)

2.3.4 Een voorbeeld van het definiëren van niet-unieke records met een 1C:Enterprise-query:
Code 1C v 8.x KIES Handboek. Link
VAN Directory. Directory AS Directory
GROEP OP
MET HOEVEELHEID(*) > 1

Informatie afkomstig van de site

U bent een bericht tegengekomen met de regels:
Microsoft OLE DB-provider voor SQL Server: CREATE UNIQUE INDEX beëindigd omdat er een dubbele sleutel is gevonden voor index-ID
of
Kan geen dubbele sleutelrij in object I_nsert
of
Er is geprobeerd een niet-unieke waarde in te voegen in een unieke index.

Oplossingsopties:

1. In de beheerstudio van SQL Server vernietigen we fysiek de mislukte index (in mijn geval was het een index op de totalentabel van het boekhoudregister). In 1C zullen we defecte documenten verspreiden. Vink in de test- en correctiemodus de selectievakjes aan voor het opnieuw indexeren van tabellen + het herberekenen van totalen. 1C maakt de index foutloos opnieuw. We voeren eerder mislukte documenten uit.

2. 1) Met Management Studio 2005 heb ik een aanmaakscript gegenereerd om een ​​index met fouten te maken en deze in een bestand op te slaan.
2) Handmatig de index verwijderd uit de tabel _AccumRgTn19455
3) Een verzoek gelanceerd zoals
SQL-code S_elect count(*), index_fields
VANAF AccumRgTn19455
GROEP OP index_field
HEBBEN telling(*)>1
Nadat de index was uitgeschakeld, heb ik 15 dubbele records weergegeven, hoewel de query vóór stap 2 niets opleverde.
4) Ik heb alle records doorgenomen en de duplicaten handmatig opgeschoond. In feite heb ik ook de "Rapportstructuur" -verwerking gebruikt om te begrijpen waar ik in het algemeen mee te maken had. Het bleek dat de tabel _AccumRgTn19455 het accumulatieregister "Productoutput (tax accounting)" opslaat. Ik snuffelde ook rond met sql-query's, identificeerde 15 niet-unieke documenten en nadat alle acties waren voltooid, controleerde ik in 1C of deze documenten normaal werden verwerkt, zonder fouten. Het is natuurlijk niet de moeite waard om zomaar willekeurig tafels op te ruimen: het is belangrijk om te begrijpen wat er wordt schoongemaakt en wat het kan worden.
5) Een query gestart om een ​​index te maken, die in een bestand is opgeslagen.
6) Schakelde de database naar de modus voor één gebruiker en voerde dbcc checkdb uit - deze keer waren er geen fouten.
7) Het basisstation teruggezet naar de modus voor één gebruiker.
Alles... het probleem is overwonnen. Nou, zelfs in 1C lanceerde ik "Testing and Correction", ook daar ging alles goed, het stopte met vloeken bij een niet-unieke index.

3. Als niet-uniekheid ligt in datums met nulwaarden, dan wordt het probleem opgelost door een basis te maken met een offsetparameter van 2000.

1. Als het probleem het laden van de database is, dan:
1.1. Als u (met behulp van een dt-bestand) in de MS SQL Server-database laadt, geeft u bij het maken van de database vóór het laden de datumverschuiving - 2000 op.
Als de basis al is gemaakt met offset 0, maak dan een nieuwe met 2000.

1.2. Als het mogelijk is om met de database in de bestandsversie te werken, voer dan Testing en Fixing uit, evenals Configuratie - Controle van de configuratie - Controle van de logische integriteit van de configuratie + Zoeken naar onjuiste koppelingen.

1.3. Als er geen bestandsvariant is, probeer dan te laden van DT naar een DB2-client/server-variant (die minder kieskeurig is wat betreft uniciteit), en voer vervolgens Test and Repair and Configuration - Configuration Check - Configuration Logical Integrity Check + Bad Reference Finder uit.

1.4. Om het probleem te lokaliseren, kunt u de gegevens bepalen van het object waarvan het laden is mislukt. Om dit te doen, moet u tracering tijdens het opstarten inschakelen in het Profiler-hulpprogramma, of logboekregistratie naar het DBMSSQL- en EXCP-procesgebeurtenislogboek inschakelen.

2. Als het probleem van niet-uniekheid zich manifesteert tijdens het werk van gebruikers:

2.1. Vind het problematische verzoek met behulp van de methode van paragraaf 1.4.

2.1.2. Soms treedt er een fout op tijdens het uitvoeren van verzoeken, bijvoorbeeld:

Deze fout treedt op doordat in de module van het opbouwregister "Arbeidsuren van medewerkers van organisaties" in de procedure "Herberekeningen registreren" in de aanvraag geen servicewoord "VERSCHILLEND" staat.
Code 1C v 8.x I.e. zou moeten zijn:
Verzoek = Nieuw Verzoek(
"KIES ANDERS
| Basis.Individueel,
. . . . .
In de nieuwste releases van ZUP en UPP treedt de fout niet op, omdat. er staat "DIVERS".

2.2. Nadat u de problematische index uit de vorige paragraaf hebt gevonden, moet u een niet-uniek item vinden.
2.2.1. "Fish"-script voor het definiëren van niet-unieke records met behulp van SQL:
SQL-code S_elect COUNT(*) Teller,<перечисление всех полей соответствующего индекса>van<имя таблицы>
GROEP OP<перечисление всех полей соответствующего индекса>
MET Teller > 1

2.2.2 Voorbeeld. De index in de fout heet "_Document140_VT1385_IntKeyIndNG".
Lijst met tabelvelden:
_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, _Fld22261_RRRef
Maak een back-up van uw database voordat u de onderstaande procedure volgt.
Uitvoeren in MS SQL Server Query Analyzer:
SQL-code S_elect count(*), _Document140_IDRRef, _KeyField
van _Document140_VT1385
groeperen op _Document140_IDRRef, _KeyField
met telling(*) > 1
Gebruik het om de waarden van de kolommen _Document140_IDRRef, _KeyField, dubbele records (id, key) te achterhalen.

Met een verzoek:
SQL-code S_elect *
van _Document140_VT1385
of _Document140_IDRRef = id2 en _KeyField = key2 of ...
kijk naar de waarden van andere kolommen met dubbele vermeldingen.
Als beide vermeldingen zinvolle waarden hebben en deze waarden verschillen, zorg er dan voor dat de waarde van _KeyField uniek is. Om dit te doen, definieert u de maximale bezette waarde van _KeyField(keymax):
SQL-code S_elect max(_KeyField)
van _Document140_VT1385
waar _Document140_IDRRef = id1
Vervang de _KeyField-waarde in een van de dubbele vermeldingen door de juiste:
Update van SQL-code _Document140_VT1385
set _KeyField = keymax + 1
Hier is _LineNo1386 = een aanvullende voorwaarde waarmee u een van de twee dubbele vermeldingen kunt selecteren.

Als een (of beide) van de dubbele vermeldingen een duidelijk verkeerde waarde heeft, moet deze worden verwijderd:
SQL-code verwijderen uit _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _LineNo1386 = lineno1
Als dubbele vermeldingen in alle kolommen dezelfde waarden hebben, moet er een worden achtergelaten:
SQL-code S_select onderscheiden *
in #tmp1
van _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

Verwijderen uit _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

I_invoegen in _Document140_VT1385
S_elect #tmp1

D_rop tafel #tmp1

De beschreven procedure moet worden uitgevoerd voor elk paar dubbele vermeldingen.

2.2.3. Tweede voorbeeld:
SQL-code S_elect COUNT(*) AS Uitdr2, _IDRRef AS Uitdr1, _Description
VAN _Referentie8_
GROEP OP _IDRRef, _Beschrijving
HEBBEN (COUNT(*) > 1)

2.3.4 Een voorbeeld van het definiëren van niet-unieke records met een 1C:Enterprise-query:
Code 1C v 8.x KIES Handboek. Link
VAN Directory. Directory AS Directory
GROEP OP
MET HOEVEELHEID(*) > 1

In dit artikel wordt beschreven wat u moet doen als u bij het werken met 1C:Enterprise 8.1 een bericht tegenkomt met de volgende regels:

Kan geen dubbele sleutelrij in object invoegen

Er is geprobeerd een niet-unieke waarde in te voegen in een unieke index.

Wat is een index?

Indexen zijn een structuur waarmee u snel toegang hebt tot de rijen van een tabel op basis van de waarden van een of meer van de kolommen.
Een index bevat sleutels die zijn opgebouwd uit een of meer kolommen van een tabel of weergave en aanwijzers die verwijzen naar waar de gegeven gegevens zijn opgeslagen.
Indexen verminderen de hoeveelheid gegevens die moet worden gelezen om een ​​resultatenset te retourneren.

Hoewel een index is gekoppeld aan een specifieke kolom (of kolommen) van een tabel, is het nog steeds een op zichzelf staand databaseobject.

Tabelindexen in de 1C:Enterprise-database worden impliciet gemaakt bij het maken van configuratieobjecten, evenals bij bepaalde instellingen van configuratieobjecten.

De fysieke essentie van indexen in MS SQL Server 2005.

Fysieke gegevens worden opgeslagen op 8Kb pagina's. Onmiddellijk na het maken, terwijl de tabel geen indexen heeft, ziet de tabel eruit als een hoop gegevens. Records hebben geen specifieke opslagvolgorde.
Wanneer u toegang wilt tot gegevens, zal SQL Server produceren: tafel scan(tafelscan). SQL Server scant de hele tabel om de records te vinden die het zoekt.
Vanaf hier worden de basisfuncties van indexen duidelijk:
- het verhogen van de snelheid van gegevenstoegang,
- ondersteuning voor uniekheid van gegevens.

Ondanks de voordelen hebben indexen ook een aantal nadelen. De eerste is indexen. extra schijfruimte in beslag nemen en in RAM. Elke keer dat u een index maakt, slaat u de sleutels op in oplopende of aflopende volgorde, die gelaagd kan worden. En hoe groter/langer de sleutel, hoe groter de index. Het tweede nadeel is: operaties vertragen records invoegen, bijwerken en verwijderen.
Verschillende soorten indexen zijn geïmplementeerd in de MS SQL Server 2005-omgeving:

  • niet-geclusterde indexen;
  • geclusterde (of geclusterde) indexen;
  • unieke indexen;
  • indexen met opgenomen kolommen
  • geïndexeerde weergaven
  • hele tekst

Unieke index

De uniciteit van waarden in een geïndexeerde kolom wordt gegarandeerd door unieke indexen. Als ze aanwezig zijn, zal de server niet toestaan ​​dat een nieuwe waarde wordt ingevoegd of een bestaande waarde wordt gewijzigd, zodanig dat als gevolg van deze bewerking twee identieke waarden in de kolom verschijnen.
Een unieke index is een soort add-on en kan worden geïmplementeerd voor zowel geclusterde als niet-geclusterde indexen. Eén tabel kan één unieke geclusterde en vele unieke niet-geclusterde indexen hebben.
Unieke indexen mogen alleen worden gedefinieerd als dit absoluut noodzakelijk is. Om de gegevensintegriteit op een kolom te garanderen, kunt u een UNIEKE of PRIMARY KEY-integriteitsbeperking definiëren in plaats van toevlucht te nemen tot unieke indexen. Ze alleen gebruiken om de gegevensintegriteit te waarborgen, is een verspilling van ruimte in de database. Daarnaast wordt er ook CPU-tijd besteed aan hun onderhoud.

1C:Enterprise 8.1, vanaf versie 8.1, maakt actief gebruik van geclusterde unieke indexen. Dit betekent dat u bij het converteren van 8.0 of het migreren van 8.1.7 een niet-unieke indexfout kunt krijgen.

Als niet-uniekheid ligt in datums met nulwaarden, dan wordt het probleem opgelost door een basis te creëren met een offsetparameter gelijk aan 2000.

Wat moeten we doen?

1. Als het probleem het laden van de database is, dan:

1.1. Als u (met behulp van een dt-bestand) in de MS SQL Server-database laadt, geeft u bij het maken van de database vóór het laden de datumverschuiving - 2000 op.

Als de basis al is gemaakt met offset 0, maak dan een nieuwe met 2000.

1.2. Als het mogelijk is om met de database in de bestandsversie te werken, voer dan Testing en Fixing uit, evenals Configuratie - Controle van de configuratie - Controle van de logische integriteit van de configuratie + Zoeken naar onjuiste koppelingen.

1.3. Als er geen bestandsvariant is, probeer dan te laden van DT naar een DB2-client/server-variant (die minder kieskeurig is wat betreft uniciteit) en voer vervolgens Test and Repair and Configuration - Check Configuration - Check Configuration Logical Integrity + Find Bad References uit.

1.4. Om het probleem te lokaliseren, kunt u de gegevens bepalen van het object waarvan het laden is mislukt. Om dit te doen, moet u tracering tijdens het opstarten inschakelen in het Profiler-hulpprogramma, of logboekregistratie naar het DBMSSQL- en EXCP-procesgebeurtenislogboek inschakelen.

1.5. Als er een node beschikbaar is (uitwisselingsplannen), voer dan de uitwisseling uit. U kunt ook paragraaf 2.3.5 uitvoeren vóór de uitwisseling

2. Als het probleem van niet-uniekheid zich manifesteert tijdens het werk van gebruikers:

2.1. Vind het problematische verzoek met behulp van de methode van paragraaf 1.4.

2.1.2. Soms treedt er een fout op tijdens het uitvoeren van verzoeken, bijvoorbeeld:

Deze fout treedt op doordat in de opbouwregistermodule "Arbeidsuren van medewerkers van organisaties" in de procedure "Herberekeningen registreren" in de aanvraag het servicewoord "VERSCHILLEND" niet is opgenomen.

Die. zou moeten zijn:

Verzoek = Nieuw Verzoek(
"KIES ANDERS
| Basis.Individueel,

In de nieuwste releases van ZUP en UPP treedt de fout niet op, omdat. er staat ANDERS.

2.2. Nadat u de problematische index uit de vorige paragraaf hebt gevonden, moet u een niet-uniek item vinden.

2.2.1. "Fish"-script voor het definiëren van niet-unieke records met behulp van SQL:
SELECTEER AANTAL(*) Teller,<перечисление всех полей соответствующего индекса>van<имя таблицы>
GROEP OP<перечисление всех полей соответствующего индекса>
MET Teller > 1

2.2.2 Voorbeeld. De index in de fout heet "_Document140_VT1385_IntKeyIndNG".

Lijst met tabelvelden:

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

Fld1395 _Fld1396RRef _Fld1397 _Fld1398 _Fld1399RRef _Fld22260_TYPE _Fld22260_RTRef

Maak een back-up van uw database voordat u de onderstaande procedure volgt.
Uitvoeren in MS SQL Server Query Analyzer:

selecteer aantal(*), _Document140_IDRRef, _KeyField
van _Document140_VT1385
groeperen op _Document140_IDRRef, _KeyField
met telling(*) > 1

Gebruik het om de waarden van de kolommen _Document140_IDRRef, _KeyField, dubbele records (id, key) te achterhalen.

Met een verzoek:

selecteer *
van _Document140_VT1385
of _Document140_IDRRef = id2 en _KeyField = key2 of …

kijk naar de waarden van andere kolommen met dubbele vermeldingen.

Als beide vermeldingen zinvolle waarden hebben en deze waarden verschillen, zorg er dan voor dat de waarde van _KeyField uniek is. Om dit te doen, definieert u de maximale bezette waarde van _KeyField(keymax):

selecteer max(_KeyField)
van _Document140_VT1385
waar _Document140_IDRRef = id1

Vervang de _KeyField-waarde in een van de dubbele vermeldingen door de juiste:

update_Document140_VT1385
set _KeyField = keymax + 1

Hier is _LineNo1386 = een aanvullende voorwaarde waarmee u een van de twee dubbele vermeldingen kunt selecteren.

Als een (of beide) van de dubbele vermeldingen een duidelijk verkeerde waarde heeft, moet deze worden verwijderd:


waarbij _Document140_IDRRef = id1 en _LineNo1386 = lineno1

Als dubbele vermeldingen in alle kolommen dezelfde waarden hebben, moet er een worden achtergelaten:

selecteer onderscheiden *
in #tmp1
van _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

verwijderen uit _Document140_VT1385
waarbij _Document140_IDRRef = id1 en _KeyField = key1

invoegen in _Document140_VT1385
selecteer #tmp1

laat tafel vallen #tmp1

De beschreven procedure moet worden uitgevoerd voor elk paar dubbele vermeldingen.

2.2.3. Tweede voorbeeld:

SELECT COUNT(*) AS Expr2, _IDRRef AS Expr1, _Description
VAN _Referentie8_
GROEP OP _IDRRef, _Beschrijving
HEBBEN (COUNT(*) > 1)

2.3.4 Een voorbeeld van het definiëren van niet-unieke records met een 1C:Enterprise-query:

of voor de boekhouding

KIES
Subquery.Periode,
Subquery.Registrar,
<измерения>,
SUM(Subquery.Aantal records) AS Aantal records
VAN
(SELECTIE
Zelfdragend.Periode AS Periode,
Zelfvoorzienend Registrator AS Registrator,
<измерения>,
1 AS aantal records
VAN
Register van boekhouding. Self-supporting AS Self-supporting) AS Subquery

GROEP OP
Subquery.Periode,
Subquery.Registrar,
<измерения>

HEBBEN
SOM(Subquery.Aantal records) > 1

2.3.5 Subd-index niet uniek maken. Maak een script voor de index met Management Studio.

2.3.6 Een speciaal geval in de uitwisseling in de RDB. De fout valt op de "hulp"-tabellen die zijn gekoppeld aan de berekening van totalen of analyses. Bijvoorbeeld:

Fout bij aanroepen van contextmethode (schrijven): Poging om niet-unieke waarde in unieke index in te voegen:
Microsoft OLE DB-provider voor SQL Server: kan geen dubbele sleutelrij invoegen in object 'dbo._AccntRegED10319' met unieke index '_Accnt10319_ByPeriod_TRNRN'.
HRESULT=80040E2F, SQLSrvr: Foutstatus=1, Ernst=E, native=2601, regel=1

Schakel in dit geval voor het laden het gebruik van totalen uit, download het bericht, schakel het gebruik van totalen in en bereken opnieuw.