При администрировании и обновлении крупных информационных баз на платформе «1С:Предприятие 8.3» технические специалисты иногда сталкиваются с крайне загадочным поведением системы. База данных может успешно проходить физическую проверку средствами СУБД (например, DBCC CHECKDB в Microsoft SQL Server), однако стандартные механизмы самой 1С начинают вести себя некорректно. Пользователи жалуются на «исчезновение» данных в табличных частях документов, а конфигуратор при попытке тестирования аварийно завершает работу.
В этой статье мы подробно проанализируем одну из самых коварных проблем платформы — задвоение внутренних ссылочных кодов объектов метаданных, которое приводит к ошибкам SDBL и сбоям СУБД на служебных таблицах типа _tmpRCT. Мы разберем причины этой проблемы, методы её точной диагностики и сразу несколько практических способов решения.
Рассмотрим классический сценарий проявления ошибки на примере конфигурации «1С:Управление производственным предприятием» (УПП) редакции 1.3:
Отчет производства за смену) в табличной части Технологические операции колонка со ссылкой на технологическую операцию оказывается пустой. При попытке интерактивного выбора значения система выдает критическую ошибку: Ошибка SDBL: Таблица или поле Number не содержится в разделе FROM.Violation of PRIMARY KEY constraint 'PK_tmpRCT_...'. Не удается вставить повторяющийся ключ в служебную таблицу dbo._tmpRCT.Давайте выясним глубинную физическую причину происходящего в структуре базы данных.
Платформа «1С:Предприятие» хранит данные в СУБД в виде физических таблиц, имена которых строятся по внутренним правилам платформы. Для каждого прикладного объекта (справочника, документа, регистра) платформа генерирует уникальный числовой идентификатор — ссылочный код (или код типа объекта). Например, справочник может получить таблицу _Reference275, а документ — _Document275.
В штатной ситуации коды типов для разных видов объектов никогда не пересекаются. Однако из-за известного бага платформы (часто встречающегося на версиях 8.3.12–8.3.15) может произойти рассинхронизация словаря метаданных. Сценарий возникновения выглядит следующим образом:
.bak).ragent) или менеджер кластера (rmngr) не перезапускаются. Менеджер кластера продолжает использовать закэшированную схему метаданных и «не понимает», что работает с копией.275)._Reference275 и _Document275.До определенного момента база продолжает работать. Но при обновлении конфигурации или изменении режима совместимости движок SDBL (системный слой 1С для работы с базами данных) начинает путаться. Обращаясь к справочнику с кодом 275, он ожидает увидеть структуру справочника, но физически начинает транслировать SQL-запросы к полям документа с тем же кодом. Пытаясь найти поле Number (которое есть у документов, но отсутствует у справочников) в таблице справочника, SDBL генерирует ошибку Таблица или поле Number не содержится в разделе FROM.
_tmpRCTТаблица _tmpRCT — это временная системная таблица, которую платформа 1С создает в базе данных непосредственно в процессе проведения логического тестирования. Она расшифровывается как "Temporary Referential Integrity Table" и служит для накопления ссылок на проверяемые объекты.
Когда утилита тестирования доходит до проверки ссылок объектов, у которых задублированы внутренние коды, алгоритм ТИИ пытается записать одну и ту же ссылку дважды, предполагая, что это разные сущности. СУБД прерывает эту операцию из-за нарушения ограничения уникальности первичного ключа (PRIMARY KEY constraint). ТИИ аварийно падает, лишая администратора возможности исправить базу встроенными средствами.
Для того чтобы локализовать проблему и получить точный список конфликтующих объектов, выполним диагностику:
F7).Платформа запустит полную перепроверку схемы данных и гарантированно выдаст подробный лог ошибки, который укажет на конкретные конфликтующие таблицы. Нам отобразится примерно такое сообщение:
В процессе обновления информационной базы произошла критическая ошибка.
Ошибка SDBL: Ошибка обновления конфигурации базы данных.
Для одного ссылочного кода существует более одной таблицы в базе данных.
Имена таблиц с кодом 24: Acc24, InfoRg24
Имена таблиц с кодом 275: Document275, Reference275
Зафиксируем эти имена. В нашем примере конфликтуют план счетов (Acc24) и регистр сведений (InfoRg24), а также документ (Document275) и справочник (Reference275). Вернем режим совместимости в исходное состояние и перейдем к исправлению.
Рассмотрим четыре практических метода исправления структуры базы данных, начиная от самых простых и безопасных.
Этот метод является самым простым, так как он выполняется исключительно средствами Конфигуратора 1С и заставляет платформу самостоятельно перестроить схему метаданных без прямого вмешательства в СУБД.
Разберем алгоритм по шагам:
ТехнологическиеОперации и конфликтующий с ним справочник).ФиктивныйРеквизитДляРеструктуризации с типом данных Булево.F7 или меню "Отладка — Обновить конфигурацию базы данных").F7).Важное ограничение: данный метод отлично работает для справочников, документов, регистров и планов видов характеристик. Однако его нельзя применить к перечислениям (Enum), так как им физически невозможно добавить новые реквизиты в конфигураторе.
Если среди конфликтующих объектов оказались перечисления или если метод фиктивного реквизита не помог завершить реструктуризацию, применим технологию РИБ. При создании начального образа подчиненного узла платформа генерирует схему данных "с нуля" на целевом сервере, полностью пересчитывая внутренние идентификаторы.
Проанализируем шаги выполнения:
План обмена, в состав которого включены все объекты конфигурации./ResetMasterNode или воспользуемся специализированной обработкой по очистке главного узла.Теперь мы получили полностью рабочую базу данных с сохраненными данными, в которой больше нет конфликтов SDBL.
Если один из конфликтующих объектов является вспомогательным, устаревшим или просто не содержит в себе никаких записей (например, созданный программистом новый регистр или неиспользуемый документ):
F7). При этом физическая таблица с некорректным кодом будет удалена из СУБД.Для опытных администраторов баз данных существует путь прямого исправления словаря конфигурации. Внутренняя структура таблиц 1С описана в специальной системной таблице СУБД под названием Params (в файловом варианте — внутри файла 1Cv8.1CD).
Мы можем воспользоваться готовыми обработками с профильных ресурсов (например, Инфостарт, публикация 1126277). Такие утилиты выполняют разбор структуры метаданных конфигурации, находят задвоенные записи в таблицах описания схемы и позволяют безопасно переименовать или переназначить внутренние коды объектов прямо на уровне базы данных SQL, не прибегая к долгой выгрузке данных.
Чтобы раз и навсегда обезопасить свои базы данных от появления ошибок SDBL и повреждения внутренней структуры метаданных при переносе баз, строго придерживайтесь следующих правил администрирования:
1С:Предприятие (процесс ragent) или как минимум перезапускайте рабочий процесс менеджера кластера rmngr. Это принудительно очистит кэш метаданных сервера 1С и предотвратит генерацию повторяющихся кодов при изменении конфигурации.Мы детально разобрали сложный случай системного сбоя платформы 1С. Применяя описанные методики диагностики и исправления, вы сможете успешно восстановить работоспособность базы данных и обеспечить её стабильную эксплуатацию в будущем.