Каталог решений - Ошибка в 1С: Не удается вставить повторяющуюся строку ключа в объект

Ошибка в 1С: Не удается вставить повторяющуюся строку ключа в объект

Ошибка в 1С: Не удается вставить повторяющуюся строку ключа в объект

В наличии

В 1С может появиться ошибка такого рода: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Попытка вставки неуникального значения в уникальный индекс:
Microsoft SQL Server Native Client 11.0: Не удается вставить повторяющуюся строку ключа в объект «dbo._AccRgAT118760» с уникальным индексом «_AccR118760_ByPeriod_TRRRRN». Повторяющееся значение ключа: (ноя 1 5999 12:00AM, 0xab52f3e52b35efa847b0cfef9c90ff9d, 0x95eb00112f2a1abf11dac09f12116a47, NULL, NULL, NULL, NULL, 0).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1
Техническая информация:
Ошибка при чтении изменений при обмене РИБ: {ОбщийМодуль.ПроцедурыОбменаДанными.Модуль(1559)}: Ошибка при вызове метода контекста (ПрочитатьИзменения): Попытка вставки неуникального значения в уникальный индекс:

Для ее решения делаем следующее:

Категория:

Описание

1. Переходим на сервер SQL и запускаем SQL Server Management Studio

2. Находим сбойную базу в списке баз.

3. Нажимаем ПКМ и выбираем «Создать запрос»

4. В окне запроса пишем код для поиска данных в таблице:

SELECT * FROM [название_таблицы]
WHERE [название_столбца_1] = [что_ищем_1] and [название_столбца_2] = [что_ищем_2] and … [название_столбца_N] = [что_ищем_N]

Пример:

SELECT * FROM _AccRgAT118760
WHERE _AccountRRef = 0xab52f3e52b35efa847b0cfef9c90ff9d and _Fld18737RRef = 0x95eb00112f2a1abf11dac09f12116a47
  • _AccRgAT118760 – название таблице в котором произошел сбой. Оно отображается в окне ошибки в 1С.
  • _AccountRRef – название столбца_1 где будем искать.
  • 0xab52f3e52b35efa847b0cfef9c90ff9d – значение_1 которое будем искать. Оно отображается в окне ошибки в 1С.
  • _Fld18737RRef – название столбца_2 где будем искать.
  • 0x95eb00112f2a1abf11dac09f12116a47 – значение_2 которое будем искать. Оно отображается в окне ошибки в 1С.

Название столбцов можно посмотреть следующем образом:

— Развернуть базу, нажав плюсик напротив базы

— Развернуть папку «Таблицы», нажав на плюсик напротив этой папки

— Найти в списке нашу таблицу

— Нажать ПКМ на таблицу и выбрать пункт «Выбрать первые 1000 строк»

— Появится окно с запросом и ниже окно с данными

Пример запроса:

/****** Скрипт для команды SelectTopNRows из среды SSMS  ******/
SELECT TOP 1000 [_Period]
      ,[_AccountRRef]
      ,[_Fld18737RRef]
      ,[_Fld18738RRef]
      ,[_Value1_TYPE]
      ,[_Value1_RTRef]
      ,[_Value1_RRRef]
      ,[_Fld18739]
      ,[_TurnoverDt18751]
      ,[_TurnoverCt18752]
      ,[_Turnover18753]
      ,[_Fld18740]
      ,[_TurnoverDt18754]
      ,[_TurnoverCt18755]
      ,[_Turnover18756]
      ,[_Fld18741]
      ,[_TurnoverDt18757]
      ,[_TurnoverCt18758]
      ,[_Turnover18759]
      ,[_Splitter]
  FROM [rzdp_cb].[dbo].[_AccRgAT118760]

— В запросе мы увидим название всех столбцов присутствующих в таблице. Эти названия мы можем скопировать для своего запроса.

  1. После того как мы написали код запроса, нажимаем кнопку «Выполнить» или F5 на клавиатуре.
  2. Наш код выполнится и выдаст в окне ниже значения таблицы.
  3. В это таблице мы ищем строку которая подходит по параметрам написанным в сообщении об ошибке (Пример: ноя  1 5999 12:00AM, 0xab52f3e52b35efa847b0cfef9c90ff9d, 0x95eb00112f2a1abf11dac09f12116a47, <NULL>, <NULL>, <NULL>, <NULL>, 0)
  4. Первое, на что надо обратить внимание, это на дату и искать с начало по ней. Найдя совпадения по дате, смотрим другие столбцы, они должны содержать значение NULL, а также, возможно, какую-нибудь сумму (в окне ошибки в 1С суммы не показываются)
  5. Нажимаем ПКМ на сбойную базу и выбираем «Создать запрос»
  6. В окне запроса пишем код удаления объекта:
USE [название_базы]
GO
DELETE FROM [название_таблицы]
WHERE [название_столбца_1] = [значение_поиска_1] and [название_столбца_2] = [значение_поиска_2] and [название_столбца_3] = [значение_поиска_3] and … [название_столбца_N] = [значение_поиска_N]
GO

Пример:

USE test_stand_2_cb
GO
DELETE FROM _AccRgAT118760
WHERE _AccountRRef = 0xab52f3e52b35efa847b0cfef9c90ff9d and _Fld18737RRef = 0x95eb00112f2a1abf11dac09f12116a47 and _Fld18739 = -1500.00
GO

test_stand_2_cb – название нашей сбойной базы

_AccRgAT118760 – таблица, в которой будем производить удаление объекта

_AccountRRef – столбец_1, в котором будем искать параметр для удаления

0xab52f3e52b35efa847b0cfef9c90ff9d – значение_1, которое должно стоять в столбце_1

_Fld18737RRef – столбец_2, в котором будем искать параметр для удаления

0x95eb00112f2a1abf11dac09f12116a47 – значение_2, которое должно стоять в столбце_2

_Fld18739 – столбец_3, в котором будем искать параметр для удаления

-1500.00 – сумма, которая должна стоять в столбце_3. Так как первое и второе значение будет содержаться во многих строках в таблице, нам нужно будет третье уникальное значение, по которому будет происходить поиск для удаления. Сумма нам может в этом помочь, т.к. значение суммы может совпадать с суммой сбойного документа.

  1. После написания запрос на удаления значения из таблицы нажимаем кнопку «Выполнить» или F5 на клавиатуре.
  2. После выполнения процедуры в SQL мы можем произвести нужные нами манипуляции со сбойным документом, которые ранее выдавали нам ошибку.
  3. Так же крайне желательно произвести пересчет итогов и проверить обороты.
has been added to your cart:
Оформление заказа