При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 (начиная с релизов 3.0.70 и выше) пользователи могут столкнуться с критической ошибкой при попытке записи или проведения документов, в частности Требование-накладная. Текст ошибки выглядит следующим образом: "Ошибка SDBL: Тип поля 1591:00000000000000000000000000000000 несовместим с типом поля Fld3217". Эта проблема является невосстановимой в рамках обычного пользовательского интерфейса и требует глубокого технического анализа структуры базы данных.
В данной статье мы разберем причины возникновения этой ошибки, научимся идентифицировать проблемные объекты метаданных и рассмотрим пошаговые инструкции по восстановлению корректной работы системы.
Аббревиатура SDBL (Simple Data Bank Language) относится к внутреннему слою платформы 1С, который отвечает за взаимодействие между объектной моделью 1С и реляционными таблицами СУБД (SQL Server, PostgreSQL и др.). Ошибка указывает на то, что на уровне описания схемы базы данных произошло рассогласование: поле в таблице документа (в нашем примере Fld3217) ожидает данные определенного типа, но платформа пытается сопоставить его с типом, имеющим пустой уникальный идентификатор (GUID из нулей).
Разберем структуру идентификатора 1591:0000...0000:
Чаще всего такие ситуации возникают после некорректно завершенного обновления конфигурации в режиме "Динамическое обновление" или при сбоях в процессе реструктуризации базы данных, когда физическая структура таблиц в SQL уже изменилась, а внутренние таблицы метаданных 1С (такие как DbNames или DBSchema) остались в промежуточном состоянии.
Первым делом нам необходимо выяснить, какой именно объект метаданных скрывается за номерами 1591 и Fld3217. Для этого мы воспользуемся встроенной функцией платформы. Проанализируем ситуацию, написав небольшую обработку или воспользовавшись консолью запросов с кодом:
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.ИмяТаблицыХранения = "Reference1591" Тогда
Сообщить("Таблица 1591 — это: " + Таблица.Метаданные.ПолноеИмя());
КонецЕсли;
Для Каждого Поле Из Таблица.Поля Цикл
Если Поле.ИмяПоляХранения = "Fld3217" Тогда
Сообщить("Поле Fld3217 — это реквизит: " + Поле.Метаданные.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецЦикла;
Как показывает практика решения подобных кейсов в 1С:Бухгалтерия 3.0.70, таблица с ID 1591 обычно соответствует справочнику ЦелиРасходовМатериалов, а поле Fld3217 является реквизитом ЦельРасхода в табличной части документа ТребованиеНакладная.
Если после выявления проблемного справочника вы попробуете манипулировать данными напрямую в SQL (например, удалив запись), вы можете столкнуться со следующей ошибкой: "Таблица или поле Version не содержится в разделе FROM". Рассмотрим, почему это происходит.
Поле _Version — это системный реквизит, используемый платформой 1С для реализации механизма оптимистической блокировки. При каждом изменении записи значение в этом поле инкрементируется. Ошибка "поле Version не содержится" говорит о том, что описание таблицы в Config/DBSchema требует наличия этого поля для контроля версий, но в физической таблице SQL (Reference1591) оно либо отсутствует, либо имеет некорректный тип данных.
Поскольку стандартные средства (chdbfl.exe, тестирование и исправление, выгрузка в .dt) часто оказываются бессильны против ошибок в DBSchema, рассмотрим более радикальные и эффективные методы.
Метод 1: Принудительная реструктуризация (наиболее безопасный)
Мы можем заставить платформу пересобрать таблицу справочника заново. Для этого выполним следующие действия:
ЦелиРасходовМатериалов.ТехническоеПоле с типом Строка).ALTER TABLE и будет вынуждена пересчитать структуру, включая системные поля _Version.Метод 2: Сброс конфигурации поставщика
Иногда помогает "перезагрузка" описания типов через файл конфигурации:
.cf..cf. Это заставит систему сопоставить объекты метаданных и физические таблицы заново.Метод 3: Временное изменение типа реквизита (костыль)
Если работу нужно восстановить немедленно, а справочник ЦелиРасходовМатериалов не является критически важным для текущего учета:
ТребованиеНакладная реквизит ЦельРасхода.Строка.Важно понимать, что файл .dt содержит в себе не только данные, но и описание структуры (метаданные), которые и являются поврежденными. При загрузке в новую базу платформа добросовестно восстанавливает ошибочное описание DBSchema, и ошибка "переезжает" вместе с данными. Поэтому решение всегда должно быть направлено на изменение структуры метаданных в конфигураторе, чтобы инициировать реальную реструктуризацию таблиц в СУБД.
Проанализировав ситуацию, мы видим, что корень проблемы лежит в несоответствии системных полей в новых справочниках, добавленных в последних релизах БП 3.0. Чтобы избежать подобных проблем в будущем, рекомендуем:
ПолучитьСтруктуруХраненияБазыДанных(), чтобы понимать, какой объект локально поврежден.Используя метод с добавлением временного реквизита, вы сможете восстановить работу справочника Цели расходов материалов и устранить ошибку несовместимости типов без потери данных.