Как восстановить файловую базу 1С при ошибке SDBL «В схеме базы данных нет таблицы с именем Const...»

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

Представим ситуацию: в наши руки попала файловая база данных «1С:Бухгалтерия предприятия, редакция 3.0». Известно, что база «погибла» при попытке обновления. Резервной копии, как это часто бывает, нет. При запуске в режиме «1С:Предприятие» система выдает критическое окно:

Невосстановимая ошибка. Ошибка при выполнении запроса POST к ресурсу /e1cib/modules/call по причине: Ошибка SDBL: В схеме базы данных нет таблицы с именем Const30015

При этом стандартная утилита проверки физической целостности chdbfl.exe не находит ошибок, а режим «Тестирование и исправление» (ТИИ) при попытке выполнить реиндексацию таблиц информационной базы просто «вылетает». Режим Конфигуратора при этом может успешно открываться. Давайте подробно разберем, почему возникает эта ошибка и как восстановить работоспособность базы данных шаг за шагом.

Выясняем причину: почему возникает ошибка SDBL

Для начала проанализируем физическую структуру хранения данных в 1С. Ошибка SDBL (System Database Layer) указывает на рассогласование между логическим описанием объектов метаданных конфигурации и их физическим представлением в таблицах базы данных СУБД (в файловом варианте — внутри файла 1Cv8.1CD).

В процессе обновления базы данных платформа выполняет реструктуризацию в несколько этапов:

  1. Создается новая конфигурация в таблице CONFIGSAVE.
  2. Вносятся изменения в таблицу соответствий имен объектов DBNames (хранится в таблице системных параметров Params).
  3. Физически перестраиваются таблицы данных в СУБД (добавляются новые колонки, индексы, создаются новые таблицы под новые объекты метаданных).
  4. Обновляется системная таблица DBSCHEMA, описывающая актуальную структуру базы данных.
  5. Данные из CONFIGSAVE переносятся в основную таблицу конфигурации CONFIG, а CONFIGSAVE очищается.

Если в процессе этого сложного механизма происходит сбой (выключили свет, завис компьютер, завершился процесс платформы), транзакция прерывается на полпути. В результате в метаданных (или в таблице соответствия имен DBNames) новая константа или справочник уже прописаны, а физическое описание таблицы в DBSCHEMA еще не создано или таблица не успела физически появиться в файле базы. Платформа пытается обратиться к таблице _Const30015, не находит её описания в DBSCHEMA и аварийно завершает работу.

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

Архитектурные основы: где хранятся метаданные в файле 1Cv8.1CD

Чтобы успешно восстановить базу, нам понадобятся специализированные инструменты. Основным из них является утилита Tool_1CD (желательно использовать версии Alpha, например, 0.3.0 или 0.4.0, которые позволяют не только просматривать, но и редактировать данные таблиц напрямую).

Давайте выясним, за какие области структуры базы данных отвечают ключевые таблицы файла 1Cv8.1CD:

Посмотрим на типичный фрагмент описания структуры в DBSCHEMA, экспортированный в текстовый вид:


{"Const21517","N",21517,"",
{3,
{"Fld21518",0,
{1,
{"L",0,0,"",0}
},"",0},
{"Fld1174",0,
{1,
{"N",7,0,"",0}
},"",0},
{"RecordKey",0,
{1,
{"B",1,0,"",0}
},"",0}
},
{0},
{1,
{"ByKey",1,
{1,"RecordKey"},1,0,0}
},1,"S"}

Если в вашей схеме отсутствует аналогичный блок для проблемной таблицы Const30015, платформа выдаст ошибку SDBL.

Способ №1: Откат незавершенного обновления через очистку CONFIGSAVE

Это самый простой и быстрый способ реанимации базы, если сбой произошел в самом начале процесса реструктуризации. Наша задача — заставить платформу забыть о том, что она пыталась обновиться, и вернуть её к стабильной конфигурации, которая по-прежнему хранится в таблице CONFIG.

Выполним процедуру по шагам:

  1. Обязательно делаем физическую копию файла 1Cv8.1CD перед любыми манипуляциями!
  2. Запускаем утилиту Tool_1CD и открываем в ней файл базы данных.
  3. Находим в списке таблиц таблицу CONFIGSAVE.
  4. Проверяем наличие записей в ней. Если таблица не пуста, это подтверждает, что процесс обновления «завис» посередине.
  5. Очищаем все записи в таблице CONFIGSAVE (в Tool_1CD для этого используется режим редактирования или импорта/экспорта таблиц). Полное удаление записей из этой таблицы отменит применение новой конфигурации.
  6. Сохраняем изменения и закрываем утилиту.
  7. Пробуем запустить базу в режиме Конфигуратора или Предприятия.

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

Способ №2: Восстановление DBSCHEMA и DBNames через базу-донора

Если очистка CONFIGSAVE не помогла или таблица изначально была пуста, значит, метаданные в CONFIG уже обновились, запись в DBNames добавилась, а физическая схема в DBSCHEMA осталась старой. Нам необходимо привести структуру СУБД в соответствие с новой конфигурацией.

Поскольку ручная правка бинарной схемы DBSCHEMA в HEX-редакторе — задача крайне трудоемкая и требующая глубоких познаний формата, мы воспользуемся методом «трансплантации» схемы из чистой базы-донора той же версии конфигурации.

Рассмотрим этот алгоритм детально:

  1. Выясняем точную версию конфигурации поврежденной базы. Это можно сделать через Конфигуратор (если он запускается) или выгрузив файл конфигурации (.cf) с помощью Tool_1CD.
  2. Устанавливаем аналогичный шаблон конфигурации 1С на компьютер и создаем абсолютно пустую файловую базу этой же версии.
  3. Запускаем Tool_1CD и открываем чистую базу-донор. Находим таблицу DBSCHEMA и экспортируем её содержимое в файл (например, dbschema_donor.bin).
  4. В этой же базе-доноре находим таблицу Params, находим запись с идентификатором dbnames и экспортируем её значение во внешний файл (например, dbnames_donor.bin).
  5. Закрываем базу-донор и открываем в Tool_1CD нашу поврежденную базу данных.
  6. Импортируем сохраненный файл dbschema_donor.bin в таблицу DBSCHEMA битой базы с заменой существующих данных.
  7. Переходим в таблицу Params поврежденной базы, находим запись dbnames и заменяем её содержимое файлом dbnames_donor.bin.
  8. Запускаем утилиту chdbfl.exe и проверяем модифицированную базу. Утилита исправит мелкие логические несоответствия в заголовках таблиц данных (поскольку мы заменили схему, некоторые таблицы данных могут потребовать переиндексации).
  9. Запускаем Конфигуратор и выполняем полное «Тестирование и исправление» с включенным режимом «Реструктуризация таблиц информационной базы».

Важное предупреждение: При замене файлов DBSCHEMA и DBNames на донорские напрямую, внутренние идентификаторы (GUID) метаданных в конфигурации-доноре должны строго совпадать с метаданными вашей поврежденной конфигурации. Этот метод идеально работает для полностью типовых конфигураций, обновлявшихся по стандартным релизам фирмы «1С». Если в базе присутствуют доработки (измененные объекты, добавленные реквизиты), этот способ разрушит связи метаданных, и данные доработанных объектов будут утеряны!

Способ №3: Поштучное удаление конфликтующих объектов из DBNames

Если база была нетиповой или повреждения затронули всего одну-две таблицы (например, конкретную константу Const30015), можно попытаться «откатить» объявление этих таблиц в структуре базы. Выясним, как это сделать:

  1. Открываем поврежденную базу в Tool_1CD.
  2. Экспортируем запись dbnames из таблицы Params. Это текстовый XML-подобный или JSON-подобный массив соответствий.
  3. Открываем выгруженный файл в текстовом редакторе (например, Notepad++) и находим строку, содержащую упоминание проблемной таблицы. Пример строки: {05c30f10-c7aa-4806-9f63-5ba24872f7be,"Const",30015},
  4. Аккуратно удаляем эту запись из структуры файла. Этим действием мы сообщаем платформе, что константы с номером 30015 больше не существует в схеме сопоставления.
  5. Загружаем отредактированный файл обратно в таблицу Params на место оригинальной записи dbnames.
  6. Запускаем Конфигуратор. База должна успешно открыться, так как при обращении к схеме платформа больше не будет искать таблицу Const30015.
  7. После успешного входа в Конфигуратор необходимо внести минимальное изменение в метаданные (например, добавить описание в комментарий конфигурации) и нажать «Обновить конфигурацию базы данных» (F7). Платформа инициирует корректную реструктуризацию и самостоятельно перестроит схему DBSCHEMA, удалив или пересоздав некорректные таблицы.

Способ №4: Использование SQL-сервера для исправления логических ошибок схемы

Если у вас есть доступ к клиент-серверному варианту работы (MS SQL или PostgreSQL), исправить ошибку SDBL часто оказывается намного проще благодаря развитым инструментам СУБД.

Давайте рассмотрим этот продвинутый метод:

  1. Попробуем выгрузить информационную базу из Конфигуратора в файл резервной копии .dt. Если Конфигуратор открывается и дает выполнить выгрузку — нам повезло.
  2. Создаем на сервере СУБД (например, MS SQL Server) новую пустую базу данных и регистрируем её в кластере 1С.
  3. Загружаем наш файл .dt в созданную SQL-базу.
  4. При первой попытке запуска в режиме «1С:Предприятие» СУБД выдаст ту же ошибку SDBL об отсутствии таблицы _Const30015.
  5. Запускаем SQL Server Management Studio (SSMS) и подключаемся к нашей базе данных.
  6. Поскольку ошибка говорит о физическом отсутствии таблицы СУБД, создадим её вручную SQL-скриптом. Проанализируем структуру стандартной таблицы констант в 1С. Она состоит из трех полей. Выполним следующий запрос:
    
    CREATE TABLE _Const30015 (
        _RecordKey binary(1) NOT NULL,
        _Val_TypeOffset numeric(4,0) NOT NULL,
        _Val_IDRRef binary(16) NOT NULL,
        CONSTRAINT PK__Const30015 PRIMARY KEY CLUSTERED (_RecordKey)
    );
    
    *(Примечание: точные типы полей могут отличаться в зависимости от типа данных константы. Если константа простая, например, число или строка, поля будут иметь соответствующий тип. Структуру полей можно подсмотреть у любой соседней рабочей таблицы констант).*
  7. После успешного создания пустой таблицы в SQL перезапускаем службу сервера 1С (для очистки кэша метаданных) и пробуем зайти в базу.
  8. Платформа обнаружит физическую таблицу _Const30015, успешно пройдет этап инициализации SDBL и запустит систему.
  9. Теперь в Конфигураторе запускаем «Тестирование и исправление» с галочкой «Реструктуризация таблиц». Платформа сама пересоздаст таблицу по правильной внутренней схеме, заполнив её значениями по умолчанию.
  10. После завершения реструктуризации выгружаем базу обратно в .dt и загружаем её в файловый вариант .1CD.

Способ №5: Выгрузка данных через XML в чистую информационную базу

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

Давайте разберем, как обойти ошибку SDBL при выгрузке:

  1. Создаем новую пустую базу данных на основе того же релиза конфигурации.
  2. В поврежденной базе (если запускается Конфигуратор) пробуем написать простую обработку по выгрузке данных в формат XML. Поскольку при обращении к битым объектам (например, нашей константе) код будет аварийно завершаться, нам необходимо использовать конструкцию исключений:
    
    Попытка
        // Код выгрузки конкретного объекта метаданных
        ВыгрузитьОбъект(ТекущийОбъект);
    Исключение
        ЗаписьЖурналаРегистрации("ВыгрузкаДанных", УровеньЖурналаРегистрации.Предупреждение, , , 
            "Пропущен битый объект: " + ТекущийОбъект);
    КонецПопытки;
    
  3. Для массовой выгрузки без написания собственного кода используем стандартную обработку с диска ИТС «Выгрузка и загрузка данных XML».
  4. При запуске выгрузки снимаем галочки с поврежденных объектов (в нашем случае — отключаем выгрузку константы, на которую ругается база).
  5. Выгружаем данные в файл XML. Если в процессе выгрузки происходит падение на каком-то другом объекте, выясняем его имя по журналу регистрации, исключаем его из списка выгрузки и повторяем процедуру.
  6. Запускаем чистую базу-приемник и загружаем полученный XML-файл с помощью той же обработки. Данные будут перенесены в абсолютно чистую структуру, где DBSCHEMA и физические таблицы гарантированно согласованы.

Подводим итоги и делаем выводы

Мы подробно рассмотрели сложнейшую техническую проблему — нарушение целостности метаданных СУБД 1С. Ошибка SDBL, связанная с отсутствием таблиц в схеме базы данных, больше не должна вызывать у нас панику. Мы научились восстанавливать базу несколькими альтернативными методами: от простого отката изменений в CONFIGSAVE до тонкой хирургической правки соответствий в таблицах DBSCHEMA и DBNames.

Для предотвращения подобных ситуаций в будущем крайне важно соблюдать базовые правила администрирования систем на базе «1С:Предприятие»:

← На главную