К статье
Практический материал

Разработка и Конфигурация · 11 мин

SDBL в 1С: что это такое и как с ним работать

SDBL в 1С — что это за язык запросов, где встречается, чем отличается от SQL. Синтаксис, примеры запросов, ошибки и способы отладки для разработчиков.

SDBL (Structured Data Base Language) — это внутренний язык запросов платформы 1С:Предприятие, с помощью которого система обращается к данным информационной базы. Когда разработчик пишет запрос на встроенном языке 1С, платформа преобразует его в SDBL-представление, а затем транслирует в SQL-запросы к СУБД (MS SQL Server, PostgreSQL, Oracle, IBM DB2) или выполняет напрямую в файловом варианте базы.

Чаще всего с аббревиатурой SDBL разработчик сталкивается не по своей воле — а когда видит в тексте ошибки строку вида «Ошибка SDBL: ...» или «Поле не найдено "Таблица.Поле"». Понимание того, что это за язык и как платформа строит запросы, помогает быстро находить причину таких ошибок и писать эффективные запросы к данным.

Важно понимать: разработчик 1С практически никогда не пишет на SDBL напрямую — он работает с языком запросов 1С, похожим на SQL, но адаптированным под объектную модель метаданных. SDBL — это промежуточный слой между этим языком и реальной СУБД.

Где SDBL встречается на практике

Первый и самый частый случай — сообщения об ошибках. Если запрос содержит синтаксическую или логическую ошибку (несуществующее поле, неверный тип сравнения, ошибку в соединении таблиц), платформа выдаёт сообщение, начинающееся со слов «Ошибка SDBL» или «Ошибка при выполнении запроса». Текст такой ошибки указывает на конкретное место в запросе, которое не удалось обработать.

Второй случай — технологический журнал. При включении события DBMSSQL или SDBL в настройках технологического журнала можно увидеть, в какие SQL-конструкции платформа превратила запрос и сколько времени заняло выполнение. Это основной инструмент анализа производительности запросов на больших базах.

Третий случай — консоль запросов и отладка. При пошаговой отладке запроса в конфигураторе можно наблюдать, как платформа интерпретирует конструкции языка запросов, какие виртуальные таблицы реально обращаются к физическим таблицам СУБД и в каком порядке.

Как платформа преобразует запрос: цепочка выполнения

Путь запроса от кода до данных выглядит так. Разработчик формирует текст запроса на языке запросов 1С и передаёт его объекту «Запрос». Платформа разбирает текст, проверяет его по метаданным конфигурации и строит внутреннее представление — это и есть уровень SDBL. Затем слой работы с СУБД транслирует это представление в конкретный диалект SQL с учётом структуры физических таблиц.

На этом пути есть важное следствие: один и тот же запрос 1С может порождать разный SQL на разных СУБД. Платформа сама учитывает особенности MS SQL Server, PostgreSQL, Oracle или DB2, поэтому конфигурация остаётся переносимой между СУБД без переписывания запросов.

Файловый вариант базы — особый случай. Там нет внешней СУБД, и платформа выполняет SDBL-запросы собственным механизмом доступа к данным. Поэтому некоторые тяжёлые запросы в файловом варианте работают заметно медленнее, чем в клиент-серверном.

Как увидеть, что делает запрос
  1. 1
    Включите технологический журнал с событиями DBMSSQL и EXCP в файле logcfg.xml
  2. 2
    Выполните проблемный запрос в режиме предприятия или через консоль запросов
  3. 3
    Откройте лог и найдите событие с текстом SQL и длительностью выполнения
  4. 4
    Сопоставьте SQL-конструкции с исходным запросом 1С и найдите узкое место

Типичные ошибки SDBL и их причины

Сообщение «Поле не найдено» означает, что в запросе использовано поле, которого нет в таблице или псевдониме. Частые причины — опечатка в имени поля, обращение к полю через неверный псевдоним таблицы или использование реквизита, удалённого из конфигурации после написания запроса.

Ошибки несовместимости типов возникают при сравнении значений разных типов, например строки с числом, или при передаче параметра неподходящего типа. Платформа строго проверяет типы на этапе построения SDBL-представления, поэтому такие ошибки проявляются сразу при выполнении запроса, а не где-то глубже в коде.

Отдельная группа — ошибки в конструкциях соединений и виртуальных таблиц. Например, обращение к виртуальной таблице «Остатки» регистра накопления без указания обязательных параметров, или соединение, приводящее к неоднозначности полей. Текст ошибки SDBL обычно указывает номер строки запроса, что упрощает поиск.

Типичные ошибки при работе с запросами
01
Опечатка в имени поля или псевдонима — ошибка «Поле не найдено» при выполнении
02
Передача в параметр значения несовместимого типа — ошибка несоответствия типов
03
Соединение с виртуальной таблицей без отбора по измерениям — резкое падение производительности
04
Использование конструкций, специфичных для одной СУБД, через прямые SQL-вставки — потеря переносимости конфигурации
05
Игнорирование текста ошибки SDBL и правка кода «вслепую» — потеря времени на поиск причины

Как читать текст ошибки SDBL

Сообщение об ошибке обычно содержит три полезные части: описание проблемы, фрагмент запроса с указанием позиции и иногда внутренний код. Начинать разбор стоит с позиции — платформа указывает строку и место в запросе, где разбор остановился. Счёт ведётся по тексту запроса, включая переносы строк, поэтому удобно открыть запрос в консоли с нумерацией строк.

Далее смотрят на само описание. «Поле не найдено» — проверяют имена полей и псевдонимы в указанной строке. «Несовместимые типы» — проверяют типы сравниваемых выражений и параметров. «Ожидается выражение» — синтаксическая ошибка, чаще всего пропущенная запятая, скобка или ключевое слово.

Если текст ошибки не даёт ответа, запрос упрощают: убирают соединения и секции по одной, пока ошибка не исчезнет. Так локализуют проблемный фрагмент. Этот метод особенно эффективен для больших запросов с пакетами и временными таблицами.

Маршрут решения

Как выбрать действие по тексту ошибки

Ошибка «Поле не найдено» с указанием таблицыПроверьте имя поля в конфигураторе и псевдоним таблицы в запросе
Ошибка несовместимости типовПроверьте типы параметров и выражений в условии, приведите типы явно через ВЫРАЗИТЬ
Ошибка синтаксиса в начале запросаПроверьте ключевые слова ВЫБРАТЬ, ИЗ, ГДЕ и парность скобок
Запрос работает, но очень медленноВключите технологический журнал и проанализируйте план выполнения SQL

Отличия языка запросов 1С от классического SQL

Язык запросов 1С, который транслируется через SDBL, внешне похож на SQL, но работает с объектами метаданных, а не с физическими таблицами. Вместо имён таблиц базы данных используются имена объектов конфигурации: «Справочник.Номенклатура», «Документ.РеализацияТоваров», «РегистрНакопления.Продажи.Обороты». Платформа сама сопоставляет их с физическими структурами хранения.

Есть и функциональные отличия. В языке 1С доступны виртуальные таблицы (остатки, обороты, срезы последних), разыменование полей через точку, предопределённые функции работы с датами и представлениями, конструкция РАЗЛИЧНЫЕ, итоги и пакетные запросы с временными таблицами. Всё это преобразуется платформой в иногда весьма сложный SQL.

Обратное тоже верно: часть возможностей SQL недоступна напрямую. Нет произвольных оконных функций, рекурсивных запросов и прямого управления индексами. Это осознанное ограничение — платформа гарантирует переносимость и контролирует доступ к данным через механизм прав (RLS).

АспектЯзык запросов 1С (через SDBL)Классический SQL
Объекты обращенияОбъекты метаданных конфигурацииФизические таблицы и представления
Виртуальные таблицыВстроенные (остатки, обороты, срезы)Создаются вручную
Переносимость между СУБДПолная, обеспечивается платформойЗависит от диалекта
Контроль прав доступаВстроенный, включая RLSНастраивается средствами СУБД
Низкоуровневая оптимизацияОграниченаШирокие возможности

Когда стоит углубляться в SDBL и оптимизацию

Для большинства задач разработки достаточно знать язык запросов 1С и правила чтения ошибок. Углубление в уровень SDBL и генерируемого SQL оправдано в трёх ситуациях: при оптимизации медленных запросов на больших объёмах данных, при диагностике блокировок и взаимоблокировок в клиент-серверном варианте, при переносе конфигурации между СУБД.

Основные приёмы оптимизации на стороне 1С: использовать параметры виртуальных таблиц для отбора до соединения, избегать соединений с подзапросами без индексированных полей, применять временные таблицы для промежуточных результатов и не выбирать лишние поля. Каждый из этих приёмов напрямую влияет на то, какой SQL сгенерирует платформа.

Проверять результат оптимизации нужно замером: время выполнения запроса до и после изменения на реальных объёмах данных, а также анализ событий технологического журнала. Оптимизация «на глаз» без замеров часто не даёт эффекта или даже ухудшает ситуацию.

Контрольные точки

Как проверить результат оптимизации запроса

Время выполнения запроса
Норма

Сократилось при повторных замерах на тех же данных

Тревожный признак

Не изменилось или выросло

Текст SQL в технологическом журнале
Норма

Используются отборы по индексированным полям, нет полных сканирований больших таблиц

Тревожный признак

Многократные соединения без отборов, сканирование виртуальных таблиц целиком

Корректность результата
Норма

Данные после оптимизации совпадают с исходным вариантом

Тревожный признак

Потеряны строки или изменились итоги

FAQ: частые вопросы о SDBL в 1С

Можно ли писать запросы напрямую на SDBL?

Нет. SDBL — внутренний формат платформы, у него нет документированного интерфейса для разработчика. Весь код пишется на языке запросов 1С, а SDBL-представление платформа строит сама. Знание о нём нужно только для диагностики ошибок и анализа производительности.

Что делать, если ошибка SDBL появляется только у одного пользователя?

Проверьте права доступа: при включённом RLS платформа добавляет в запрос дополнительные условия, и ошибка может возникать только при определённом наборе ролей. Также сравните версии платформы на рабочих местах — различия в поведении запросов между релизами иногда проявляются именно так.

Чем отличается ошибка SDBL от ошибки СУБД?

Ошибка SDBL возникает на уровне платформы при разборе и построении запроса — до обращения к базе. Ошибка СУБД (в тексте обычно упоминается SQL Server, PostgreSQL и т.д.) означает, что запрос дошёл до базы, но был отвергнут ею: например, из-за взаимоблокировки, превышения таймаута или нехватки места.

Как найти медленный запрос в большой системе?

Включите технологический журнал с событием DBMSSQL и порогом длительности, затем проанализируйте лог: события с большим временем выполнения содержат текст SQL и контекст. По контексту находят соответствующий запрос в коде конфигурации и оптимизируют именно его.

Влияет ли СУБД на текст ошибок SDBL?

Ошибки уровня SDBL одинаковы для всех СУБД, так как возникают до обращения к базе. Различия проявляются в ошибках самой СУБД и в производительности: один и тот же запрос может генерировать разный SQL и вести себя по-разному на MS SQL Server и PostgreSQL.

Нужно ли знать SQL разработчику 1С?

Для повседневной разработки достаточно языка запросов 1С. Базовое понимание SQL становится полезным при оптимизации запросов, анализе технологического журнала и работе с большими базами в клиент-серверном варианте — там видно, как платформа транслирует конструкции и где возникают узкие места.

Итог

Что важно запомнить

SDBL — внутренний язык запросов платформы 1С, промежуточный слой между языком запросов разработчика и SQL конкретной СУБД. Напрямую на нём не программируют: знание о нём нужно для чтения ошибок «Ошибка SDBL», анализа технологического журнала и оптимизации запросов. Изменять данные в обход платформы напрямую в СУБД нельзя.