1С. Ошибка «Для одного ссылочного кода существует более одной таблицы в базе данных»

У одного из клиентов во время обновления конфигурации базы данных возникла ошибка «Для одного ссылочного кода существует более одной таблицы в базе данных».

В процессе обновления информационной базы произошла критическая ошибка
по причине:
Ошибка SDBL:
Ошибка обновления конфигурации базы данных. Для одного ссылочного кода существует более одной таблицы в базе данных.

Имена таблиц с кодом 26630: DocumentChngR26630, InfoRg26630
Имена таблиц с кодом 26634: Const26634, InfoRgChngR26634
Для исправления проблемы вы можете обратиться в службу технической поддержки.

Данная ошибка не так давно обсуждалась на партнерской конференции Задвоение номеров таблиц на SQL-сервере при добавлении в конфигурацию новых объектов.

Кроме того данная ошибка уже исправлена версиях платформы 8.3.12.1924, 8.3.13.1865, 8.3.14.1694, 8.3.15.1489.

Как возникает проблема и как ее избежать

Воспроизведение достаточно простое:

  1. Делаем резервную копию ИБ средствами СУБД;
  2. Добавляем в ИБ объект конфигурации. В СУБД будет добавлена таблица с типом объекта и ссылочным кодом. Например _DocumentChngR26630;
  3. Восстанавливаем ИБ средствами СУБД из резервной копии созданной в пункте 1;
  4. Добавляем в ИБ объект конфигурации отличный от добавленного в пункте 2. В СУБД будет добавлена таблица с типом объекта и дублирующимся ссылочным кодом. Например _InfoRg26630;

Как результат дальнейшее обновление конфигурации базы данных прерывается с указанной ошибкой.

Данный сценарий вполне можно получить при работе в тестовом контуре, выполняя обновлениие тестовой ИБ данными резервной копии продуктивной ИБ.

Для избежания данной проблемы необходимо выполнить перезапуск сервера 1С:Предприятия сразу после восстановления ИБ из резервной копии средствами СУБД, или работать на версиях платформы начиная с 8.3.12.1924, 8.3.13.1865, 8.3.14.1694, 8.3.15.1489.

Но если счастье уже наступило ошибка уже имеется в наличии, то исправлять придется самостоятельно.

Как устранить проблему

Казалось бы, необходимо только восстановить порядок в ссылочных кодах. Первым на ум приходит вариант с выполнением реструктуризации таблиц информационной базы из меню Тестирование и исправление, но оно не помогает.

Определение проблемных объектов

Для этого воспользуемся методом ПолучитьСтруктуруХраненияБазыДанных(), точнее напишем небольшой кусочек кода:

СтруктураХраненияБазыДанных = ПолучитьСтруктуруХраненияБазыДанных();

Для Каждого ЭлементСтруктуры Из СтруктураХраненияБазыДанных Цикл 
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = СтрШаблон("ИмяТаблицыХранения: %1, Метаданные: %2", ЭлементСтруктуры.ИмяТаблицыХранения, ЭлементСтруктуры.Метаданные);
    Сообщение.Сообщить();
КонецЦикла;

В полученном тексте найдем записи с указанными таблицами в сообщении об ошибке

ИмяТаблицыХранения: DocumentChngR26630, Метаданные: Документ.CRM_ШаблонЭтапаКалендарногоПлана
ИмяТаблицыХранения: InfoRg26630, Метаданные: РегистрСведений.СостоянияБлокировкиВычетаНДСПоСчетамФактурам
ИмяТаблицыХранения: Const26634, Метаданные: Константа.CRM_ПарольПользователяСинхронизацииiCRM
ИмяТаблицыХранения: InfoRgChngR26634, Метаданные: РегистрСведений.СостоянияБлокировкиВычетаНДСПоСчетамФактурам

Из полученного видно, что РегистрСведений.СостоянияБлокировкиВычетаНДСПоСчетамФактурам конфликтует с Константа.CRM_ПарольПользователяСинхронизацииiCRM и Документ.CRM_ШаблонЭтапаКалендарногоПлана.

Определение жертвы

Теперь необходимо исходя из наполнения ИБ и важности объектов решить какой из них удалить. В разбираемом примере РегистрСведений.СостоянияБлокировкиВычетаНДСПоСчетамФактурам оказался пуст, его и будем удалять.

Если объект содержит данные, тогда необходимо обеспечить возможность возвращения данных в исходное состояние. Например обработкой из инструментов разработчика ВыгрузкаЗагрузкаДанныхXML выполнить выгрузку данных в файл.

Удаление метаданного

Если метаданное стоит на поставке, тогда необходимо снять его с поставки. Для этого перейдем в меню Конфигурация — Поддержка — Настройка поддержки, в дереве матаданных найти необходимый объект и установить правило поддержки Объект снят с поддержки и установить признак Установить для подчиненных.

Для одного ссылочного кода существует более одной таблицы в базе данных

Теперь необходимо выполнить попытку удаление. Если на объект есть ссылки, то выведется сообщение об нерешенных зависимостях: “Объект не может быть удален, так как на него имеются ссылки в других объектах”.

Объект "РегистрСведений.СостоянияБлокировкиВычетаНДСПоСчетамФактурам" использован в:
ПодпискаНаСобытие.ПолныйРегистрацияНабора.Источник
ПодпискаНаСобытие.ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписей.Источник
ПодпискаНаСобытие.СОтборамиРегистрацияНабора.Источник
ОпределяемыйТип.ВладелецЗначенийКлючейДоступаНаборЗаписей.Тип
Документ.БлокировкаВычетаНДС.

Заходим в каждый из них, убираем ссылки, после удаляем сам объект.

Теперь, если все выполнено правильно, обновление конфигурации базы данных пройдет без проблем.

Реструктуризация таблиц информационной базы

Но это еще не конец. Если сейчас вернуть конфигурацию к начальному ее состоянию, то ошибка повторится. Для избежания повторения необходимо выполнить рекструктуризацию таблиц информационной базы.

Для этого необходимо перейти в меню Тестирование и исправление, и выполнить реструктуризацию таблиц информационной базы.

Для одного ссылочного кода существует более одной таблицы в базе данных

Восстановление метаданного и данных

Теперь настала пора вернуть конфигурацию к ее начальному состоянию.  Удаленный объект, и ссылки на него в других объектах возвращаются путем сравнения и объединения с сохраненной ранее конфигурацией или конфигурацией поставщика .

Если в удаляемом объекте были данные, тогда необходимо выполнить их восстановление, например обработкой из инструментов разработчика ВыгрузкаЗагрузкаДанныхXML.

Собственно все! Таким нехитрым способом устранили ошибку «Для одного ссылочного кода существует более одной таблицы в базе данных».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *