Se intentó insertar un valor no único en un índice único. Error: intentar insertar un valor no único en un índice único: servidor Microsoft SQL. al cambiar de contabilidad profesional a corporativa y no solo Eliminar índices no únicos en el archivo 1c 8

Ha recibido un mensaje que contiene las líneas:
Proveedor Microsoft OLE DB para SQL Server: CREAR ÍNDICE ÚNICO finalizó porque se encontró una clave duplicada para el ID de índice
o
No puedo insertar una fila de clave duplicada en el objeto
o
Se intentó insertar un valor no único en un índice único.

Soluciones:

1. En el estudio de administración de SQL Server, destruimos físicamente el índice defectuoso (en mi caso era un índice en la tabla de totales del registro contable). En 1C distribuiremos los documentos defectuosos. En modo de prueba y corrección, marque las casillas para reindexar tablas + recálculo de totales. 1C recrea el índice sin errores. Realizamos documentos previamente fallidos.

2. 1) Usando Management Studio 2005, generé un script de creación para crear un índice, que tenía errores, y lo guardé en un archivo.
2) Eliminó manualmente el índice de jamba de la tabla _AccumRgTn19455
3) Lanzó una solicitud como
Código SQL S_elect count(*), index_fields
DE AccumRgTn19455
GRUPO POR campo_índice
TENIENDO recuento (*)>1
Después de que se eliminó el índice, se mostraron 15 registros duplicados, aunque antes del paso 2 la consulta no arrojó nada.
4) Revisé todas las entradas y limpié manualmente los duplicados. De hecho, también utilicé el procesamiento de “Estructura del informe” para comprender a qué me estaba enfrentando. Resultó que la tabla _AccumRgTn19455 almacena el registro de acumulación "Salida del producto (contabilidad fiscal)". También jugué con consultas SQL, identifiqué 15 documentos no únicos y, una vez completadas todas las acciones, verifiqué en 1C que estos documentos se procesaron normalmente, sin errores. Por supuesto, no se deben limpiar las mesas al azar: es importante comprender qué se limpia y cómo puede resultar.
5) Lanzó una solicitud para crear un índice, que se guardó en un archivo.
6) Cambió la base de datos al modo de usuario único y lanzó dbcc checkdb; esta vez no se generaron errores.
7) Volvió la base al modo de usuario único.
Eso es todo... el problema está superado. Bueno, en 1C lancé "Prueba y corrección", allí también todo salió bien, dejé de quejarme del índice no único.

3. Si la no unicidad radica en fechas con valores cero, entonces el problema se resuelve creando una base de datos con un parámetro de desplazamiento igual a 2000.

1. Si el problema es cargar la base de datos, entonces:
1.1. Si está cargando (usando un archivo dt) en una base de datos de MS SQL Server, al crear la base de datos, antes de cargar, especifique el desplazamiento de fecha: 2000.
Si la base de datos ya se creó con el desplazamiento 0, cree una nueva con 2000.

1.2. Si es posible trabajar con la base de datos en la versión del archivo, realice Pruebas y Corrección, así como Configuración - Verificación de la configuración - Verificación de la integridad lógica de la configuración + Búsqueda de enlaces incorrectos.

1.3. Si no hay una versión del archivo, intente cargar desde DT a una versión cliente-servidor con DB2 (que exige menos unicidad) y luego realice la Prueba y corrección, así como la Configuración - Verificar la configuración - Verificar la integridad lógica de la configuración. + Búsqueda de referencias no válidas.

1.4. Para localizar el problema, puede determinar los datos del objeto cuya carga falló. Para hacer esto, debe habilitar el seguimiento en la utilidad Profiler durante el inicio o habilitar la grabación en el registro de eventos del proceso DBMSSQL y EXCP.

2. Si el problema de falta de unicidad ocurre mientras los usuarios están trabajando:

2.1. Encuentre la solicitud problemática utilizando el método del párrafo 1.4.

2.1.2. A veces ocurre un error al ejecutar consultas, por ejemplo:

Este error se produce debido a que en el módulo de registro de acumulación “Tiempo de trabajo de los empleados de las organizaciones” en el procedimiento “Recálculos de Registro”, la palabra de servicio “DIFERENTE” no está incluida en la solicitud.
Código 1C v 8.x, es decir. debiera ser:
Solicitud = Nueva solicitud (
"SELECCIONE VARIOS
| Básico.Individual,
. . . . .
En las últimas versiones de ZUP y UPP, el error no ocurre porque dice "DIFERENTE".

2.2. Después de encontrar el índice problemático del párrafo anterior, necesita encontrar un registro no único.
2.2.1. Script "Fish" para identificar registros no únicos usando SQL:
Código SQL S_elect COUNT(*) Contador,<перечисление всех полей соответствующего индекса>de<имя таблицы>
AGRUPAR POR<перечисление всех полей соответствующего индекса>
TENIENDO Contador > 1

2.2.2 Ejemplo. El índice del error se llama "_Document140_VT1385_IntKeyIndNG".
Lista de campos de la tabla:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_RR Ref, _Fld1394,_Fld1 395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_RT Ref, _Fld22261_RRRef
Antes de realizar el siguiente procedimiento, haga una copia de seguridad de su base de datos.
Ejecute en el Analizador de consultas de MS SQL Server:
Código SQL S_elect count(*), _Document140_IDRRef, _KeyField
from_Document140_VT1385
agrupar por _Document140_IDRRef, _KeyField
teniendo recuento(*) > 1
Úselo para averiguar los valores de las columnas _Document140_IDRRef, _KeyField, registros duplicados (id, clave).

Usando la solicitud:
Código SQL S_elect *
from_Document140_VT1385
o _Document140_IDRRef = id2 y _KeyField = key2 o ...
mire los valores de las otras columnas de las entradas duplicadas.
Si ambas entradas tienen valores significativos y los valores son diferentes, cambie el valor _KeyField para que sea único. Para hacer esto, determine el valor máximo ocupado de _KeyField (keymax):
Código SQL S_elect max(_KeyField)
from_Document140_VT1385
donde _Documento140_IDRRef = id1
Reemplace el valor _KeyField en una de las entradas duplicadas por la correcta:
Actualización de código SQL _Document140_VT1385
establecer _KeyField = clavemáx + 1
Aquí _LineNo1386 = es una condición adicional que le permite seleccionar uno de dos registros repetidos.

Si una (o ambas) de las entradas duplicadas tiene un significado obviamente incorrecto, entonces debe eliminarse:
Eliminación de código SQL de _Document140_VT1385
donde _Document140_IDRRef = id1 y _LineNo1386 = lineno1
Si las entradas duplicadas tienen los mismos valores en todas las columnas, entonces debe dejar una de ellas:
Código SQL S_elect distinto *
en #tmp1
from_Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

Eliminar de _Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

Insertar en _Document140_VT1385
S_elect #tmp1

Tabla D_rop #tmp1

El procedimiento descrito debe realizarse para cada par de registros duplicados.

2.2.3. Segundo ejemplo:
Código SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Descripción
DE _Referencia8_
GRUPO POR _IDRRef, _Descripción
TENIENDO (CONTAR(*) > 1)

2.3.4 Un ejemplo de determinación de registros no únicos mediante una consulta 1C:Enterprise:
Código 1C v 8.x SELECCIONAR Directorio.Enlace
DESDE Directorio.Directorio AS Directorio
GRUPO POR Directorio.Enlace
TENER CANTIDAD (*) > 1

Este artículo describirá qué hacer si, al trabajar con 1C:Enterprise 8.1, encuentra un mensaje que contiene las líneas:

No se puede insertar una fila de clave duplicada en el objeto

Se intentó insertar un valor no único en un índice único.

¿Qué es un índice?

Los índices son una estructura que permite un acceso rápido a las filas de una tabla en función de los valores de una o más de sus columnas.
Un índice contiene claves, creadas a partir de una o más columnas de una tabla o vista, y punteros que se asignan al lugar donde se almacenan los datos especificados.
Los índices reducen la cantidad de datos que se deben leer para devolver un conjunto de resultados.

Aunque un índice está asociado con una columna (o columnas) específicas de una tabla, sigue siendo un objeto de base de datos independiente.

Los índices de tablas en la base de datos 1C:Enterprise se crean implícitamente al crear objetos de configuración, así como durante ciertas configuraciones de los objetos de configuración.

La esencia física de los índices en MS SQL Server 2005.

Físicamente los datos se almacenan. en páginas de 8Kb. Inmediatamente después de su creación, aunque la tabla no tiene índices, parece un montón de datos. Los registros no tienen un orden de almacenamiento específico.
Cuando desee acceder a los datos, SQL Server producirá escaneo de mesa(escaneo de tabla). SQL Server escanea toda la tabla para encontrar los registros que busca.
A partir de aquí quedan claras las funciones básicas de los índices:
— aumentar la velocidad de acceso a los datos,
— soporte para la unicidad de los datos.

A pesar de sus ventajas, los índices también tienen una serie de desventajas. El primero son los índices. ocupar espacio adicional en disco y en la RAM. Cada vez que crea un índice, almacena las claves en orden descendente o ascendente, que puede tener una estructura de varios niveles. Y cuanto más grande/larga sea la clave, mayor será el tamaño del índice. La segunda desventaja es las operaciones se están desacelerando insertar, actualizar y eliminar registros.
En el entorno MS SQL Server 2005, se implementan varios tipos de índices:

  • índices no agrupados;
  • índices agrupados (o agrupados);
  • índices únicos;
  • índices con columnas incluidas
  • vistas indexadas
  • texto completo

índice único

La unicidad de los valores en la columna indexada está garantizada por índices únicos. Si están presentes, el servidor no le permitirá insertar un nuevo valor o cambiar un valor existente de tal manera que como resultado de esta operación aparezcan dos valores idénticos en la columna.
Un índice único es una especie de complemento y se puede implementar tanto para índices agrupados como para índices no agrupados. Una tabla puede tener un índice agrupado único y muchos índices no agrupados únicos.
Los índices únicos sólo deben definirse cuando sea realmente necesario. Para garantizar la integridad de los datos en una columna, puede definir una restricción de integridad de CLAVE ÚNICA o PRIMARIA en lugar de recurrir a índices únicos. Usarlos únicamente para garantizar la integridad de los datos es una pérdida de espacio en la base de datos. Además, también se dedica tiempo de CPU a su mantenimiento.

1C:Enterprise 8.1, a partir de la versión 8.1, utiliza activamente índices únicos agrupados. Esto significa que al convertir desde 8.0 o migrar desde 8.1.7 es posible que obtenga un error de índice no único.

Si la falta de unicidad radica en fechas con valores cero, entonces el problema se resuelve creando una base de datos con un parámetro de compensación igual a 2000.

¿Qué hacer?

1. Si el problema es cargar la base de datos, entonces:

1.1. Si está cargando (usando un archivo dt) en una base de datos de MS SQL Server, al crear la base de datos, antes de cargar, especifique el desplazamiento de fecha: 2000.

Si la base de datos ya se creó con el desplazamiento 0, cree una nueva con 2000.

1.2. Si es posible trabajar con la base de datos en la versión del archivo, realice Pruebas y Corrección, así como Configuración - Verificación de la configuración - Verificación de la integridad lógica de la configuración + Búsqueda de enlaces incorrectos.

1.3. Si no hay una versión del archivo, intente cargar desde DT a una versión cliente-servidor con DB2 (que exige menos unicidad) y luego realice la Prueba y corrección, así como la Configuración - Verificar la configuración - Verificar la integridad lógica de la configuración. + Búsqueda de referencias no válidas.

1.4. Para localizar el problema, puede determinar los datos del objeto cuya carga falló. Para hacer esto, debe habilitar el seguimiento en la utilidad Profiler durante el inicio o habilitar la grabación en el registro de eventos tecnológicos DBMSSQL y EXCP.

1.5. Si el nodo (planes de intercambio) está disponible, realice el intercambio. También puede completar adicionalmente el párrafo 2.3.5 antes de realizar el intercambio.

2. Si el problema de falta de unicidad ocurre mientras los usuarios están trabajando:

2.1. Encuentre la solicitud problemática utilizando el método del párrafo 1.4.

2.1.2. A veces ocurre un error al ejecutar consultas, por ejemplo:

Este error se produce debido a que en el módulo de registro de acumulación “Tiempo de trabajo de los empleados de las organizaciones” en el procedimiento “Recálculos de Registro”, la palabra de servicio “DIFERENTE” no está incluida en la solicitud.

Aquellos. debiera ser:

Solicitud = Nueva solicitud (
"SELECCIONE VARIOS
| Básico.Individual,

En las últimas versiones de ZUP y UPP, el error no ocurre porque dice "DIFERENTE".

2.2. Después de encontrar el índice problemático del párrafo anterior, necesita encontrar un registro no único.

2.2.1. Script "Fish" para identificar registros no únicos usando SQL:
SELECCIONAR CONTADOR(*) Contador,<перечисление всех полей соответствующего индекса>de<имя таблицы>
AGRUPAR POR<перечисление всех полей соответствующего индекса>
TENIENDO Contador > 1

2.2.2 Ejemplo. El índice del error se llama "_Document140_VT1385_IntKeyIndNG".

Lista de campos de la tabla:

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

Antes de realizar el siguiente procedimiento, haga una copia de seguridad de su base de datos.
Ejecute en el Analizador de consultas de MS SQL Server:

seleccione recuento (*), _Document140_IDRRef, _KeyField
from_Document140_VT1385
agrupar por _Document140_IDRRef, _KeyField
teniendo recuento(*) > 1

Úselo para averiguar los valores de las columnas _Document140_IDRRef, _KeyField, registros duplicados (id, clave).

Usando la solicitud:

seleccionar *
from_Document140_VT1385
o _Document140_IDRRef = id2 y _KeyField = key2 o…

mire los valores de las otras columnas de las entradas duplicadas.

Si ambas entradas tienen valores significativos y los valores son diferentes, cambie el valor _KeyField para que sea único. Para hacer esto, determine el valor máximo ocupado de _KeyField (keymax):

seleccione máximo (_KeyField)
from_Document140_VT1385
donde _Documento140_IDRRef = id1

Reemplace el valor _KeyField en una de las entradas duplicadas por la correcta:

actualización_Documento140_VT1385
establecer _KeyField = clavemáx + 1

Aquí _LineNo1386 = es una condición adicional que le permite seleccionar uno de dos registros repetidos.

Si una (o ambas) de las entradas duplicadas tiene un significado obviamente incorrecto, entonces debe eliminarse:


donde _Document140_IDRRef = id1 y _LineNo1386 = lineno1

Si las entradas duplicadas tienen los mismos valores en todas las columnas, entonces debe dejar una de ellas:

seleccione distinto *
en #tmp1
from_Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

eliminar de _Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

insertar en _Documento140_VT1385
seleccione #tmp1

soltar tabla #tmp1

El procedimiento descrito debe realizarse para cada par de registros duplicados.

2.2.3. Segundo ejemplo:

SELECCIONE CONTAR(*) COMO Expr2, _IDRRef COMO Expr1, _Descripción
DE _Referencia8_
GRUPO POR _IDRRef, _Descripción
TENIENDO (CONTAR(*) > 1)

2.3.4 Un ejemplo de determinación de registros no únicos mediante una consulta 1C:Enterprise:

o para contabilidad

ELEGIR
Subconsulta.Período,
Subconsulta.Registrador,
<измерения>,
SUMA(Subconsulta.Número de registros) AS Número de registros
DE
(ELEGIR
Autoportante Período AS Período,
Registrador autoportante AS Registrador,
<измерения>,
1 AS Número de registros
DE
Registro Contable Autoportante AS Autoportante) AS Subconsulta

AGRUPAR POR
Subconsulta.Período,
Subconsulta.Registrador,
<измерения>

TENIENDO
SUMA(Subconsulta.Número de registros) > 1

2.3.5 Hacer que el índice subd no sea único. Cree un script para el índice utilizando Management Studio.

2.3.6 Un caso especial al intercambiar en el RDB. El error se produce en tablas “auxiliares” asociadas al cálculo de totales o analíticas. Por ejemplo:

Error al llamar al método de contexto (Escribir): intentar insertar un valor no único en un índice único:
Proveedor Microsoft OLE DB para SQL Server: no se puede insertar una fila de clave duplicada en el objeto 'dbo._AccntRegED10319' con índice único '_Accnt10319_ByPeriod_TRNRN'.
HRESULT=80040E2F, SQLSrvr: Estado de error=1, Gravedad=E, nativo=2601, línea=1

En este caso, antes de cargar, desactive el uso de totales, cargue el mensaje, habilite el uso de totales y vuelva a calcular.

Ha recibido un mensaje que contiene las líneas:
Proveedor Microsoft OLE DB para SQL Server: CREAR ÍNDICE ÚNICO finalizó porque se encontró una clave duplicada para el ID de índice
o
No puedo insertar una fila de clave duplicada en el objeto
o
Se intentó insertar un valor no único en un índice único.

Soluciones:

1. En el estudio de administración de SQL Server, destruimos físicamente el índice defectuoso (en mi caso era un índice en la tabla de totales del registro contable). En 1C distribuiremos los documentos defectuosos. En modo de prueba y corrección, marque las casillas para reindexar tablas + recálculo de totales. 1C recrea el índice sin errores. Realizamos documentos previamente fallidos.

2. 1) Usando Management Studio 2005, generé un script de creación para crear un índice, que tenía errores, y lo guardé en un archivo.
2) Eliminó manualmente el índice de jamba de la tabla _AccumRgTn19455
3) Lanzó una solicitud como
Código SQL S_elect count(*), index_fields
FR OM AccumRgTn19455
GRUPO POR campo_índice
TENIENDO recuento (*)>1
Después de que se eliminó el índice, se mostraron 15 registros duplicados, aunque antes del paso 2 la consulta no arrojó nada.
4) Revisé todas las entradas y limpié manualmente los duplicados. De hecho, también utilicé el procesamiento de “Estructura del informe” para comprender a qué me estaba enfrentando. Resultó que la tabla _AccumRgTn19455 almacena el registro de acumulación "Salida del producto (contabilidad fiscal)". También jugué con consultas SQL, identifiqué 15 documentos no únicos y, una vez completadas todas las acciones, verifiqué en 1C que estos documentos se procesaron normalmente, sin errores. Por supuesto, no se deben limpiar las mesas al azar: es importante comprender qué se limpia y cómo puede resultar.
5) Lanzó una solicitud para crear un índice, que se guardó en un archivo.
6) Cambió la base de datos al modo de usuario único y lanzó dbcc checkdb; esta vez no se generaron errores.
7) Volvió la base al modo de usuario único.
Eso es todo... el problema está superado. Bueno, en 1C lancé "Prueba y corrección", allí también todo salió bien, dejé de quejarme del índice no único.

3. Si la no unicidad radica en fechas con valores cero, entonces el problema se resuelve creando una base de datos con un parámetro de desplazamiento igual a 2000.

1. Si el problema es cargar la base de datos, entonces:
1.1. Si está cargando (usando un archivo dt) en una base de datos de MS SQL Server, al crear la base de datos, antes de cargar, especifique el desplazamiento de fecha: 2000.
Si la base de datos ya se creó con el desplazamiento 0, cree una nueva con 2000.

1.2. Si es posible trabajar con la base de datos en la versión del archivo, realice Pruebas y Corrección, así como Configuración - Verificación de la configuración - Verificación de la integridad lógica de la configuración + Búsqueda de enlaces incorrectos.

1.3. Si no hay una versión del archivo, intente cargar desde DT a una versión cliente-servidor con DB2 (que exige menos unicidad) y luego realice la Prueba y corrección, así como la Configuración - Verificar la configuración - Verificar la integridad lógica de la configuración. + Búsqueda de referencias no válidas.

1.4. Para localizar el problema, puede determinar los datos del objeto cuya carga falló. Para hacer esto, debe habilitar el seguimiento en la utilidad Profiler durante el inicio o habilitar la grabación en el registro de eventos del proceso DBMSSQL y EXCP.

2. Si el problema de falta de unicidad ocurre mientras los usuarios están trabajando:

2.1. Encuentre la solicitud problemática utilizando el método del párrafo 1.4.

2.1.2. A veces ocurre un error al ejecutar consultas, por ejemplo:

Este error se produce debido a que en el módulo de registro de acumulación “Tiempo de trabajo de los empleados de las organizaciones” en el procedimiento “Recálculos de Registro”, la palabra de servicio “DIFERENTE” no está incluida en la solicitud.
Código 1C v 8.x, es decir. debiera ser:
Solicitud = Nueva solicitud (
"SELECCIONE VARIOS
| Básico.Individual,
. . . . .
En las últimas versiones de ZUP y UPP, el error no ocurre porque dice "DIFERENTE".

2.2. Después de encontrar el índice problemático del párrafo anterior, necesita encontrar un registro no único.
2.2.1. Script "Fish" para identificar registros no únicos usando SQL:
Código SQL S_elect COUNT(*) Contador,<перечисление всех полей соответствующего индекса>de<имя таблицы>
AGRUPAR POR<перечисление всех полей соответствующего индекса>
TENIENDO Contador > 1

2.2.2 Ejemplo. El índice del error se llama "_Document140_VT1385_IntKeyIndNG".
Lista de campos de la tabla:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_RR Ref, _Fld1394,_Fld1 395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_RT Ref, _Fld22261_RRRef
Antes de realizar el siguiente procedimiento, haga una copia de seguridad de su base de datos.
Ejecute en el Analizador de consultas de MS SQL Server:
Código SQL S_elect count(*), _Document140_IDRRef, _KeyField
de _Document140_VT1385
agrupar por _Document140_IDRRef, _KeyField
teniendo recuento(*) > 1
Úselo para averiguar los valores de las columnas _Document140_IDRRef, _KeyField, registros duplicados (id, clave).

Usando la solicitud:
Código SQL S_elect *
de _Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1 o _Document140_IDRRef = id2 y _KeyField = clave2 o...
mire los valores de las otras columnas de las entradas duplicadas.
Si ambas entradas tienen valores significativos y los valores son diferentes, cambie el valor _KeyField para que sea único. Para hacer esto, determine el valor máximo ocupado de _KeyField (keymax):
Código SQL S_elect max(_KeyField)
de _Document140_VT1385
donde _Documento140_IDRRef = id1
Reemplace el valor _KeyField en una de las entradas duplicadas por la correcta:
Código SQL actualizado _Document140_VT1385
establecer _KeyField = clavemáx + 1

Aquí _LineNo1386 = es una condición adicional que le permite seleccionar uno de dos registros repetidos.

Si una (o ambas) de las entradas duplicadas tiene un significado obviamente incorrecto, entonces debe eliminarse:
Eliminación de código SQL de _Document140_VT1385
donde _Document140_IDRRef = id1 y _LineNo1386 = lineno1
Si las entradas duplicadas tienen los mismos valores en todas las columnas, entonces debe dejar una de ellas:
Código SQL S_elect distinto *
en #tmp1
from_Document140_VT1385

Eliminar de _Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

Insertar en _Document140_VT1385
S_elect #tmp1

Tabla D_rop #tmp1

El procedimiento descrito debe realizarse para cada par de registros duplicados.

2.2.3. Segundo ejemplo:
Código SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Descripción
DE _Referencia8_
GRUPO POR _IDRRef, _Descripción
TENIENDO (CONTAR(*) > 1)

2.3.4 Un ejemplo de determinación de registros no únicos mediante una consulta 1C:Enterprise:
Código 1C v 8.x SELECCIONAR Directorio.Enlace
DESDE Directorio.Directorio AS Directorio
GRUPO POR Directorio.Enlace
TENER CANTIDAD (*) > 1

Información extraída del sitio.

Ha recibido un mensaje que contiene las líneas:
Proveedor Microsoft OLE DB para SQL Server: CREAR ÍNDICE ÚNICO finalizó porque se encontró una clave duplicada para el ID de índice
o
No puedo insertar una fila de clave duplicada en el objeto
o
Se intentó insertar un valor no único en un índice único.

Soluciones:

1. En el estudio de administración de SQL Server, destruimos físicamente el índice defectuoso (en mi caso era un índice en la tabla de totales del registro contable). En 1C distribuiremos los documentos defectuosos. En modo de prueba y corrección, marque las casillas para reindexar tablas + recálculo de totales. 1C recrea el índice sin errores. Realizamos documentos previamente fallidos.

2. 1) Usando Management Studio 2005, generé un script de creación para crear un índice, que tenía errores, y lo guardé en un archivo.
2) Eliminó manualmente el índice de jamba de la tabla _AccumRgTn19455
3) Lanzó una solicitud como
Código SQL S_elect count(*), index_fields
DE AccumRgTn19455
GRUPO POR campo_índice
TENIENDO recuento (*)>1
Después de que se eliminó el índice, se mostraron 15 registros duplicados, aunque antes del paso 2 la consulta no arrojó nada.
4) Revisé todas las entradas y limpié manualmente los duplicados. De hecho, también utilicé el procesamiento de “Estructura del informe” para comprender a qué me estaba enfrentando. Resultó que la tabla _AccumRgTn19455 almacena el registro de acumulación "Salida del producto (contabilidad fiscal)". También jugué con consultas SQL, identifiqué 15 documentos no únicos y, una vez completadas todas las acciones, verifiqué en 1C que estos documentos se procesaron normalmente, sin errores. Por supuesto, no se deben limpiar las mesas al azar: es importante comprender qué se limpia y cómo puede resultar.
5) Lanzó una solicitud para crear un índice, que se guardó en un archivo.
6) Cambió la base de datos al modo de usuario único y lanzó dbcc checkdb; esta vez no se generaron errores.
7) Volvió la base al modo de usuario único.
Eso es todo... el problema está superado. Bueno, en 1C lancé "Prueba y corrección", allí también todo salió bien, dejé de quejarme del índice no único.

3. Si la no unicidad radica en fechas con valores cero, entonces el problema se resuelve creando una base de datos con un parámetro de desplazamiento igual a 2000.

1. Si el problema es cargar la base de datos, entonces:
1.1. Si está cargando (usando un archivo dt) en una base de datos de MS SQL Server, al crear la base de datos, antes de cargar, especifique el desplazamiento de fecha: 2000.
Si la base de datos ya se creó con el desplazamiento 0, cree una nueva con 2000.

1.2. Si es posible trabajar con la base de datos en la versión del archivo, realice Pruebas y Corrección, así como Configuración - Verificación de la configuración - Verificación de la integridad lógica de la configuración + Búsqueda de enlaces incorrectos.

1.3. Si no hay una versión del archivo, intente cargar desde DT a una versión cliente-servidor con DB2 (que exige menos unicidad) y luego realice la Prueba y corrección, así como la Configuración - Verificar la configuración - Verificar la integridad lógica de la configuración. + Búsqueda de referencias no válidas.

1.4. Para localizar el problema, puede determinar los datos del objeto cuya carga falló. Para hacer esto, debe habilitar el seguimiento en la utilidad Profiler durante el inicio o habilitar la grabación en el registro de eventos del proceso DBMSSQL y EXCP.

2. Si el problema de falta de unicidad ocurre mientras los usuarios están trabajando:

2.1. Encuentre la solicitud problemática utilizando el método del párrafo 1.4.

2.1.2. A veces ocurre un error al ejecutar consultas, por ejemplo:

Este error se produce debido a que en el módulo de registro de acumulación “Tiempo de trabajo de los empleados de las organizaciones” en el procedimiento “Recálculos de Registro”, la palabra de servicio “DIFERENTE” no está incluida en la solicitud.
Código 1C v 8.x, es decir. debiera ser:
Solicitud = Nueva solicitud (
"SELECCIONE VARIOS
| Básico.Individual,
. . . . .
En las últimas versiones de ZUP y UPP, el error no ocurre porque dice "DIFERENTE".

2.2. Después de encontrar el índice problemático del párrafo anterior, necesita encontrar un registro no único.
2.2.1. Script "Fish" para identificar registros no únicos usando SQL:
Código SQL S_elect COUNT(*) Contador,<перечисление всех полей соответствующего индекса>de<имя таблицы>
AGRUPAR POR<перечисление всех полей соответствующего индекса>
TENIENDO Contador > 1

2.2.2 Ejemplo. El índice del error se llama "_Document140_VT1385_IntKeyIndNG".
Lista de campos de la tabla:
_Document140_IDRRef, _KeyField, _LineNo1386, _Fld1387, _Fld1388, _Fld1389, _Fld1390, _Fld1391RRef, _Fld1392RRef, _Fld1393_TYPE, _Fld1393_RTRef, _Fld1393_RR Ref, _Fld1394,_Fld1 395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261_RT Ref, _Fld22261_RRRef
Antes de realizar el siguiente procedimiento, haga una copia de seguridad de su base de datos.
Ejecute en el Analizador de consultas de MS SQL Server:
Código SQL S_elect count(*), _Document140_IDRRef, _KeyField
from_Document140_VT1385
agrupar por _Document140_IDRRef, _KeyField
teniendo recuento(*) > 1
Úselo para averiguar los valores de las columnas _Document140_IDRRef, _KeyField, registros duplicados (id, clave).

Usando la solicitud:
Código SQL S_elect *
from_Document140_VT1385
o _Document140_IDRRef = id2 y _KeyField = key2 o ...
mire los valores de las otras columnas de las entradas duplicadas.
Si ambas entradas tienen valores significativos y los valores son diferentes, cambie el valor _KeyField para que sea único. Para hacer esto, determine el valor máximo ocupado de _KeyField (keymax):
Código SQL S_elect max(_KeyField)
from_Document140_VT1385
donde _Documento140_IDRRef = id1
Reemplace el valor _KeyField en una de las entradas duplicadas por la correcta:
Actualización de código SQL _Document140_VT1385
establecer _KeyField = clavemáx + 1
Aquí _LineNo1386 = es una condición adicional que le permite seleccionar uno de dos registros repetidos.

Si una (o ambas) de las entradas duplicadas tiene un significado obviamente incorrecto, entonces debe eliminarse:
Eliminación de código SQL de _Document140_VT1385
donde _Document140_IDRRef = id1 y _LineNo1386 = lineno1
Si las entradas duplicadas tienen los mismos valores en todas las columnas, entonces debe dejar una de ellas:
Código SQL S_elect distinto *
en #tmp1
from_Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

Eliminar de _Document140_VT1385
donde _Document140_IDRRef = id1 y _KeyField = clave1

Insertar en _Document140_VT1385
S_elect #tmp1

Tabla D_rop #tmp1

El procedimiento descrito debe realizarse para cada par de registros duplicados.

2.2.3. Segundo ejemplo:
Código SQL S_elect COUNT(*) AS Expr2, _IDRRef AS Expr1, _Descripción
DE _Referencia8_
GRUPO POR _IDRRef, _Descripción
TENIENDO (CONTAR(*) > 1)

2.3.4 Un ejemplo de determinación de registros no únicos mediante una consulta 1C:Enterprise:
Código 1C v 8.x SELECCIONAR Directorio.Enlace
DESDE Directorio.Directorio AS Directorio
GRUPO POR Directorio.Enlace
TENER CANTIDAD (*) > 1




Arriba