При переходе на новые релизы платформы 1С:Предприятие 8.3, в частности на ветку 8.3.15, системные администраторы и разработчики часто сталкиваются с критической ошибкой механизма SDBL. Ошибка проявляется сообщением: "Ошибка SDBL: Ожидается CREATE, DROP, RENAME, REPLACE или SELECT (pos=0)". Особенно остро эта проблема встает при выполнении регламентных операций, таких как пересчет итогов регистров накопления или реструктуризация информационной базы. В данной статье мы подробно разберем природу этого сбоя и рассмотрим пошаговые методы его устранения.
Для начала выясним причину возникновения подобного сообщения. SDBL (Simple Data Base Layer) — это внутренний язык запросов платформы 1С, который служит прослойкой между объектной моделью метаданных и физическими таблицами СУБД (MS SQL Server, PostgreSQL и др.). Когда платформа обращается к данным, она сначала формирует запрос на языке SDBL, а затем транслирует его в SQL-запрос, понятный конкретной СУБД.
Указание на pos=0 (позиция 0) означает, что парсер SDBL получил пустой или абсолютно некорректный запрос в самом начале формирования команды. В контексте перехода на релиз 8.3.15.1830 это чаще всего связано с тем, что механизмы контроля целостности метаданных стали более строгими. Если в таблице DBSchema (внутренняя таблица базы данных, хранящая структуру) имеются устаревшие идентификаторы или несоответствия, платформа "спотыкается" при попытке построить дерево запроса для пересчета итогов.
Рассмотрим подробнее основные причины:
Проанализируем ситуацию: если ошибка возникает на конкретном регистре (например, ВзаиморасчетыСКонтрагентами), первым делом стоит заставить платформу полностью пересобрать структуру этого объекта. Простого запуска "ТиИ" (Тестирование и исправление) иногда недостаточно, так как система может считать структуру актуальной.
Выполним следующие шаги:
Булево) и произвольным именем ВременныйРеквизит.ALTER TABLE на уровне SQL.Этот нехитрый прием заставляет систему заново сгенерировать все внутренние идентификаторы объекта в таблице DBSchema. Однако, как показывает практика, на релизах 8.3.15 этот метод помогает не всегда, и тогда следует перейти к более глубокой очистке.
Разберем ситуацию, когда ошибка "залипает" в оперативной памяти сервера приложений. Обычная перезагрузка службы 1C:Enterprise 8.3 Server Agent часто не очищает временные файлы, расположенные в каталоге кластера.
Проанализируем алгоритм правильной очистки:
C:\Program Files\1cv8\srvinfo).reg_1541 (или другого порта) найдем папку с GUID вашей информационной базы.snccntx (сеансовые данные) и все файлы с расширением .tmp.Local\1C и Roaming\1C).Выясним, не влияет ли механизм разделения итогов на формирование ошибки SDBL. В высоконагруженных системах свойство РазделениеИтогов позволяет избежать блокировок, но оно же усложняет структуру таблиц итогов.
Рассмотрим последовательность действий:
Администрирование -> Тестирование и исправление (выбрав пункт "Пересчет итогов").Если вышеперечисленные методы не помогли, нам придется выяснить, какой именно запрос вызывает сбой. Для этого настроим технологический журнал (ТЖ).
Создадим файл logcfg.xml в каталоге conf сервера 1С со следующим содержанием:
<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
<log location="C:\LOGS\SDBL" history="24">
<event>
<eq property="name" value="SDBL"/>
</event>
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
После появления ошибки проанализируем лог-файлы. Мы ищем событие SDBL, которое предшествует событию EXCP (исключение). В тексте события будет виден текст запроса на внутреннем языке 1С. Если текст запроса пустой или содержит странные символы, это подтверждает повреждение структуры метаданных в SQL-таблице Config или DBSchema.
Посмотрим на самый радикальный, но зачастую самый эффективный метод — "пересоздание базы". Поскольку ошибка SDBL часто связана с "мусором" в системных таблицах SQL-базы, перенос данных в новую чистую базу позволяет полностью обновить структуру DBSchema.
Выполним по шагам:
.dt (Администрирование -> Выгрузить информационную базу)..dt в новую базу.Примечание: Этот метод заставляет 1С пересоздать все индексы и служебные таблицы с нуля, игнорируя старые ошибки трансляции SDBL.
Наконец, проанализируем программную среду. Релиз 8.3.15.1830 известен рядом ошибок, связанных с работой 32-битных серверов и механизмов SDBL. В более поздних исправлениях ветки 8.3.15 (например, 8.3.15.2107) и последующих ветках 8.3.16/8.3.18 многие из этих проблем были устранены.
Если ваша конфигурация (в данном случае УТ 10.3) позволяет, настоятельно рекомендуется выполнить переход на более стабильный релиз платформы. При этом не забудьте проверить режим совместимости конфигурации — он должен соответствовать тому, который рекомендует фирма "1С" для вашей версии программы. Для УТ 10.3 на современных платформах часто используется режим совместимости 8.2.13 или 8.2.16, но иногда его повышение до 8.3.12 или 8.3.14 помогает стабилизировать работу SDBL.
Подводя итог, отметим: ошибка SDBL pos=0 — это сигнал о том, что логическая структура базы данных в понимании 1С разошлась с физической реализацией в СУБД. Начните с очистки кэша и реструктуризации объекта, а если это не поможет — используйте метод с пересозданием базы через .dt или обновление платформы.