Come configurare smartphone e PC. Portale informativo
  • casa
  • In contatto con
  • 1c Tentativo di inserire un valore non univoco in un indice univoco. Errore: tentativo di inserire un valore non univoco in un indice univoco: microsoft sql server

1c Tentativo di inserire un valore non univoco in un indice univoco. Errore: tentativo di inserire un valore non univoco in un indice univoco: microsoft sql server

Ti sei imbattuto in un messaggio contenente le righe:
Provider Microsoft OLE DB per SQL Server: CREATE UNIQUE INDEX terminato perché è stata trovata una chiave duplicata per l'ID indice
o
Impossibile inserire la riga chiave duplicata nell'oggetto
o
Tentativo di inserire un valore non univoco in un indice univoco.

Opzioni di soluzione:

1. In SQL Server management studio, distruggiamo fisicamente l'indice errato (nel mio caso era un indice sulla tabella dei totali del registro contabile). Distribuiremo documenti difettosi in 1C. In modalità test e correzione, spuntare le caselle per reindicizzazione tabelle + ricalcolo totali. 1C ricrea l'indice senza errori. Eseguiamo documenti precedentemente falliti.

2. 1) Utilizzando Management Studio 2005, ho generato uno script di creazione per creare un indice, che presentava errori, e l'ho salvato in un file.
2) Ho ucciso manualmente l'indice dalla tabella _AccumRgTn19455
3) Lanciato una query come
Codice SQL S_elect count (*) index_fields
DA AccumRgTn19455
GROUP BY index_field
AVERE conteggio (*)> 1
Dopo che l'indice è stato ucciso, ho ottenuto 15 record duplicati, anche se fino all'esecuzione del passaggio 2, la query non ha restituito nulla.
4) Ho esaminato tutti i record e ripulito manualmente i duplicati. In effetti, ho anche utilizzato l'elaborazione "Report Structure" per capire con cosa avevo a che fare. Si è scoperto che la tabella _AccumRgTn19455 memorizza il registro di accumulo "Output prodotto (contabilità fiscale)". Stavo ancora scavando con query sql, identificato 15 documenti non univoci e, dopo aver completato tutte le azioni, ho verificato in 1C che questi documenti vengano elaborati normalmente, senza errori. Certo, non vale la pena pulire i tavoli a caso: è importante capire cosa viene pulito e come può risultare.
5) Lanciata una richiesta per creare un indice, che è stata salvata in un file.
6) Ho cambiato il database in modalità utente singolo e ho eseguito dbcc checkdb - questa volta non sono stati emessi errori.
7) Riportato la base in modalità utente singolo.
Ecco... il problema è sconfitto. Bene, anche in 1C, ho lanciato "Testing and Correction", è andato tutto bene anche lì, ho smesso di imprecare su un indice non univoco.

3. Se la non unicità risiede in date con valori zero, quindi il problema viene risolto creando una base con un parametro offset pari a 2000.

1. Se il problema sta caricando il database, allora:
1.1. Se si carica (usare il file dt) nel database di MS SQL Server, quindi durante la creazione del database, prima del caricamento, specificare l'offset della data - 2000.
Se la base è già stata creata con offset 0, crearne una nuova dal 2000.

1.2. Se è possibile lavorare con il database nella versione del file, eseguire Test e correzione, nonché Configurazione - Verifica della configurazione - Verifica dell'integrità logica della configurazione + Ricerca di collegamenti non validi.

1.3. Se non esiste una versione del file, prova ad avviare da DT a una versione client/server con DB2 (che è meno esigente in termini di unicità), quindi esegui Test e correzione, nonché Configurazione - Verifica configurazione - Verifica coerenza configurazione logica + Trova non valido Riferimenti.

1.4. Per isolare il problema, è possibile determinare i dati dell'oggetto che non è stato caricato. Per fare ciò, è necessario abilitare la traccia all'avvio nell'utility Profiler o abilitare la registrazione nel registro degli eventi tecnologici DBMSSQL ed EXCP.

2. Se il problema della non unicità si manifesta durante il lavoro dell'utente:

2.1. Trovare la richiesta del problema utilizzando il metodo del paragrafo 1.4.

2.1.2. A volte si verifica un errore durante l'esecuzione delle richieste, ad esempio:

Questo errore si verifica a causa del fatto che nel modulo del registro di accumulo "Orario di lavoro dei dipendenti delle organizzazioni" nella procedura "RegisterRcalculations" la query non contiene la parola di servizio "VARIOUS".
Codice 1C v 8.x Es. dovrebbe essere:
Richiesta = Nuova richiesta (
"SCEGLI VARIE
| Basic.PhysFace,
. . . . .
Nelle ultime versioni rilasciate di ZUP e UPP, l'errore non si verifica, perché c'è "VARIO".

2.2. Dopo aver trovato l'indice problematico del paragrafo precedente, è necessario trovare una voce non univoca.
2.2.1. Script di pesce per la definizione di record non univoci utilizzando SQL:
Codice SQL S_elect COUNT (*) Contatore,<перечисление всех полей соответствующего индекса>a partire dal<имя таблицы>
RAGGRUPPA PER<перечисление всех полей соответствующего индекса>
AVERE Contatore > 1

2.2.2 Esempio. L'indice nell'errore è denominato "_Document140_VT1385_IntKeyIndNG".
Elenco dei campi della tabella:
_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
Eseguire il backup del database prima di seguire la procedura seguente.
Esegui l'analizzatore di query di MS SQL Server:
Codice SQL S_elect conteggio (*), _Document140_IDRRef, _KeyField
da _Document140_VT1385
raggruppa per _Document140_IDRRef, _KeyField
avere conteggio (*)> 1
Usalo per scoprire i valori delle colonne _Document140_IDRRef, _KeyField, record duplicati (id, chiave).

Su richiesta:
S_seleziona codice SQL *
da _Document140_VT1385
o _Document140_IDRRef = id2 e _KeyField = key2 o ...
guarda i valori delle altre colonne di record duplicati.
Se entrambe le voci hanno valori significativi e i valori sono diversi, correggere il valore _KeyField in modo che sia univoco. Per fare ciò, definire il valore massimo occupato per _KeyField (keymax):
Codice SQL S_elect max (_KeyField)
da _Document140_VT1385
dove _Document140_IDRRef = id1
Sostituisci il valore _KeyField in una delle voci duplicate con quella corretta:
Codice di aggiornamento SQL _Document140_VT1385
imposta _KeyField = keymax + 1
Qui _LineNo1386 = è una condizione aggiuntiva che consente di selezionare una delle due voci duplicate.

Se una (o entrambe) delle voci duplicate ha un valore ovviamente errato, deve essere rimossa:
Eliminazione codice SQL da _Document140_VT1385
dove _Document140_IDRRef = id1 e _LineNo1386 = lineno1
Se i record duplicati hanno gli stessi valori in tutte le colonne, dovresti lasciarne uno:
SQL S_select distinto *
in # tmp1
da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

Elimina da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

I_inserisci in _Document140_VT1385
S_eletto # tmp1

Tabella D_rop # tmp1

La procedura descritta deve essere eseguita per ogni coppia di record duplicati.

2.2.3. Secondo esempio:
Codice SQL S_elect COUNT (*) AS Espr2, _IDRRef AS Espr1, _Descrizione
DA _Riferimento8_
GRUPPO PER _IDRRef, _Descrizione
AVENDO (CONTEGGIO (*)> 1)

2.3.4 Un esempio di definizione di record non univoci utilizzando la query 1C: Enterprise:
Codice 1C v 8.x SELECT Reference.Link
DA Riferimento Riferimento AS Riferimento
LOAD BY Riferimento.Link
AVENTE QUANTITÀ (*)> 1

Ti sei imbattuto in un messaggio contenente le righe:
Provider Microsoft OLE DB per SQL Server: CREATE UNIQUE INDEX terminato perché è stata trovata una chiave duplicata per l'ID indice
o
Impossibile inserire la riga chiave duplicata nell'oggetto
o
Tentativo di inserire un valore non univoco in un indice univoco.

Opzioni di soluzione:

1. In SQL Server management studio, distruggiamo fisicamente l'indice errato (nel mio caso era un indice sulla tabella dei totali del registro contabile). Distribuiremo documenti difettosi in 1C. In modalità test e correzione, spuntare le caselle per reindicizzazione tabelle + ricalcolo totali. 1C ricrea l'indice senza errori. Eseguiamo documenti precedentemente falliti.

2. 1) Utilizzando Management Studio 2005, ho generato uno script di creazione per creare un indice, che presentava errori, e l'ho salvato in un file.
2) Ho ucciso manualmente l'indice dalla tabella _AccumRgTn19455
3) Lanciato una query come
Codice SQL S_elect count (*) index_fields
FR OM AccumRgTn19455
GROUP BY index_field
AVERE conteggio (*)> 1
Dopo che l'indice è stato ucciso, ho ottenuto 15 record duplicati, anche se fino all'esecuzione del passaggio 2, la query non ha restituito nulla.
4) Ho esaminato tutti i record e ripulito manualmente i duplicati. In effetti, ho anche utilizzato l'elaborazione "Report Structure" per capire con cosa avevo a che fare. Si è scoperto che la tabella _AccumRgTn19455 memorizza il registro di accumulo "Output prodotto (contabilità fiscale)". Stavo ancora scavando con query sql, identificato 15 documenti non univoci e, dopo aver completato tutte le azioni, ho verificato in 1C che questi documenti vengano elaborati normalmente, senza errori. Certo, non vale la pena pulire i tavoli a caso: è importante capire cosa viene pulito e come può risultare.
5) Lanciata una richiesta per creare un indice, che è stata salvata in un file.
6) Ho cambiato il database in modalità utente singolo e ho eseguito dbcc checkdb - questa volta non sono stati emessi errori.
7) Riportato la base in modalità utente singolo.
Ecco... il problema è sconfitto. Bene, anche in 1C, ho lanciato "Testing and Correction", è andato tutto bene anche lì, ho smesso di imprecare su un indice non univoco.

3. Se la non unicità risiede in date con valori zero, quindi il problema viene risolto creando una base con un parametro offset pari a 2000.

1. Se il problema sta caricando il database, allora:
1.1. Se carichi (usa il file dt) nel database di MS SQL Server, quando crei il database, prima del caricamento, specifica l'offset della data - 2000.
Se la base è già stata creata con offset 0, crearne una nuova dal 2000.

1.2. Se è possibile lavorare con il database nella versione del file, eseguire Test e correzione, nonché Configurazione - Verifica della configurazione - Verifica dell'integrità logica della configurazione + Ricerca di collegamenti non validi.

1.3. Se non esiste una versione del file, prova ad avviare da DT a una versione client/server con DB2 (che è meno esigente in termini di unicità), quindi esegui Test e correzione, nonché Configurazione - Verifica configurazione - Verifica coerenza configurazione logica + Trova non valido Riferimenti.

1.4. Per isolare il problema, è possibile determinare i dati dell'oggetto che non è stato caricato. Per fare ciò, è necessario abilitare la traccia all'avvio nell'utility Profiler o abilitare la registrazione nel registro degli eventi tecnologici DBMSSQL ed EXCP.

2. Se il problema della non unicità si manifesta durante il lavoro degli utenti:

2.1. Trovare la richiesta del problema utilizzando il metodo del paragrafo 1.4.

2.1.2. A volte si verifica un errore durante l'esecuzione delle richieste, ad esempio:

Questo errore si verifica a causa del fatto che nel modulo del registro di accumulo "Orario di lavoro dei dipendenti delle organizzazioni" nella procedura "RegisterRcalculations" la query non contiene la parola di servizio "VARIOUS".
Codice 1C v 8.x Es. dovrebbe essere:
Richiesta = Nuova richiesta (
"SCEGLI VARIE
| Basic.PhysFace,
. . . . .
Nelle ultime versioni rilasciate di ZUP e UPP, l'errore non si verifica, perché c'è "VARIO".

2.2. Dopo aver trovato l'indice problematico del paragrafo precedente, è necessario trovare una voce non univoca.
2.2.1. Script di pesce per la definizione di record non univoci utilizzando SQL:
Codice SQL S_elect COUNT (*) Contatore,<перечисление всех полей соответствующего индекса>a partire dal<имя таблицы>
RAGGRUPPA PER<перечисление всех полей соответствующего индекса>
AVERE Contatore > 1

2.2.2 Esempio. L'indice nell'errore è denominato "_Document140_VT1385_IntKeyIndNG".
Elenco dei campi della tabella:
_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
Eseguire il backup del database prima di seguire la procedura seguente.
Esegui l'analizzatore di query di MS SQL Server:
Codice SQL S_elect conteggio (*), _Document140_IDRRef, _KeyField
da _Document140_VT1385
raggruppa per _Document140_IDRRef, _KeyField
avere conteggio (*)> 1
Usalo per scoprire i valori delle colonne _Document140_IDRRef, _KeyField, record duplicati (id, chiave).

Su richiesta:
S_seleziona codice SQL *
da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1 o _Document140_IDRRef = id2 e _KeyField = key2 o ...
guarda i valori delle altre colonne di record duplicati.
Se entrambe le voci hanno valori significativi e i valori sono diversi, correggere il valore _KeyField in modo che sia univoco. Per fare ciò, definire il valore massimo occupato per _KeyField (keymax):
Codice SQL S_elect max (_KeyField)
da _Document140_VT1385
dove _Document140_IDRRef = id1
Sostituisci il valore _KeyField in una delle voci duplicate con quella corretta:
SQL aggiornato _Document140_VT1385
imposta _KeyField = keymax + 1

Qui _LineNo1386 = è una condizione aggiuntiva che consente di selezionare una delle due voci duplicate.

Se una (o entrambe) delle voci duplicate ha un valore ovviamente errato, deve essere rimossa:
Eliminazione codice SQL da _Document140_VT1385
dove _Document140_IDRRef = id1 e _LineNo1386 = lineno1
Se i record duplicati hanno gli stessi valori in tutte le colonne, dovresti lasciarne uno:
SQL S_select distinto *
in # tmp1
da _Document140_VT1385

Elimina da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

I_inserisci in _Document140_VT1385
S_eletto # tmp1

Tabella D_rop # tmp1

La procedura descritta deve essere eseguita per ogni coppia di record duplicati.

2.2.3. Secondo esempio:
Codice SQL S_elect COUNT (*) AS Espr2, _IDRRef AS Espr1, _Descrizione
DA _Riferimento8_
GRUPPO PER _IDRRef, _Descrizione
AVENDO (CONTEGGIO (*)> 1)

2.3.4 Un esempio di definizione di record non univoci utilizzando la query 1C: Enterprise:
Codice 1C v 8.x SELECT Reference.Link
DA Riferimento Riferimento AS Riferimento
LOAD BY Riferimento.Link
AVENTE QUANTITÀ (*)> 1

Informazioni prese dal sito

Questo articolo descriverà cosa fare se, quando si lavora con 1C: Enterprise 8.1, si incontra un messaggio contenente le righe:

Impossibile inserire una riga chiave duplicata nell'oggetto

Tentativo di inserire un valore non univoco in un indice univoco.

Che cos'è un indice?

Gli indici sono una struttura che consente di accedere rapidamente alle righe di una tabella in base ai valori di una o più delle sue colonne.
Un indice contiene chiavi costruite da una o più colonne di una tabella o vista e puntatori che mappano dove sono archiviati i dati specificati.
Gli indici riducono la quantità di dati che devono essere letti per restituire un set di risultati.

Sebbene un indice sia associato a una o più colonne specifiche in una tabella, è comunque un oggetto di database a sé stante.

Gli indici delle tabelle nel database 1C: Enterprise vengono creati implicitamente durante la creazione di oggetti di configurazione, nonché con determinate impostazioni degli oggetti di configurazione.

La natura fisica degli indici in MS SQL Server 2005.

Fisicamente i dati vengono archiviati su pagine da 8Kb... Immediatamente dopo la creazione, mentre la tabella non ha indici, la tabella appare come un mucchio di dati. I record non hanno un ordine di archiviazione specifico.
Quando si desidera accedere ai dati, SQL Server produrrà scansione della tabella(scansione tabella). SQL Server esegue la scansione dell'intera tabella per trovare i record che sta cercando.
Questo spiega le funzioni di base degli indici:
- aumentare la velocità di accesso ai dati,
- supporto per l'unicità dei dati.

Nonostante i loro vantaggi, gli indici presentano anche una serie di svantaggi. Il primo sono gli indici occupare spazio su disco aggiuntivo e nella RAM. Ogni volta che crei un indice, memorizzi le chiavi in ​​ordine decrescente o crescente, che può essere sovrapposto. E più grande/più lunga è la chiave, maggiore è la dimensione dell'indice. Il secondo svantaggio è le operazioni rallentano inserimento, aggiornamento e cancellazione di record.
Diversi tipi di indici sono implementati in MS SQL Server 2005:

  • indici non cluster;
  • indici cluster (o cluster);
  • indici univoci;
  • indici con colonne incluse
  • viste indicizzate
  • testo intero

Indice unico

L'unicità dei valori nella colonna indicizzata è garantita da indici univoci. Se sono presenti, il server non consentirà l'inserimento di un nuovo valore o la modifica di un valore esistente in modo che a seguito di questa operazione appaiano nella colonna due valori identici.
Un indice univoco è un tipo di componente aggiuntivo e può essere implementato per indici cluster e non cluster. Una tabella può avere un indice cluster univoco e molti indici non cluster univoci.
Gli indici univoci dovrebbero essere definiti solo quando assolutamente necessario. Per garantire l'integrità dei dati su una colonna, è possibile definire un vincolo di integrità UNIQUE o PRIMARY KEY anziché ricorrere a indici univoci. Usarli solo per garantire l'integrità dei dati è uno spreco di spazio nel database. Inoltre, il tempo del processore viene speso per la loro manutenzione.

1C: Enterprise 8.1 a partire dalla versione 8.1 utilizza attivamente indici univoci cluster. Ciò significa che durante la conversione da 8.0 o il passaggio da 8.1.7, potresti ricevere un errore di indice non univoco.

Se le date con valori zero non sono univoche, il problema viene risolto creando una base con un parametro offset di 2000.

Cosa fare?

1. Se il problema sta caricando il database, allora:

1.1. Se si carica (usare il file dt) nel database di MS SQL Server, quindi durante la creazione del database, prima del caricamento, specificare l'offset della data - 2000.

Se la base è già stata creata con offset 0, crearne una nuova dal 2000.

1.2. Se è possibile lavorare con il database nella versione del file, eseguire Test e correzione, nonché Configurazione - Verifica della configurazione - Verifica dell'integrità logica della configurazione + Ricerca di collegamenti non validi.

1.3. Se non esiste una versione del file, prova ad avviare da DT a una versione client/server con DB2 (che è meno esigente in termini di unicità), quindi esegui Test e correzione, nonché Configurazione - Verifica configurazione - Verifica coerenza configurazione logica + Trova non valido Riferimenti.

1.4. Per isolare il problema, è possibile determinare i dati dell'oggetto che non è stato caricato. Per fare ciò, è necessario abilitare la traccia all'avvio nell'utility Profiler o abilitare la registrazione nel registro eventi tecnologici DBMSSQL ed EXCP.

1.5. Se è disponibile un nodo (piani di scambio), eseguire uno scambio. È inoltre possibile eseguire il paragrafo 2.3.5 prima dello scambio.

2. Se il problema della non unicità si manifesta durante il lavoro dell'utente:

2.1. Trovare la richiesta del problema utilizzando il metodo del paragrafo 1.4.

2.1.2. A volte si verifica un errore durante l'esecuzione delle richieste, ad esempio:

Questo errore si verifica a causa del fatto che nel modulo del registro di accumulo "Ore di lavoro dei dipendenti delle organizzazioni" nella procedura "RegisterRcalculations" nella richiesta non è presente la parola di servizio "VARIE".

Quelli. dovrebbe essere:

Richiesta = Nuova richiesta (
SCEGLI VARIE
| Basic.PhysFace,

Nelle ultime versioni rilasciate di ZUP e UPP, l'errore non si verifica, perché c'è "VARIO".

2.2. Dopo aver trovato l'indice problematico del paragrafo precedente, è necessario trovare una voce non univoca.

2.2.1. Script di pesce per la definizione di record non univoci utilizzando SQL:
SELEZIONA CONTEGGIO (*) Contatore,<перечисление всех полей соответствующего индекса>a partire dal<имя таблицы>
RAGGRUPPA PER<перечисление всех полей соответствующего индекса>
AVERE Contatore > 1

2.2.2 Esempio. L'indice nell'errore è denominato "_Document140_VT1385_IntKeyIndNG".

Elenco dei campi della tabella:

Document140_IDRRref, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _R94, 93_FldR13R13

Fld1395, _Fld1396RRref, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_Ref_RFRld2226

Eseguire il backup del database prima di seguire la procedura seguente.
Esegui l'analizzatore di query di MS SQL Server:

seleziona conteggio (*), _Document140_IDRRef, _KeyField
da _Document140_VT1385
raggruppa per _Document140_IDRRef, _KeyField
avere conteggio (*)> 1

Usalo per scoprire i valori delle colonne _Document140_IDRRef, _KeyField, record duplicati (id, chiave).

Su richiesta:

Selezionare *
da _Document140_VT1385
o _Document140_IDRRef = id2 e _KeyField = key2 o ...

guarda i valori delle altre colonne di record duplicati.

Se entrambe le voci hanno valori significativi e i valori sono diversi, correggere il valore _KeyField in modo che sia univoco. Per fare ciò, definire il valore massimo occupato per _KeyField (keymax):

seleziona massimo (_KeyField)
da _Document140_VT1385
dove _Document140_IDRRef = id1

Sostituisci il valore _KeyField in una delle voci duplicate con quella corretta:

aggiornamento _Document140_VT1385
imposta _KeyField = keymax + 1

Qui _LineNo1386 = è una condizione aggiuntiva che consente di selezionare una delle due voci duplicate.

Se una (o entrambe) delle voci duplicate ha un valore ovviamente errato, deve essere rimossa:


dove _Document140_IDRRef = id1 e _LineNo1386 = lineno1

Se i record duplicati hanno gli stessi valori in tutte le colonne, dovresti lasciarne uno:

seleziona distinti *
in # tmp1
da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

elimina da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

inserire in _Document140_VT1385
seleziona # tmp1

elimina la tabella # tmp1

La procedura descritta deve essere eseguita per ogni coppia di record duplicati.

2.2.3. Secondo esempio:

SELEZIONA CONTEGGIO (*) AS Espr2, _IDRRef AS Espr1, _Descrizione
DA _Riferimento8_
GRUPPO PER _IDRRef, _Descrizione
AVENDO (CONTEGGIO (*)> 1)

2.3.4 Un esempio di definizione di record non univoci utilizzando la query 1C: Enterprise:

o per la contabilità

SELEZIONARE
Sottoquery.Periodo,
Subquery.Registratore,
<измерения>,
SUM (Sottoquery.Numero di record) AS Numero di record
A PARTIRE DAL
(SELEZIONARE
Periodo autosufficiente AS Periodo
Registrar autosufficiente Registrar AS,
<измерения>,
1 AS Numero di record
A PARTIRE DAL
Registro della Contabilità Autoportante AS Autoportante) AS Subquery

CARICA DA
Sottoquery.Periodo,
Subquery.Registratore,
<измерения>

AVENDO
SUM (Sottoquery.NumberRecords)> 1

2.3.5 Rendere l'indice dei subdat non univoco. Script l'indice utilizzando Management Studio.

2.3.6 Un caso speciale durante lo scambio in RDB. L'errore ricade sulle tabelle "ausiliari" associate al calcolo dei totali o delle dimensioni. Ad esempio:

Si è verificato un errore durante la chiamata al metodo di contesto (Write): tentativo di inserire un valore non univoco in un indice univoco:
Provider Microsoft OLE DB per SQL Server: impossibile inserire una riga di chiave duplicata nell'oggetto "dbo._AccntRegED10319" con indice univoco "_Accnt10319_ByPeriod_TRRNN".
HRESULT = 80040E2F, SQLSrvr: stato di errore = 1, gravità = E, nativo = 2601, riga = 1

In questo caso, prima del caricamento, disabilitare l'uso dei totali, caricare il messaggio, abilitare l'uso dei totali e ricalcolare.

Ti sei imbattuto in un messaggio contenente le righe:
Provider Microsoft OLE DB per SQL Server: CREATE UNIQUE INDEX terminato perché è stata trovata una chiave duplicata per l'ID indice
o
Impossibile inserire la riga chiave duplicata nell'oggetto
o
Tentativo di inserire un valore non univoco in un indice univoco.

Opzioni di soluzione:

1. In SQL Server management studio, distruggiamo fisicamente l'indice errato (nel mio caso era un indice sulla tabella dei totali del registro contabile). Distribuiremo documenti difettosi in 1C. In modalità test e correzione, spuntare le caselle per reindicizzazione tabelle + ricalcolo totali. 1C ricrea l'indice senza errori. Eseguiamo documenti precedentemente falliti.

2. 1) Utilizzando Management Studio 2005, ho generato uno script di creazione per creare un indice, che presentava errori, e l'ho salvato in un file.
2) Ho ucciso manualmente l'indice dalla tabella _AccumRgTn19455
3) Lanciato una query come
Codice SQL S_elect count (*) index_fields
DA AccumRgTn19455
GROUP BY index_field
AVERE conteggio (*)> 1
Dopo che l'indice è stato ucciso, ho ottenuto 15 record duplicati, anche se fino all'esecuzione del passaggio 2, la query non ha restituito nulla.
4) Ho esaminato tutti i record e ripulito manualmente i duplicati. In effetti, ho anche utilizzato l'elaborazione "Report Structure" per capire con cosa avevo a che fare. Si è scoperto che la tabella _AccumRgTn19455 memorizza il registro di accumulo "Output prodotto (contabilità fiscale)". Stavo ancora scavando con query sql, identificato 15 documenti non univoci e, dopo aver completato tutte le azioni, ho verificato in 1C che questi documenti vengano elaborati normalmente, senza errori. Certo, non vale la pena pulire i tavoli a caso: è importante capire cosa viene pulito e come può risultare.
5) Lanciata una richiesta per creare un indice, che è stata salvata in un file.
6) Ho cambiato il database in modalità utente singolo e ho eseguito dbcc checkdb - questa volta non sono stati emessi errori.
7) Riportato la base in modalità utente singolo.
Ecco... il problema è sconfitto. Bene, anche in 1C, ho lanciato "Testing and Correction", è andato tutto bene anche lì, ho smesso di imprecare su un indice non univoco.

3. Se la non unicità risiede in date con valori zero, quindi il problema viene risolto creando una base con un parametro offset pari a 2000.

1. Se il problema sta caricando il database, allora:
1.1. Se si carica (usare il file dt) nel database di MS SQL Server, quindi durante la creazione del database, prima del caricamento, specificare l'offset della data - 2000.
Se la base è già stata creata con offset 0, crearne una nuova dal 2000.

1.2. Se è possibile lavorare con il database nella versione del file, eseguire Test e correzione, nonché Configurazione - Verifica della configurazione - Verifica dell'integrità logica della configurazione + Ricerca di collegamenti non validi.

1.3. Se non esiste una versione del file, prova ad avviare da DT a una versione client/server con DB2 (che è meno esigente in termini di unicità), quindi esegui Test e correzione, nonché Configurazione - Verifica configurazione - Verifica coerenza configurazione logica + Trova non valido Riferimenti.

1.4. Per isolare il problema, è possibile determinare i dati dell'oggetto che non è stato caricato. Per fare ciò, è necessario abilitare la traccia all'avvio nell'utility Profiler o abilitare la registrazione nel registro degli eventi tecnologici DBMSSQL ed EXCP.

2. Se il problema della non unicità si manifesta durante il lavoro dell'utente:

2.1. Trovare la richiesta del problema utilizzando il metodo del paragrafo 1.4.

2.1.2. A volte si verifica un errore durante l'esecuzione delle richieste, ad esempio:

Questo errore si verifica a causa del fatto che nel modulo del registro di accumulo "Orario di lavoro dei dipendenti delle organizzazioni" nella procedura "RegisterRcalculations" la query non contiene la parola di servizio "VARIOUS".
Codice 1C v 8.x Es. dovrebbe essere:
Richiesta = Nuova richiesta (
"SCEGLI VARIE
| Basic.PhysFace,
. . . . .
Nelle ultime versioni rilasciate di ZUP e UPP, l'errore non si verifica, perché c'è "VARIO".

2.2. Dopo aver trovato l'indice problematico del paragrafo precedente, è necessario trovare una voce non univoca.
2.2.1. Script di pesce per la definizione di record non univoci utilizzando SQL:
Codice SQL S_elect COUNT (*) Contatore,<перечисление всех полей соответствующего индекса>a partire dal<имя таблицы>
RAGGRUPPA PER<перечисление всех полей соответствующего индекса>
AVERE Contatore > 1

2.2.2 Esempio. L'indice nell'errore è denominato "_Document140_VT1385_IntKeyIndNG".
Elenco dei campi della tabella:
_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
Eseguire il backup del database prima di seguire la procedura seguente.
Esegui l'analizzatore di query di MS SQL Server:
Codice SQL S_elect conteggio (*), _Document140_IDRRef, _KeyField
da _Document140_VT1385
raggruppa per _Document140_IDRRef, _KeyField
avere conteggio (*)> 1
Usalo per scoprire i valori delle colonne _Document140_IDRRef, _KeyField, record duplicati (id, chiave).

Su richiesta:
S_seleziona codice SQL *
da _Document140_VT1385
o _Document140_IDRRef = id2 e _KeyField = key2 o ...
guarda i valori delle altre colonne di record duplicati.
Se entrambe le voci hanno valori significativi e i valori sono diversi, correggere il valore _KeyField in modo che sia univoco. Per fare ciò, definire il valore massimo occupato per _KeyField (keymax):
Codice SQL S_elect max (_KeyField)
da _Document140_VT1385
dove _Document140_IDRRef = id1
Sostituisci il valore _KeyField in una delle voci duplicate con quella corretta:
Codice di aggiornamento SQL _Document140_VT1385
imposta _KeyField = keymax + 1
Qui _LineNo1386 = è una condizione aggiuntiva che consente di selezionare una delle due voci duplicate.

Se una (o entrambe) delle voci duplicate ha un valore ovviamente errato, deve essere rimossa:
Eliminazione codice SQL da _Document140_VT1385
dove _Document140_IDRRef = id1 e _LineNo1386 = lineno1
Se i record duplicati hanno gli stessi valori in tutte le colonne, dovresti lasciarne uno:
SQL S_select distinto *
in # tmp1
da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

Elimina da _Document140_VT1385
dove _Document140_IDRRef = id1 e _KeyField = key1

I_inserisci in _Document140_VT1385
S_eletto # tmp1

Tabella D_rop # tmp1

La procedura descritta deve essere eseguita per ogni coppia di record duplicati.

2.2.3. Secondo esempio:
Codice SQL S_elect COUNT (*) AS Espr2, _IDRRef AS Espr1, _Descrizione
DA _Riferimento8_
GRUPPO PER _IDRRef, _Descrizione
AVENDO (CONTEGGIO (*)> 1)

2.3.4 Un esempio di definizione di record non univoci utilizzando la query 1C: Enterprise:
Codice 1C v 8.x SELECT Reference.Link
DA Riferimento Riferimento AS Riferimento
LOAD BY Riferimento.Link
AVENTE QUANTITÀ (*)> 1

Principali articoli correlati