Ошибка "В процессе обновления информационной базы произошла критическая ошибка"

Опубликовал Xer shi (Xershi) в раздел Администрирование - Тестирование и исправление

При обновлении конфигурации может возникнуть очень неприятная вещь!
В процессе обновления информационной базы произошла критическая ошибка по причине:
Попытка вставки неуникального значения в уникальный индекс: Далее текст самой ошибки.
Эту ошибку устранить довольно легко! А как, читайте дальше...

Предыстория

Нужно нам было создать новый регистр сведений "ЖурналОтслеживанияСообщений". Добавили в конфигурацию, загрузили данные. Затем пошла работа по оптимизации. Пришлось менять структуру регистра. Но не тут-то было!

Реорганизация

Тут все ясно. Записи стали неуникальными, нужно их удалить!

Самой простой способ это:

НоваяЗапись = РегистрыСведений.ЖурналОтслеживанияСообщений.СоздатьНаборЗаписей();
НоваяЗапись.Записать();

Таким методом мы очистим регистр в 1С очень быстро (но это будет и нашей ошибкой). 

Ошибка

Казалось бы, в регистре пусто, и можно обновлять 1С. Не хочу вас удивить, но будет снова ошибка:

Ошибка 1С

Что же представляет ошибка:

В процессе обновления информационной базы произошла критическая ошибка
по причине:
Попытка вставки неуникального значения в уникальный индекс:
Microsoft SQL Server Native Client 11.0: The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo._InfoRgChngR34546NG' and the index name '_InfoR34546_ByNodeMsg_RNTSRRRRRRNG'. The duplicate key value is (0x00000011, 0x80ca00155d03c00d11e54af2ae5400d7, <NULL>, Sep 27 4015 10:22PM, 768404, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=10, native=1505, line=1

Пояснение

Давайте разберемся со структурой SQL. У нас есть регистр "ЖурналОтслеживанияСообщений", он в SQL находится в таблице "_InfoR34546". Проверить это вы можете специальными обработками или методом "тыка" (нам это не придется делать т.к. в тексте ошибки уже указано название таблицы). 

А теперь поясню, что же произошло. Когда мы загрузили данные в регистр, то в SQL они попали в таблицу "_InfoR34546". Когда мы кодом в 1С очистили таблицу, то эти данные удалились из таблицы "_InfoR34546", но они скопировались в таблицу "_InfoRgChngR34546". Это и стало проблемой.

Решение

Для решения возникшей проблемы нам понадобится очистить SQL таблицу "_InfoRgChngR34546".

Расскажу на примере "Microsoft SQL Server Management Studio". Заходим в "Management Studio". Находим нашу базу, открываем вкладку таблиц, кликаем на любую и жмем кнопку "Новый запрос":Новый запрос. Теперь набираем запрос 

truncate table "_InfoRgChngR34546"

У вас может быть и другая таблица! Не забывайте!

И жмем выполнить или клавишу "F5". Вот такой должен быть результат:

Успех

Все, теперь можно спокойно обновлять 1С, и ошибки не будет!

См. также

Добавить вознаграждение
Комментарии
1. Dpotapov (Danil.Potapov) 27.10.15 17:11 Сейчас в теме
злодей. а что мешало при очистке не регистрировать на обмен или очистить штатными средствами.
2. Xer shi (Xershi) 183 27.10.15 17:24 Сейчас в теме
(1) Dpotapov, купился на слова: //Способ 1 - быстрый и легкий. http://1cprofi.com/content/view/15/15
3. Dpotapov (Danil.Potapov) 27.10.15 19:32 Сейчас в теме
(2) Xershi, перед записью можно отключить регистрацию изменений на обмен. удаление изменений из таблицы можно выполнить тоже штатными средствами. Не понятно другое, если уже полез на уровень СУБД, то и записи из регистра тогда грохнул бы таким же способом, а то половина средствами платформы, вторая половина средствами СУБД (со всеми вытекающими последствиями для бизнес-логики).
4. Xer shi (Xershi) 183 28.10.15 08:55 Сейчас в теме
(3) Dpotapov, да вы правы. Добавил на автомате регистр в тестовую базу, а он автоматом прописался в план-обмена удаленной копии. Т.к. я об этом не подозревал на этот момент, поэтому полез в SQL и там очистил таблицу.
Теперь конечно понятно, что таблица "_InfoRgChngR34546" ничто иное как регистрация регистра для обмена и почистить эту таблицу можно через обработку "Регистрация изменений для обмена".
Но повторюсь на тот момент это последнее, что пришло бы в голову!
5. Игорь (IgorS) 42 28.10.15 12:26 Сейчас в теме
По рукам бить программиста, который после каждой ошибки лезет "что-нибудь подправить" в СУБД.
6. Xer shi (Xershi) 183 28.10.15 13:29 Сейчас в теме
(5) IgorS, ну не скажи. Вот если бы у тебя не было под рукой обработки "Регистрация изменений для обмена". То это решение как раз, то что нужно!
Тем более, если мы понимаем, что делаем!