Как исправить ошибку SDBL: В схеме базы данных нет таблицы с именем DataHistorySettingsExt или RefSInf?

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

При переходе на новые версии платформы 1С:Предприятие (особенно при обновлении с версий ниже 8.3.21 на 8.3.24 и выше) мы часто сталкиваемся с неприятными ошибками уровня SDBL (Schema Data Base Layer). Это ошибки рассогласования между тем, как платформа "видит" структуру метаданных в конфигурации, и тем, какие таблицы реально существуют в базе данных (SQL или файловой).

В этой статье мы подробно разберем две распространенные ошибки, обсуждаемые в сообществе:

  1. Ошибка "В схеме базы данных нет таблицы с именем DataHistorySettingsExt".
  2. Ошибка "В схеме базы данных нет таблицы с именем RefSInf..." (например, RefSInf19574).

Проанализируем причины их возникновения и рассмотрим пошаговые методы устранения.

Природа ошибки DataHistorySettingsExt

Таблица DataHistorySettingsExt отвечает за хранение настроек механизма "История данных" для объектов, добавленных или заимствованных в расширениях конфигурации. Проблема чаще всего возникает, когда расширение было создано или работало на старой версии платформы (например, 8.3.20 или ниже), а затем база была переведена на новую платформу (8.3.22, 8.3.23, 8.3.24) без корректной конвертации структуры хранения настроек истории.

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

Решение 1: Манипуляция с режимом совместимости расширения

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

Выполним следующие шаги:

  1. Откроем конфигуратор.
  2. Перейдем в список расширений (Конфигурация -> Расширения конфигурации).
  3. Откроем свойства проблемного расширения.
  4. Изменим параметр Режим совместимости на версию 8.3.20 (или ту, на которой расширение гарантированно работало ранее).
  5. Сохраним расширение.
  6. Попробуем запустить режим "1С:Предприятие" и проверить наличие ошибки.

Если ошибка ушла, можно попробовать постепенно повышать режим совместимости обратно, контролируя поведение системы.

Решение 2: Принудительная инициализация Истории данных

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

Проделаем следующие действия:

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

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

Решение 3: Создание расширения "с нуля"

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

Действуем так:

  1. Создадим новое пустое расширение в текущей версии платформы.
  2. В старом расширении выделим нужные модули и скопируем их текст.
  3. Не копируйте объекты метаданных целиком (Ctrl+C / Ctrl+V на самом справочнике), так как это может перенести ошибочные идентификаторы (GUID). Создайте справочники и документы в новом расширении вручную, добавив реквизиты.
  4. Перенесите программный код в модули нового расширения.
  5. Удалите старое расширение и примените новое.

Ошибка SDBL с таблицами RefSInf

Вторая распространенная проблема — сообщение вида "В схеме базы данных нет таблицы с именем RefSInfXXXXX". Эта ошибка имеет другую природу. Таблицы с префиксом RefSInf (Reference Storage Info) или _RefSInf в SQL отвечают за хранение информации о предопределенных элементах метаданных (справочников, планов видов характеристик и т.д.).

Причина: Это подтвержденная ошибка платформы 1С (зарегистрирована под кодом 60011839). В версиях платформы 8.3.24.1346–8.3.24.1667 процедура "Тестирование и исправление" (ТиИ) с проверкой логической целостности ошибочно удаляла пустые таблицы предопределенных данных, считая их мусором. Это особенно актуально для баз, использующих разделение данных (или имеющих признаки разделения).

Решение 4: Обновление платформы и ТиИ

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

Рекомендуемые версии:

После обновления платформы обязательно выполните "Тестирование и исправление" (Администрирование -> Тестирование и исправление) со следующими галочками:

В исправленных версиях платформы этот процесс должен восстановить недостающие таблицы.

Решение 5: Ручное восстановление через удаление предопределенных данных

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

Шаг 1. Диагностика

Воспользуемся встроенной функцией ПолучитьСтруктуруХраненияБазыДанных(), чтобы найти проблемный объект метаданных.

Создадим простую внешнюю обработку и выполним код:


ТаблицыБД = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого СтрокаТаблицы Из ТаблицыБД Цикл
    // Ищем имя таблицы, на которую ругается ошибка (например, RefSInf26550)
    // Обратите внимание, что в сообщении об ошибке имя может быть без подчеркивания, 
    // а в базе данных с подчеркиванием. Ищем по вхождению.
    Если Найти(СтрокаТаблицы.ИмяТаблицыХранения, "RefSInf") > 0 Тогда
        Сообщить("Таблица: " + СтрокаТаблицы.ИмяТаблицыХранения + " -> Метаданные: " + СтрокаТаблицы.Метаданные);
    КонецЕсли;
КонецЦикла;

Этот код выведет список соответствия. Например, мы узнаем, что RefSInf26550 относится к справочнику ИдентификаторыОбъектовМетаданных.

Шаг 2. Пересоздание

Зная проблемный справочник, выполним следующие действия (обязательно сделайте резервную копию перед началом!):

  1. Откроем конфигуратор.
  2. Если конфигурация находится на поддержке без возможности изменения, включим возможность изменения (Конфигурация -> Поддержка -> Настройка поддержки).
  3. Найдем проблемный справочник (в примере — ИдентификаторыОбъектовМетаданных).
  4. Откроем его Предопределенные данные.
  5. Если там есть элементы, временно удалим их (или пометим, что мы их трогали, но лучше всего работает удаление и последующее восстановление). Однако для системных справочников (как идентификаторы) удаление элементов может быть опасным.

Более безопасный вариант из практики (сообщение 22):

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

Решение 6: Восстановление средствами СУБД (SQL)

Если у вас клиент-серверный вариант работы и есть доступ к SQL Server Management Studio, а также имеется резервная копия базы (сделанная до возникновения ошибки), можно восстановить таблицу напрямую.

Порядок действий:

  1. Разверните резервную копию базы данных под другим именем на SQL сервере.
  2. Найдите в копии таблицу, имя которой фигурирует в ошибке (например, _RefSInf19574).
  3. С помощью скрипта переноса данных или мастера импорта/экспорта SQL перенесите эту таблицу (структуру и данные) в рабочую базу данных.
  4. После появления таблицы в SQL, запустите в Конфигураторе "Тестирование и исправление" с реструктуризацией. Это необходимо, чтобы платформа "подхватила" таблицу и синхронизировала её со своей внутренней схемой SDBL.

Резюме

Ошибки DataHistorySettingsExt и RefSInf являются следствием рассинхронизации схемы данных при обновлениях. Для DataHistorySettingsExt обычно помогает переключение флага "История данных" или пересоздание расширения. Для RefSInf — обновление платформы до исправленного релиза и реструктуризация, либо сложные манипуляции со снятием с поддержки и возвратом метаданных.

← На главную