В процессе активной разработки и изменения структуры метаданных в конфигураторе 1С:Предприятие (особенно на крупных базах уровня УПП или ERP, работающих под управлением MS SQL Server) разработчики часто сталкиваются со специфическими ошибками СУБД. Одна из наиболее неприятных и труднодиагностируемых проблем — это ошибка SDBL (Simple Data Base Language), сообщающая о несовместимости типов полей, содержащая длинную последовательность нулей вида 21:00000000000000000000000000000000.
В этой статье мы подробно разберем природу этого сбоя, выясним основные причины его возникновения на физическом уровне базы данных и рассмотрим пошаговые сценарии его устранения.
Для начала проанализируем, что скрывается за загадочной кодировкой в тексте ошибки. Внутренний язык запросов платформы 1С (SDBL) транслирует метаданные конфигурации в физические таблицы SQL. При этом каждому классу объектов (справочники, документы, регистры) присваивается свой внутренний числовой идентификатор.
Разберем структуру ошибочного значения по частям:
21 может быть назначен новому справочнику в таблице конфигурации.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С. Выполним следующие шаги:
1C:Enterprise 8.3 Server Agent) через консоль управления службами Windows или с помощью командной строки.C:\Program Files\1cv8\srvinfo\ или C:\ProgramData\1C\1cv8\).reg_1541) и полностью очистим внутри нее временные папки кэша (каталоги с длинными буквенно-цифровыми именами типа snccntx...).
USE [Имя_Вашей_Базы_Данных];
GO
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
GO
Если простая очистка кэша не помогла, значит, повреждение структуры метаданных уже зафиксировано в таблицах SQL. Разберем алгоритм восстановления:
Если база данных работает в режиме реального времени и вы не можете оперативно откатить конфигурацию назад, можно попытаться заставить платформу выполнить принудительную реструктуризацию таблицы справочника на физическом уровне.
Рассмотрим этот трюк по шагам:
ФиктивныйРеквизитДляРеструктуризации с простейшим типом данных Строка (длина 10).Когда ошибки SDBL блокируют любые попытки обновления конфигурации или запуска тестирования, самым надежным средством является полное пересоздание таблиц СУБД «с нуля» через процедуру импорта/экспорта данных.
Выполним процедуру следующим образом:
.dt. При выгрузке платформа упаковывает только логические данные, очищая их от физической привязки к конкретной структуре таблиц SQL..dt.Бывают ситуации, когда объем информационной базы измеряется сотнями гигабайт или терабайтами, и классическая выгрузка/загрузка в .dt физически не может завершиться из-за нехватки памяти или ограничений по времени. В этом случае мы можем прибегнуть к механизму создания начального образа распределенной информационной базы (РИБ):
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
В результате мы получим полную и абсолютно работоспособную копию нашей информационной базы с исправленной внутренней структурой SDBL, готовую к работе.
Проанализировав причины частых падений механизма SDBL, важно отметить, что в старых версиях платформы (таких как 8.3.13.1690) присутствовали недоработки в транзакционном кэше работы с СУБД. Если вы регулярно сталкиваетесь с подобными проблемами реструктуризации при разработке, настоятельно рекомендуем запланировать обновление технологической платформы 1С:Предприятие до актуальных стабильных релизов, где ошибки задвоения кодов СУБД были массово устранены разработчиками.