Как исправить ошибку SDBL "Таблица или поле Number не содержится в разделе FROM" и задвоение ссылочных кодов в 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При администрировании и обновлении крупных информационных баз на платформе «1С:Предприятие 8.3» технические специалисты иногда сталкиваются с крайне загадочным поведением системы. База данных может успешно проходить физическую проверку средствами СУБД (например, DBCC CHECKDB в Microsoft SQL Server), однако стандартные механизмы самой 1С начинают вести себя некорректно. Пользователи жалуются на «исчезновение» данных в табличных частях документов, а конфигуратор при попытке тестирования аварийно завершает работу.

В этой статье мы подробно проанализируем одну из самых коварных проблем платформы — задвоение внутренних ссылочных кодов объектов метаданных, которое приводит к ошибкам SDBL и сбоям СУБД на служебных таблицах типа _tmpRCT. Мы разберем причины этой проблемы, методы её точной диагностики и сразу несколько практических способов решения.

Симптомы проблемы: как это выглядит на практике

Рассмотрим классический сценарий проявления ошибки на примере конфигурации «1С:Управление производственным предприятием» (УПП) редакции 1.3:

  1. Сбои в интерфейсе: При открытии документа (например, Отчет производства за смену) в табличной части Технологические операции колонка со ссылкой на технологическую операцию оказывается пустой. При попытке интерактивного выбора значения система выдает критическую ошибку: Ошибка SDBL: Таблица или поле Number не содержится в разделе FROM.
  2. Плавающий характер: Ошибка может проявляться периодически. После перезапуска сеанса или очистки кэша данные могут временно отображаться нормально, но при следующем входе в программу проблема возвращается.
  3. Сбой тестирования и исправления (ТИИ): При попытке выполнить проверку логической и ссылочной целостности база данных «вылетает» с ошибкой СУБД. В логах SQL Server фиксируется нарушение уникальности первичного ключа: Violation of PRIMARY KEY constraint 'PK_tmpRCT_...'. Не удается вставить повторяющийся ключ в служебную таблицу dbo._tmpRCT.
  4. Отказ реструктуризации: При попытке выполнить реструктуризацию таблиц (например, при обновлении или изменении метаданных) процесс прерывается ошибкой обновления конфигурации базы данных.

Давайте выясним глубинную физическую причину происходящего в структуре базы данных.

Выясняем причину: почему двоятся коды таблиц СУБД

Платформа «1С:Предприятие» хранит данные в СУБД в виде физических таблиц, имена которых строятся по внутренним правилам платформы. Для каждого прикладного объекта (справочника, документа, регистра) платформа генерирует уникальный числовой идентификатор — ссылочный код (или код типа объекта). Например, справочник может получить таблицу _Reference275, а документ — _Document275.

В штатной ситуации коды типов для разных видов объектов никогда не пересекаются. Однако из-за известного бага платформы (часто встречающегося на версиях 8.3.12–8.3.15) может произойти рассинхронизация словаря метаданных. Сценарий возникновения выглядит следующим образом:

  1. Администратор создает резервную копию базы данных средствами SQL Server (файл .bak).
  2. Резервная копия восстанавливается на сервере под другим именем (например, для создания тестовой среды).
  3. Критическая ошибка администратора: после восстановления базы данных служба кластера 1С (ragent) или менеджер кластера (rmngr) не перезапускаются. Менеджер кластера продолжает использовать закэшированную схему метаданных и «не понимает», что работает с копией.
  4. Разработчик заходит в Конфигуратор восстановленной базы и добавляет новый объект метаданных (например, новый документ). Платформа выделяет новому объекту первый свободный, по мнению кэша, код (например, 275).
  5. Но в физической базе данных SQL этот код уже занят другим объектом, который был создан в рабочей базе ранее (например, справочником).
  6. В результате в базе данных СУБД создаются две разные таблицы с одинаковым внутренним кодом: например, _Reference275 и _Document275.

До определенного момента база продолжает работать. Но при обновлении конфигурации или изменении режима совместимости движок SDBL (системный слой 1С для работы с базами данных) начинает путаться. Обращаясь к справочнику с кодом 275, он ожидает увидеть структуру справочника, но физически начинает транслировать SQL-запросы к полям документа с тем же кодом. Пытаясь найти поле Number (которое есть у документов, но отсутствует у справочников) в таблице справочника, SDBL генерирует ошибку Таблица или поле Number не содержится в разделе FROM.

Почему падает проверка целостности на таблице _tmpRCT

Таблица _tmpRCT — это временная системная таблица, которую платформа 1С создает в базе данных непосредственно в процессе проведения логического тестирования. Она расшифровывается как "Temporary Referential Integrity Table" и служит для накопления ссылок на проверяемые объекты.

Когда утилита тестирования доходит до проверки ссылок объектов, у которых задублированы внутренние коды, алгоритм ТИИ пытается записать одну и ту же ссылку дважды, предполагая, что это разные сущности. СУБД прерывает эту операцию из-за нарушения ограничения уникальности первичного ключа (PRIMARY KEY constraint). ТИИ аварийно падает, лишая администратора возможности исправить базу встроенными средствами.

Шаг 1. Точная диагностика проблемы

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

  1. Откроем базу данных в режиме Конфигуратор.
  2. Откроем свойства корневого узла конфигурации.
  3. Найдем свойство Режим совместимости и временно изменим его на любое другое значение (например, повысим на один пункт или отключим).
  4. Запустим процесс обновления конфигурации базы данных (клавиша F7).

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


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

Зафиксируем эти имена. В нашем примере конфликтуют план счетов (Acc24) и регистр сведений (InfoRg24), а также документ (Document275) и справочник (Reference275). Вернем режим совместимости в исходное состояние и перейдем к исправлению.


Способы устранения ошибки задвоения кодов

Рассмотрим четыре практических метода исправления структуры базы данных, начиная от самых простых и безопасных.

Способ А. Метод "фиктивного реквизита" (Рекомендуемый)

Этот метод является самым простым, так как он выполняется исключительно средствами Конфигуратора 1С и заставляет платформу самостоятельно перестроить схему метаданных без прямого вмешательства в СУБД.

Разберем алгоритм по шагам:

  1. В окне метаданных Конфигуратора найдем те объекты, которые вызывают конфликт (из нашего лога диагностики — например, документ ТехнологическиеОперации и конфликтующий с ним справочник).
  2. В свойствах каждого из этих объектов добавим новый реквизит. Дадим ему простое имя, например, ФиктивныйРеквизитДляРеструктуризации с типом данных Булево.
  3. Запустим обновление конфигурации базы данных (кнопка F7 или меню "Отладка — Обновить конфигурацию базы данных").
  4. Платформа обнаружит изменение структуры метаданных для этих конкретных таблиц и будет вынуждена произвести их полную физическую реструктуризацию на уровне SQL-сервера. Во время реструктуризации платформа присвоит объектам новые, корректные и гарантированно уникальные внутренние ссылочные коды.
  5. После успешного завершения обновления зайдем в Конфигуратор, удалим созданные фиктивные реквизиты и снова выполним обновление конфигурации (F7).

Важное ограничение: данный метод отлично работает для справочников, документов, регистров и планов видов характеристик. Однако его нельзя применить к перечислениям (Enum), так как им физически невозможно добавить новые реквизиты в конфигураторе.

Способ Б. Обход через механизм Распределенных Информационных Баз (РИБ)

Если среди конфликтующих объектов оказались перечисления или если метод фиктивного реквизита не помог завершить реструктуризацию, применим технологию РИБ. При создании начального образа подчиненного узла платформа генерирует схему данных "с нуля" на целевом сервере, полностью пересчитывая внутренние идентификаторы.

Проанализируем шаги выполнения:

  1. В поврежденной информационной базе создадим новый (или используем существующий) План обмена, в состав которого включены все объекты конфигурации.
  2. Создадим в режиме "1С:Предприятие" узел этого плана обмена.
  3. Вызовем стандартную процедуру создания начального образа для подчиненного узла. Это можно сделать интерактивно или программным скриптом.
  4. Платформа выгрузит данные и сформирует новую чистую базу данных (в формате файловой базы или сразу на сервере СУБД). Схема таблиц в этой базе будет абсолютно чистой и корректной, без каких-либо дубликатов кодов.
  5. Развернем полученный образ на сервере СУБД.
  6. "Отвяжем" новую базу от главного узла РИБ, чтобы сделать её полностью автономной. Для этого запустим базу в режиме конфигуратора с параметром командной строки: /ResetMasterNode или воспользуемся специализированной обработкой по очистке главного узла.

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

Способ В. Удаление и пересоздание пустых объектов

Если один из конфликтующих объектов является вспомогательным, устаревшим или просто не содержит в себе никаких записей (например, созданный программистом новый регистр или неиспользуемый документ):

  1. Убедимся, что объект действительно пуст.
  2. Снимем конфигурацию с поддержки (если она находится на замке) или разрешим изменения для конкретного объекта.
  3. Полностью удалим конфликтующий объект из дерева метаданных Конфигуратора.
  4. Выполним обновление конфигурации базы данных (F7). При этом физическая таблица с некорректным кодом будет удалена из СУБД.
  5. Создадим объект заново вручную или загрузим его чистую копию. Ему автоматически будет сопоставлен новый корректный ссылочный код.

Способ Г. Использование специализированных обработок

Для опытных администраторов баз данных существует путь прямого исправления словаря конфигурации. Внутренняя структура таблиц 1С описана в специальной системной таблице СУБД под названием Params (в файловом варианте — внутри файла 1Cv8.1CD).

Мы можем воспользоваться готовыми обработками с профильных ресурсов (например, Инфостарт, публикация 1126277). Такие утилиты выполняют разбор структуры метаданных конфигурации, находят задвоенные записи в таблицах описания схемы и позволяют безопасно переименовать или переназначить внутренние коды объектов прямо на уровне базы данных SQL, не прибегая к долгой выгрузке данных.


Профилактика проблемы: как не допустить появления дублей в будущем

Чтобы раз и навсегда обезопасить свои базы данных от появления ошибок SDBL и повреждения внутренней структуры метаданных при переносе баз, строго придерживайтесь следующих правил администрирования:

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

← На главную