При работе с конфигурацией 1С:Управление торговлей 11 администраторы и разработчики иногда сталкиваются с труднообъяснимыми ошибками механизма SDBL (Simple Data Base Language). Одна из самых неприятных — "Ошибка SDBL: тип поля fld XXXX несовместим с типом литерала UNDEFINED". Эта проблема обычно возникает на этапе "Проверки логической целостности" при выполнении стандартного "Тестирования и исправления" (ТиИ). Ситуация осложняется тем, что стандартные средства вроде chdbfl.exe или выгрузки/загрузки .dt часто не приносят результата.
В этой статье мы подробно разберем, почему возникает это противоречие и как пошагово восстановить работоспособность базы данных, основываясь на практическом опыте решения подобных инцидентов.
Прежде всего, проанализируем само сообщение. SDBL — это внутренний язык запросов платформы 1С к базе данных. Ошибка говорит о том, что при выполнении низкоуровневого запроса система пытается сравнить значение в колонке таблицы (например, fld10292, которая отвечает за реквизит Сумма) со значением UNDEFINED (Неопределено). Однако для числовых полей в базе данных тип UNDEFINED недопустим — там может быть либо число, либо NULL (в случае SQL-версии).
Если ошибка возникает на документе ЗаказКлиента, это означает, что метаданные конфигурации "разошлись" с физической структурой таблиц или индексов. Рассмотрим способы решения — от простых к радикальным.
В современных версиях УТ 11 расширения стали основной причиной сбоев SDBL. Если в расширении заимствован документ ЗаказКлиента или добавлены связанные с ним реквизиты, процессор запросов может некорректно интерпретировать структуру данных.
Проделаем следующие действия:
ЗаказКлиента.Если ошибка исчезла, значит, проблему нужно искать в конкретном расширении: возможно, потребуется его пересоздать или обновить до актуальной версии платформы.
Иногда ошибка является "фантомной" и вызвана некорректным кэшированием метаданных на стороне сервера или клиента. Разберем, как очистить систему:
Config, ConfigSave и snccntx в каталоге серверного вызова (обычно это C:\Program Files\1cv8\srvinfo\...).%AppData%\1C\1cv8.Также стоит проверить таблицы регистрации изменений. Если документ участвует в обменах, для него создаются служебные таблицы. Попробуем удалить все регистрации для этого документа через обработку "Регистрация изменений для обмена данными", так как "битые" записи в этих таблицах также могут вызывать ошибки SDBL.
Если мы выяснили номер поля (в нашем примере fld10292) и знаем, что это реквизит Сумма, а удаление самих документов в режиме "Предприятие" не помогает, значит, проблема в самой структуре таблицы БД. Мы можем заставить платформу перестроить таблицу физически.
Рассмотрим алгоритм действий в Конфигураторе:
ЗаказКлиента новый реквизит Сумма_Временная с абсолютно такими же типами и точностью.
Выборка = Документы.ЗаказКлиента.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.Сумма_Временная = Объект.Сумма;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
КонецЦикла;
Сумма из конфигурации и применим изменения (обновим конфигурацию БД). В этот момент колонка fld10292 будет физически удалена из SQL-таблицы.Сумма заново и возвращаем в него данные из временного поля.Если база данных работает на MS SQL Server, мы можем точно увидеть, на каком именно запросе спотыкается система. Проанализируем ситуацию с помощью SQL Server Profiler:
SELECT ... WHERE fld10292 = ....Если в запросе фигурирует сравнение с чем-то необычным или обращение к несуществующему индексу, это подтвердит необходимость пересоздания индексов или всей таблицы.
Если выгрузка в XML проходит нормально (как указал автор вопроса), это наш "спасательный круг". Это означает, что сами данные валидны, но структура таблицы в текущем файле базы данных или SQL-базе безнадежно повреждена "хвостами" от прошлых обновлений.
Выполним следующие шаги:
.cf).ВыгрузкаЗагрузкаДанныхXML.epf (она входит в состав инструментов разработчика и обычно доступна на диске ИТС).Важный момент: При загрузке в новую базу платформа создаст все таблицы и индексы с нуля, игнорируя старые ошибки структуры. Это самый надежный способ полностью избавиться от проблем SDBL, когда другие методы бессильны.
Ошибка SDBL с литералом UNDEFINED чаще всего является следствием незавершенных транзакций обновления метаданных или конфликтов с расширениями. Рекомендуем всегда начинать с отключения расширений и очистки серверного кэша. Если же проблема кроется в конкретном поле таблицы, метод с временным реквизитом или полным перезаливом данных через XML гарантированно решит задачу и вернет базу в рабочее состояние.