При работе в конфигурации 1С:Управление нашей фирмой (УНФ) пользователи и разработчики часто сталкиваются с труднодиагностируемыми ошибками уровня платформы. Одной из самых неприятных является ошибка SDBL: Ожидается выражение (pos=15). Она возникает внезапно: при попытке записать новый элемент справочника Номенклатура, при изменении существующих позиций или во время регламентной операции удаления помеченных объектов. Давайте детально разберем природу этой проблемы и пошагово выясним, как вернуть систему в рабочее состояние.
Аббревиатура SDBL (Simple Data Base Layer) обозначает внутренний слой платформы «1С:Предприятие», который отвечает за трансляцию запросов с языка 1С на язык SQL (будь то MS SQL Server или PostgreSQL). Когда платформа сообщает об ошибке с указанием позиции (pos=15), это означает, что на этапе генерации низкоуровневого запроса произошел синтаксический сбой. Позиция 15 — это самое начало запроса, обычно сразу после операторов SELECT, INSERT INTO или FROM. Это сигнализирует о том, что платформа «потеряла» описание структуры данных и не может корректно сформировать обращение к таблице БД.
Проанализируем основные причины и методы решения этой проблемы.
Как показывает практика и обсуждения на технических форумах, ошибка SDBL: Ожидается выражение в большинстве случаев является «багом» конкретных релизов платформы. Особенно часто она проявлялась в версиях ветки 8.3.10 (например, 8.3.10.2650).
Разберем алгоритм действий:
В современных версиях УНФ активно используются расширения. Если в расширении вы добавили собственные реквизиты к справочнику Номенклатура или изменили типы существующих полей, может возникнуть рассинхронизация метаданных. Платформа в памяти хранит одну структуру таблицы, а в СУБД — другую.
Для диагностики выполним следующие действия:
Рассинхронизация кэша — классическая причина ошибок SDBL. Платформа пытается обратиться к полям таблицы, которых уже (или еще) не существует в кэшированном описании объектов.
Рассмотрим процесс правильной очистки кэша для серверной версии:
C:\Program Files\1cv8\srvinfo).snacc и config (будьте осторожны, не удаляйте файлы самой БД).Для клиентской части очистку можно выполнить, просто удалив базу из списка в стартере 1С и добавив ее заново под тем же путем.
При записи номенклатуры в УНФ система автоматически пытается обновить индекс полнотекстового поиска (ПП). Если индекс поврежден, процедура записи прерывается ошибкой SDBL на этапе формирования запроса к служебным таблицам поиска.
Проанализируем ситуацию через консоль управления:
Если проблема кроется в логической целостности базы, поможет стандартная процедура ТиИ в «Конфигураторе». Рассмотрим наиболее важные опции для нашего случая:
Перед запуском ТиИ обязательно создайте резервную копию базы данных!
Если ошибка возникает только у обычных пользователей, но не проявляется у администратора с полными правами, причина в RLS (Record Level Security). Платформа динамически дописывает к вашему запросу условия WHERE, основываясь на шаблонах ограничений. Если шаблон содержит ошибку или несовместим с текущей версией платформы, возникает сбой pos=15.
Посмотрим, как это проверить:
Разберем, как найти конкретное место в коде, вызывающее ошибку, если она происходит при программной записи. Рассмотрим пример кода:
// Пример вызова записи номенклатуры
ТекНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
ТекНоменклатура.Наименование = "Тестовый товар";
// Установим дополнительные реквизиты, если они обязательны
Попытка
ТекНоменклатура.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОшибкаЗаписи", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
Проанализируем поведение системы в отладчике. Часто ошибка возникает не в самой строке Записать(), а в подписках на события (например, ПередЗаписью или ПриЗаписи), где выполняются дополнительные запросы к характеристикам или регистрам сведений. Пройдите по шагам (F11) внутрь процедуры Записать(), чтобы увидеть, на каком именно вспомогательном запросе «спотыкается» SDBL.
Подводя итог, можно сказать, что ошибка SDBL (pos=15) — это сигнал о несоответствии ожидаемой и реальной структуры данных. Начните с обновления платформы и очистки кэша — в 90% случаев это полностью решает проблему в УНФ.