Как исправить ошибку SDBL «Тип поля 21:00000000000000000 несовместим с типом...» при записи элементов в 1С?

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

В процессе активной разработки и изменения структуры метаданных в конфигураторе 1С:Предприятие (особенно на крупных базах уровня УПП или ERP, работающих под управлением MS SQL Server) разработчики часто сталкиваются со специфическими ошибками СУБД. Одна из наиболее неприятных и труднодиагностируемых проблем — это ошибка SDBL (Simple Data Base Language), сообщающая о несовместимости типов полей, содержащая длинную последовательность нулей вида 21:00000000000000000000000000000000.

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

Что означает ошибка SDBL и код 21 технически?

Для начала проанализируем, что скрывается за загадочной кодировкой в тексте ошибки. Внутренний язык запросов платформы 1С (SDBL) транслирует метаданные конфигурации в физические таблицы SQL. При этом каждому классу объектов (справочники, документы, регистры) присваивается свой внутренний числовой идентификатор.

Разберем структуру ошибочного значения по частям:

  1. Числовой код (например, 21) — это внутренний ссылочный идентификатор класса метаданных в конкретной базе данных. Платформа резервирует эти коды для связей между таблицами. Например, код 21 может быть назначен новому справочнику в таблице конфигурации.
  2. Последовательность нулей (Null UUID) — представляет собой пустое уникальное значение ссылки (пустую ссылку) для данного типа данных.
  3. Суть конфликта заключается в том, что СУБД ожидает увидеть в колонке Fld... таблицы базы данных значение одного типа, а платформа 1С пытается записать или прочитать туда пустую ссылку типа 21. Уровень SDBL распознает это несоответствие как нарушение логической целостности и моментально блокирует транзакцию, возвращая ошибку.

Главные причины рассинхронизации метаданных

Почему возникает эта ошибка? Практика администрирования баз данных 1С выделяет две ключевые причины:

1. Задвоение ссылочных кодов таблиц СУБД. Это классическая проблема платформы 1С:Предприятие 8.3 (особенно часто проявляющаяся на релизах веток 8.3.12, 8.3.13 и 8.3.14). Сбой происходит по следующей схеме: администратор восстанавливает резервную копию базы данных средствами MS SQL Server Management Studio поверх существующей базы, но при этом не перезапускает службу сервера 1С (ragent). Менеджер кластера 1С продолжает держать в своей оперативной памяти старую карту метаданных. При добавлении нового справочника платформа выделяет ему первый свободный, по мнению кэша, код (например, 21). Однако в физической SQL-базе под этим кодом уже существует совершенно другой объект. Возникает наложение типов, приводящее к краху транзакций при записи.

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


Методика устранения ошибки: пошаговые решения

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

Решение 1. Очистка серверного кэша и перезапуск служб (Первоочередное действие)

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

  1. Остановим службу «Агент сервера 1С:Предприятия» (1C:Enterprise 8.3 Server Agent) через консоль управления службами Windows или с помощью командной строки.
  2. Перейдем в каталог расположения данных сервера (по умолчанию это C:\Program Files\1cv8\srvinfo\ или C:\ProgramData\1C\1cv8\).
  3. Найдем папку нужного кластера (обычно reg_1541) и полностью очистим внутри нее временные папки кэша (каталоги с длинными буквенно-цифровыми именами типа snccntx...).
  4. Запустим службу СУБД MS SQL Server и выполним очистку процедурного кэша планов запросов SQL. Для этого в среде SQL Server Management Studio (SSMS) выполним следующий запрос:

USE [Имя_Вашей_Базы_Данных];
GO
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
GO
  1. Запустим службу сервера 1С:Предприятия обратно. После выполнения этих процедур платформа будет вынуждена заново пересчитать внутреннюю структуру таблиц при первом обращении пользователей.

Решение 2. Откат к рабочей конфигурации и Тестирование и Исправление (ТиИ)

Если простая очистка кэша не помогла, значит, повреждение структуры метаданных уже зафиксировано в таблицах SQL. Разберем алгоритм восстановления:

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

Решение 3. Трюк с добавлением «фиктивного реквизита»

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

Рассмотрим этот трюк по шагам:

  1. Откроем Конфигуратор и перейдем к свойствам нового проблемного справочника (на который ссылается реквизит с ошибкой).
  2. Добавим в этот справочник новый реквизит. Дадим ему имя, например, ФиктивныйРеквизитДляРеструктуризации с простейшим типом данных Строка (длина 10).
  3. Нажмем клавишу F7 (Обновить конфигурацию базы данных). В этот момент платформа 1С инициирует транзакцию изменения структуры SQL-таблицы (ALTER TABLE) для добавления новой колонки. Это автоматически заставит слой SDBL пересоздать внутренние индексы и обновить описания типов полей.
  4. После успешного обновления удалим этот фиктивный реквизит из справочника и снова обновим конфигурацию базы данных (F7). Ошибка SDBL в большинстве случаев исчезнет, так как физическая таблица была успешно переписана в СУБД.

Решение 4. Полная пересборка структуры через выгрузку в DT-файл

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

Выполним процедуру следующим образом:

  1. В Конфигураторе выберем пункт меню Администрирование — Выгрузить информационную базу... и сохраним данные в файл формата .dt. При выгрузке платформа упаковывает только логические данные, очищая их от физической привязки к конкретной структуре таблиц SQL.
  2. Создадим на сервере СУБД MS SQL абсолютно новую пустую базу данных.
  3. Пропишем эту новую базу в кластере серверов 1С.
  4. Запустим конфигуратор новой пустой базы данных.
  5. Выберем пункт меню Администрирование — Загрузить информационную базу... и укажем ранее сохраненный файл .dt.
  6. Во время загрузки платформа 1С сгенерирует все физические таблицы в SQL-базе заново, автоматически назначив новые корректные последовательные идентификаторы метаданных без наложений и конфликтов.

Решение 5. Принудительное исправление через механизм РИБ (для больших баз)

Бывают ситуации, когда объем информационной базы измеряется сотнями гигабайт или терабайтами, и классическая выгрузка/загрузка в .dt физически не может завершиться из-за нехватки памяти или ограничений по времени. В этом случае мы можем прибегнуть к механизму создания начального образа распределенной информационной базы (РИБ):

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

ПланыОбмена.УстановитьГлавныйУзел(Неопределено);

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

Рекомендация по обновлению платформы

Проанализировав причины частых падений механизма SDBL, важно отметить, что в старых версиях платформы (таких как 8.3.13.1690) присутствовали недоработки в транзакционном кэше работы с СУБД. Если вы регулярно сталкиваетесь с подобными проблемами реструктуризации при разработке, настоятельно рекомендуем запланировать обновление технологической платформы 1С:Предприятие до актуальных стабильных релизов, где ошибки задвоения кодов СУБД были массово устранены разработчиками.

← На главную