Contactos

Inserta un valor no único en un índice único. Se intentó insertar un valor no único en un índice único. ¿Qué es un índice?

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_ RRRef, _Fld1394,_F ld1395, _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:
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 del código SQL _Document140_VT1385
establecer _KeyField = keymax + 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 ÚNICA o PRIMARIA CLAVE 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, el tiempo de la CPU también se dedica 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, _Fld2226 1_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 = keymax + 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
Autosuficiente. Período AS,
Autosuficiente. Registrador AS Registrador,
<измерения>,
1 AS Número de registros
DE
Registro Contable AS Autoportante 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
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_ RRRef, _Fld1394,_F ld1395, _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:
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 del código SQL _Document140_VT1385
establecer _KeyField = keymax + 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

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_ RRRef, _Fld1394,_F ld1395, _Fld1396RRef, _Fld1397, _Fld1398, _Fld1399RRef, _Fld22260_TYPE, _Fld22260_RTRef, _Fld22260_RRRef, _Fld22261_TYPE, _Fld22261 _RTRef, _Fld22261_RRRef
Antes de realizar el procedimiento siguiente, 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 = keymax + 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
de _Documento140_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.

Se produce un error si algunos objetos, detalles y subcontos en la base de datos tienen un valor NULL, pero no pueden tener ese valor. Y este error aparece sólo en bases de datos SQL. Aquellos. Si carga dicha base de datos en un archivo, este error ya no aparecerá. Porque La base de datos de archivos tiene sus propias tablas (4 en total) y SQL tiene las suyas propias. Y la base de datos SQL reacciona críticamente a tales valores en sus tablas.

Este problema no se puede resolver mediante ninguna prueba (ni externa ni interna) en ninguna versión de la base de datos (SQL o archivo) e incluso mediante el procedimiento _1sp_DBReindex en el administrador de SQL, que parece reestructurar las tablas en SQL.

Consideremos la solución al problema usando el ejemplo de cambiar de Contabilidad 3.0 PROF a CORP. Luego de la transición, la cuenta 68.01 tiene una nueva subcuenta, Registro ante la Autoridad Tributaria. Y luego, en las bases de datos SQL, no se transferirán todos los documentos creados en la versión PRO que utilicen esta cuenta. Aparecerá el error que se muestra arriba. Porque Esta nueva subcuenta para documentos antiguos, en publicaciones, se escribirá con el valor NULL (aunque debería haber un valor Vacío, o de alguna manera la autoridad fiscal).

Para corregir este error, debe eliminar los valores NULL donde no deberían estar. En este caso, en documentos donde se utilice el Registro de subcuenta ante la Autoridad Tributaria. Esto se puede hacer escribiendo un procesamiento que reemplace NULL con un valor vacío (el procesamiento listo se puede descargar desde este artículo). Hazlo procesando, porque Un intento de cambiar el valor de esta subcuenta manualmente en las contabilizaciones de documentos produce el mismo error.

El procesamiento para reemplazar NULL en todos los subcontactos de Registro ante la Autoridad Tributaria se puede descargar desde este artículo a continuación.

PERO no funcionará reemplazar NULL en la base de datos SQL durante el procesamiento, se generará el mismo error. Por lo tanto necesitas hacer esto:

1. Cargue la versión que ya funciona de la base de datos SQL, traducida a CORP, en el archivo dt (en el configurador Administración – Cargar base de datos – seleccione dónde cargar la base de datos como un archivo *.dt)

2. Cargue el archivo dt en la base de datos de archivos (en una base de datos de archivos limpia, innecesaria o preparada previamente, en el configurador Administración - Cargar base de datos - seleccione el archivo dt cargado previamente)

3. Realice el procesamiento en la base de datos del archivo (no habrá errores allí y todos los NULL se reemplazarán correctamente) (a continuación se describe cómo realizar el procesamiento)

5. Ahora, por el contrario, descargue el archivo dt de la base de datos de archivos y cárguelo en la base de datos SQL. Ahora, al publicar documentos procesados, no se producirán errores.

El procesamiento de este artículo encuentra todos los documentos para el período especificado en los que las publicaciones incluyen el Registro de subcontrato ante la Autoridad Tributaria (que aparece en la versión CORP), que tiene el valor NULL. Y reemplaza este valor con un valor vacío.

En el procesamiento, debe indicar el período por el cual desea procesar los documentos (puede hacerlo durante todo el período en el que se mantienen registros en la base de datos) y hacer clic en “Completar la sección tabular”. Luego puede marcar las casillas para marcar qué documentos procesar (puede seleccionar todos) y hacer clic en el botón "Procesar".

En consecuencia, si alguien tiene el mismo error, pero NO después de cambiar a CORP, sino por ejemplo después de intercambiar, cargar algunos datos, realizar algún procesamiento, etc. Luego, debe identificar dónde se asignó el valor NULL en un documento/directorio específico y eliminar este NULL de manera similar, pero con su propio procesamiento, pero en el orden descrito anteriormente. Recuerde que NULL puede ser, como en las publicaciones de documentos, incl. no solo los contables, sino también en algún lugar en forma de documento/libro de referencia, en algunos detalles, pero en este caso probablemente ni siquiera se abra.

Además, si este error le apareció al publicar un documento, después de transferir la base de datos del archivo Bukh KORP a SQL (y la base de datos originalmente era PROF), significa que los documentos que se crearon en la versión PROF ahora también están en la versión PROF. Registro de subcuenta en la Autoridad Tributaria valor NULL y la base de datos SQL no lo acepta. Y al cargar la base de datos en SQL, aparecerá el siguiente error. Aquí, de hecho, no habrá valores NULL en la base de datos del archivo, pero SQL cargará exactamente esos valores en sus tablas. Por lo tanto, aquí necesitamos forzar a la base de datos SQL a crear estos NULL y luego corregirlos en la base de datos del archivo. Pero no puedo decirle cómo hacerlo.



¿Te gustó el artículo? Compártelo