При выполнении обновления конфигурации базы данных в системе 1С:Предприятие 8.3 пользователи и администраторы иногда сталкиваются с критической ошибкой: «Ссылочная константа содержит недопустимый ссылочный номер таблицы». Особенность этой проблемы заключается в том, что стандартные средства проверки, такие как chdbfl.exe или «Тестирование и исправление», часто не находят повреждений в структуре данных. Давайте разберем причины возникновения этого сбоя и рассмотрим пошаговые методы его устранения.
Цифровой код, который мы видим в тексте ошибки (например, 42592), является внутренним идентификатором объекта метаданных в структуре базы данных 1С. Вторая часть кода, состоящая из нулей, указывает на то, что ссылка ведет в «никуда» — на объект, который отсутствует в текущем дереве конфигурации или таблицах SQL. Проанализируем ситуацию: если первые цифры номера меняются при каждой попытке обновления, это сигнализирует о проблемах в динамически создаваемых объектах, расширениях или временных таблицах метаданных.
Первым делом нам необходимо понять, к какому именно объекту (справочнику, документу или регистру) относится указанный номер. Рассмотрим, как это сделать программно. Воспользуемся методом ПолучитьСтруктуруХраненияБазыДанных(). Создадим внешнюю обработку и выполним следующий код:
СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого СтрокаТаблицы Из СтруктураБазы Цикл
Если Найти(СтрокаТаблицы.ИмяТаблицыХранения, "42592") > 0 Тогда
Сообщить("Найден объект: " + СтрокаТаблицы.ИмяТаблицы);
Сообщить("Метаданные: " + СтрокаТаблицы.Метаданные);
КонецЕсли;
КонецЦикла;
Проанализируем результат. Если поиск по точному номеру не дал результатов, попробуем выгрузить всю структуру в таблицу значений и сохранить её в файл для детального анализа. Это поможет нам сопоставить идентификаторы из сообщения об ошибке с реальными именами таблиц в СУБД.
Как показывает практика, часто виновниками подобных ошибок становятся расширения. В расширениях могут храниться ссылки на объекты, которые были удалены или изменены в основной конфигурации. Разберем алгоритм действий по шагам:
.cfe). Это критически важно, так как простое отключение не всегда очищает кэшированные записи метаданных в системных таблицах базы.Рассмотрим ситуацию, когда ошибка связана с предопределенными элементами. Если в конфигурации существуют ссылки на предопределенные данные, идентификаторы которых рассинхронизированы, система выдаст ошибку ссылочной константы. Для решения воспользуемся встроенными механизмами Библиотеки стандартных подсистем (БСП) или выполним код:
Для Каждого Справочник Из Метаданные.Справочники Цикл
УстановитьОбновлениеПредопределенныхДанных(Справочник, ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
КонецЦикла;
Затем запустим процедуру обновления предопределенных данных через стандартную обработку или программно вызовем Справочники.ИмяСправочника.ВыполнитьОбновлениеПредопределенныхДанных() для тех объектов, которые мы идентифицировали в первом методе.
Если база данных работает в клиент-серверном варианте, проблема может крыться в «зависших» записях в таблицах Config или ConfigSave. Разберем последовательность действий для системного администратора:
snccntx в каталоге регистрации кластера).DBSchema. Однако более безопасным методом будет полная выгрузка базы в формат .dt и загрузка в новую чистую базу. Это принудительно пересоздает все индексы и структуру таблиц «с нуля».Иногда логические связи в дереве метаданных нарушаются так сильно, что обычное сравнение-объединение не справляется. Рассмотрим метод полной перезаписи конфигурации:
Выполним выгрузку конфигурации в файл (Конфигурация -> Выгрузить конфигурацию в файл...). После этого воспользуемся пунктом «Загрузить конфигурацию из файла». Помните, что эта операция замещает текущую конфигурацию основной конфигурацией из файла. Это заставляет платформу полностью пересчитать все внутренние идентификаторы и соответствия таблиц. Проанализируем результат после нажатия F7 — во многих случаях это снимает проблему «фантомных» ссылочных номеров.
Выясним, не зарегистрированы ли изменения для удаленных объектов в планах обмена. Если в таблицах регистрации изменений (обычно они начинаются с _ChangeRec) остались записи с битыми ссылками на метаданные, это может блокировать обновление. Проанализируем узлы обмена и очистим регистрацию изменений для всех подозрительных объектов с помощью типовой обработки «Регистрация изменений для обмена». Это исключит влияние старых ссылок на процесс реструктуризации базы.
Резюмируем: решение ошибки «Ссылочная константа содержит недопустимый ссылочный номер таблицы» требует комплексного подхода — от программного поиска идентификатора через ПолучитьСтруктуруХраненияБазыДанных до радикальной пересборки базы через выгрузку/загрузку .dt. Всегда начинайте с отключения расширений, так как в современных конфигурациях на базе БП 3.0 это является наиболее вероятной причиной сбоя.