Ошибки семейства SDBL (Simple Data Base Language) являются одними из самых сложных для диагностики, так как они возникают на уровне внутреннего транслятора запросов 1С, который преобразует высокоуровневый код платформы в низкоуровневые SQL-запросы. В данной статье мы подробно разберем ситуацию, когда при отмене проведения документа «Платежное поручение исходящее» (особенно в конфигурации Зарплата и Управление Персоналом) возникает сбой парсинга запроса или ошибка типов системных полей. Мы проанализируем причины возникновения этих проблем и разработаем пошаговый план восстановления работоспособности базы данных.
Разберем, что именно происходит в системе. Ошибка SDBL: пропущена точка с запятой (pos = 1365) говорит о том, что механизм генерации SQL-текста допустил синтаксическую ошибку. Позиция 1365 указывает на конкретный символ в сформированном запросе, который SQL-сервер не смог обработать. Чаще всего это происходит из-за некорректной работы платформы с итогами регистров или при попытке удаления записей из множества связанных таблиц при отмене проведения документа.
Вторая ошибка, Поле ID имеет тип REF Self или RowVersion, выявляемая при выполнении Тестирования и исправления (ТИИ), свидетельствует о более глубокой проблеме — физическом несоответствии описания метаданных в конфигурации и реальной структуры таблиц в MS SQL Server. Поле RowVersion — это системное поле SQL, используемое для контроля версий строк, и если 1С начинает интерпретировать его как обычное поле данных, это приводит к критическому сбою.
Прежде чем приступать к радикальным мерам, рассмотрим самый простой и часто эффективный метод — полную очистку кэша сервера приложений. Ошибки SDBL часто вызываются «демоническим» (динамическим) обновлением, когда старые описания таблиц остаются в памяти сервера.
Выполним следующие действия по шагам:
C:\Program Files\1cv8\srvinfo).reg_1541 (или других портов) найдем каталоги с именами формата snccnt... и папки с GUID баз данных.srvinfo сбросит список баз в консоли администрирования, если вы удалите файлы конфигурации кластера, поэтому удаляйте только временные кэш-директории.Проанализируем состояние базы данных с помощью штатных средств. Если база серверная, утилита chdbfl.exe напрямую к ней не применима, но мы можем использовать её для проверки файловой копии. Для серверной базы основным инструментом будет Тестирование и исправление в режиме Конфигуратора.
При запуске ТИИ обязательно выберем следующие пункты:
REF Self и RowVersion).Если в процессе реструктуризации система снова выдает ошибку SDBL, значит, платформа не может корректно перестроить таблицу из-за критического несоответствия типов.
Посмотрим на метод, который считается «золотым стандартом» решения проблем SDBL. Выгрузка в файл .dt и последующая загрузка в новую чистую базу SQL полностью пересоздает структуру всех таблиц.
Проанализируем алгоритм:
.dt в новую базу.В момент загрузки 1С формирует таблицы SQL с нуля, основываясь на текущих метаданных конфигурации. Это устраняет любые накопленные ошибки в структуре таблиц и системных полях RowVersion.
Если ошибка возникает только при работе с конкретным документом (например, ПлатежноеПоручениеИсходящее), мы можем попробовать заставить платформу пересоздать только таблицу этого объекта. Выясним, как это сделать без полной выгрузки базы.
Разберем порядок действий:
ПлатежноеПоручениеИсходящее.ТехническийРеквизит с типом Число.Этот метод часто помогает, если проблема локализована в конкретном объекте метаданных.
Важно помнить, что версия 8.3.10.2699 является достаточно старой. В этой ветке были зафиксированы ошибки в работе механизма SDBL при генерации сложных запросов к вложенным таблицам и при расчете итогов. Если вышеуказанные меры не помогают, необходимо рассмотреть обновление платформы до актуальных релизов (например, ветки 8.3.22 или выше).
Новые версии платформы содержат исправления для транслятора запросов, которые предотвращают ошибку пропущена точка с запятой, оптимизируя длину и структуру SQL-кода, отправляемого на сервер.
Если мы имеем дело с повреждением на уровне страниц данных, стоит проверить саму базу средствами СУБД. Выполним в SQL Management Studio следующий запрос для анализа физической целостности:
DBCC CHECKDB ('ИмяВашейБазы') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Если команда вернет ошибки, проблему следует решать средствами SQL (например, через REPAIR_ALLOW_DATA_LOSS), но только в самом крайнем случае и после создания полной копии файлов .mdf и .ldf.
Подводя итог, можно сказать, что наиболее эффективным решением для устранения ошибок SDBL является комбинация очистки серверного кэша и перезагрузки данных через формат .dt. Это позволяет синхронизировать логическую структуру 1С с физической структурой SQL-таблиц и устранить конфликты типов системных полей.