Как исправить ошибки SDBL при тестировании и исправлении (ТиИ) после частичного восстановления базы 1С?

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

Восстановление поврежденной базы данных 1С — это всегда сложный, а порой и непредсказуемый процесс. Типичная ситуация: после аварийного завершения работы, сбоя СУБД или повреждения диска база перестает открываться. Администраторы и разработчики пытаются восстановить ее работоспособность всеми доступными средствами, включая утилиту chdbfl.exe и прямое редактирование таблиц через специализированный софт (например, Tool_1CD). Однако подобные «хирургические» вмешательства часто приводят к возникновению опасных логических несоответствий.

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

Почему возникают ошибки «SDBL: выход за пределы размерности результата» и «SDBL: FldXXXX не является именем поля»?

Давайте проанализируем внутреннее устройство реляционной структуры 1С. Платформа не обращается к таблицам СУБД (будь то файловый 1CD или клиент-серверный MS SQL/PostgreSQL) напрямую по их метаименам (таким как Справочник.ДоговорыКонтрагентов). Вместо этого используется внутренний слой абстракции — SDBL (Simple Data Base Layer).

Для трансляции понятных разработчику имен в физические имена таблиц СУБД платформа использует две ключевые системные сущности:

  1. Таблица CONFIG: Содержит конфигурацию базы данных, актуальную структуру метаданных, а также бинарное описание схемы данных в таблице DBSchema.
  2. Таблица PARAMS (DBNames): Хранит внутреннее соответствие между логическими объектами конфигурации и их физическим представлением в СУБД (например, связку Справочник.ДоговорыКонтрагентов = _Reference34).

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

Если в процессе восстановления поврежденной базы данных вы берете таблицу CONFIG из старого бэкапа или из чистой типовой конфигурации того же релиза, возникает глобальная рассинхронизация:

Простая замена или переименование файлов таблиц (например, попытка подменить Reference34 на Reference36) не решает проблему, так как внутреннее описание полей внутри этих таблиц все равно расходится с ожиданиями платформы.

---

Метод 1. Восстановление точной версии конфигурации БД (CF-файла)

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

Рассмотрим по шагам, как правильно восстановить структуру:

  1. Выясните точный номер релиза конфигурации, которая была установлена на момент сбоя (например, Бухгалтерия предприятия 2.0.64.21).
  2. Скачайте с официального портала поддержки 1С дистрибутив (шаблон) именно этого релиза.
  3. Установите шаблон и найдите файл поставки 1cv8.cf.
  4. Используя утилиту Tool_1CD (или аналогичные инструменты для работы с файловыми базами данных), загрузите корректный, чистый файл конфигурации непосредственно в таблицу CONFIG поврежденной базы. Это гарантирует, что метаданные платформы будут соответствовать релизу конфигурации на момент аварии.

---

Метод 2. Обход ошибок SDBL на уровне СУБД (SQL)

Если база данных переведена на клиент-серверный вариант (MS SQL Server или PostgreSQL), мы получаем мощный инструментарий для прямого управления структурой таблиц. Мы можем обмануть механизм реструктуризации ТиИ, вручную создав те поля, которые он не может найти.

Разберем алгоритм устранения ошибки на примере Microsoft SQL Server:

  1. Перенесите поврежденную базу данных на SQL-сервер (если она была файловой, загрузите ее через администрирование СУБД или утилиту загрузки).
  2. Включите технологический журнал 1С (ТЖ) для отслеживания ошибок SDBL и EXCP, либо запустите утилиту трассировки SQL Server Profiler.
  3. Запустите процедуру Тестирования и исправления в конфигураторе 1С. Дождитесь аварийного завершения работы.
  4. По логам технологического журнала или трассировки SQL определите, к какой именно физической таблице (например, _Reference34) шло обращение и какое поле (например, _Fld12581) вызвало ошибку SDBL: Fld12581 не является именем поля. Также зафиксируйте ожидаемый тип данных этого поля из контекста запроса.
  5. Откройте консоль SQL Server Management Studio (SSMS) и выполните запрос на добавление недостающей колонки в таблицу.

Пример SQL-скрипта для добавления недостающей колонки неопределенного типа (или числового типа):


ALTER TABLE dbo._Reference34 
ADD _Fld12581 NUMERIC(10, 0) NOT NULL DEFAULT 0;

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


-- Пример добавления строкового поля
ALTER TABLE dbo._Reference34 
ADD _Fld12581 NVARCHAR(150) NOT NULL DEFAULT '';

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

---

Метод 3. Принудительная очистка служебных таблиц обновлений

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

Выполните следующие действия через консоль СУБД:

  1. Полностью очистите таблицу CONFIGSAVE, в которой хранится промежуточная (несохраненная) конфигурация базы данных. В ней не должно быть записей.
  2. Очистите служебные таблицы регистрации изменений конфигурации, выполнив следующие SQL-запросы:

DELETE FROM dbo._ConfigChngR;
DELETE FROM dbo._ConfigChngR_ExtProps;

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

---

Метод 4. Потабличный перенос данных (Data Pumping)

Когда структура справочников (особенно таких сложных, как ДоговорыКонтрагентов) разрушена окончательно, а простая замена физических файлов таблиц приводит к потере связей, наиболее надежным решением является перенос данных «снизу вверх» на уровне СУБД.

Рассмотрим алгоритм контролируемого переноса данных:

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

Пример SQL-запроса для потабличного переноса данных с явным сопоставлением полей:


INSERT INTO НоваяБаза.dbo._Reference36 (_IDRRef, _Version, _Description, _Fld15000)
SELECT 
    _IDRRef, 
    _Version, 
    _Description, 
    _Fld12581 -- Сопоставляем старое поле с новым физическим именем
FROM СтараяБаза.dbo._Reference34;

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

---

Рекомендации по предотвращению подобных ошибок

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

← На главную