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.

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

Когда конфликтующие метаданные одинаковы

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

Данная ошибка может возникнуть даже при разворачивании пустой ИБ из шаблона поставки ЗУП 2.5 или УПП.

Комментарии 4

  • Денис 23.01.2020 в 13:13 Cсылка

    Cпасибо, полезная информация
    у меня правда дублируются как-то странно сами с собой

    Имена таблиц с кодом 2: CKinds2, CKindsDN959
    Имена таблиц с кодом 5: CKinds5, CKindsDN994

    ИмяТаблицыХранения: CKinds2, Метаданные: ПланВидовРасчета.ОсновныеНачисленияОрганизаций
    ИмяТаблицыХранения: CKindsDN959, Метаданные: ПланВидовРасчета.ОсновныеНачисленияОрганизаций

    ИмяТаблицыХранения: CKinds5, Метаданные: ПланВидовРасчета.УправленческиеНачисления
    ИмяТаблицыХранения: CKindsDN994, Метаданные: ПланВидовРасчета.УправленческиеНачисления

    • Guesto 23.01.2020 в 22:41 Cсылка

      Денис, и правда странно. В итоге получилось победить?

    • Вадим 05.02.2020 в 11:00 Cсылка

      Денис, если удалось победить, поделистесь пожалуйста решением! Спасибо!
      Подобная ситуация, в ЗУП 2.5 Корп, платформа 8.3.15.1830 :
      Имена таблиц с кодом 2: CKinds2, CKindsDN415
      Имена таблиц с кодом 5: CKinds5, CKindsDN447

      • Guesto 11.02.2020 в 17:06 Cсылка

        Вадим, столкнулись с подобной проблемой. Ошибка характерна для планов видов расчета. Для исправления необходимо в проблемный план видов расчета добавить любой реквизит и обновить конфигурацию ИБ, произойдет реструктуризация, после чего проблема исчезнет. После исправления не забываем удалить реквизит, если он не нужен.

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

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