При обновлении конфигураций 1С, особенно таких динамично развивающихся как Розница 2.2 или Управление торговлей 11, программисты иногда сталкиваются с пугающим сообщением: «Ссылочная константа содержит недопустимый ссылочный номер таблицы». Данная ошибка прерывает процесс обновления на этапе реструктуризации базы данных и делает невозможным дальнейшую работу в Конфигураторе. Стандартные методы, такие как «Тестирование и исправление» (ТИИ), часто оказываются бессильны. В этой статье мы подробно разберем природу этого сбоя и рассмотрим пошаговые алгоритмы его устранения.
Для начала проанализируем ситуацию: что именно платформа 1С подразумевает под термином «ссылочная константа»? Важно понимать, что в данном контексте это не объект метаданных из ветки «Константы» в дереве конфигурации. Речь идет о внутреннем механизме платформы — так называемых литералах (Literals).
Эти константы используются во внутренних скомпилированных запросах, механизмах RLS (ограничение доступа на уровне записей), настройках динамических списков или схемах компоновки данных (СКД). Ошибка возникает, когда во внутреннем коде или настройках зашита жесткая ссылка на таблицу (по ее внутреннему идентификатору TableID), которой в текущей структуре базы данных больше не существует или номер которой изменился в результате некорректной реструктуризации.
Проанализируем основные факторы, провоцирующие этот сбой:
8.3.12.DBSchema, где хранятся соответствия имен объектов 1С и физических таблиц СУБД.Как показывает опыт многих специалистов, самым быстрым и эффективным решением является переход на более свежий релиз платформы 1С:Предприятие. В частности, переход с версии 8.3.12.1469 на релизы ветки 8.3.13 (например, 8.3.13.1644) и выше полностью устраняет проблему.
Это связано с тем, что в более поздних версиях разработчики 1С существенно переработали механизм реструктуризации и исправили баги, связанные с «призрачными» ссылками в кэше метаданных. Если вы столкнулись с этой ошибкой, в первую очередь выполните следующие действия:
8.3.22 или 8.3.23, если конфигурация это позволяет).Если обновление платформы по каким-то причинам невозможно или не помогло, проанализируем влияние расширений. Расширения в 1С 8.3 активно вмешиваются в структуру данных, и при реструктуризации основной базы платформа должна корректно сопоставить все зависимости.
Рассмотрим алгоритм действий для исключения влияния расширений:
F7).Важно: Часто именно удаление расширений перед «тяжелым» обновлением (например, при переходе между крупными релизами Розницы) позволяет платформе корректно перестроить индексы и таблицы без возникновения конфликтов ссылочных номеров.
В ситуациях, когда ошибка носит затяжной характер и «зависает» в самой базе, необходимо прибегнуть к низкоуровневым операциям на уровне СУБД. Проанализируем, какие действия помогут восстановить целостность структуры.
Во-первых, стоит попробовать очистить таблицу ConfigSave. В ней хранятся промежуточные состояния конфигурации при обновлении. Если процесс прервался ошибкой, там могут остаться некорректные записи.
-- Пример запроса для MS SQL Server
DELETE FROM ConfigSave
Во-вторых, рекомендуется выполнить проверку логической целостности самой базы данных SQL. Ошибка «недопустимый номер таблицы» может быть следствием повреждения системных таблиц СУБД.
-- Проверка базы данных на ошибки
DBCC CHECKDB ('Имя_Вашей_Базы') WITH NO_INFOMSGS, ALL_ERRORMSGS
В-третьих, если ошибка указывает на конкретные номера таблиц, которые меняются при каждом запуске, это верный признак проблем в DBSchema. В этом случае помогает полная выгрузка базы в формат .dt и загрузка в новую чистую базу. При загрузке из .dt платформа полностью пересоздает физическую структуру таблиц «с нуля», что устраняет любые накопленные ошибки в идентификаторах.
Иногда ссылочная константа ссылается на тип данных предопределенного элемента, который был изменен в метаданных, но не обновился в данных информационной базы. В таких случаях полезно принудительно запустить механизм обновления предопределенных данных.
Создадим простую внешнюю обработку и выполним в ней следующий код:
Процедура ОбновитьДанные()
// Выполняем обновление предопределенных данных для всей базы
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.Авто);
// Если используете БСП, можно вызвать стандартную процедуру
// Справочники.ИмяСправочника.ОбновитьПредопределенныеДанные();
Сообщить("Обновление предопределенных данных инициировано успешно");
КонецПроцедуры
После выполнения этого кода попробуйте снова запустить реструктуризацию в Конфигураторе.
Если вы используете файловый вариант базы данных, обязательно выполните утилиту chdbfl.exe (находится в папке bin установленной платформы). Она проверяет физическую целостность файла 1Cv8.1CD и часто находит несоответствия в таблицах метаданных, которые не видны при обычном ТИИ.
Рассмотрим также ситуацию с кэшем пользователя. Бывают случаи, когда «мусор» в локальном кэше мешает корректному отображению структуры базы в Конфигураторе. Удалите базу из списка и добавьте её заново — это очистит временные файлы на стороне клиента.
Подведем итог: Ошибка «Ссылочная константа содержит недопустимый ссылочный номер таблицы» — это в 90% случаев баг конкретной версии платформы или результат конфликта расширений с механизмом реструктуризации. Основным и самым надежным способом лечения является обновление платформы до актуального релиза (8.3.13 и выше). Если это не помогает, используйте метод «Выгрузка в .dt — Загрузка в новую базу» для полной пересборки индексов и идентификаторов таблиц.