Как исправить ошибку Incorrect syntax near dbo при выполнении запроса к внешнему источнику данных в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Механизм внешних источников данных (ВИД) в платформе 1С:Предприятие позволяет напрямую взаимодействовать с таблицами сторонних реляционных баз данных через ODBC-драйверы. Однако на этапе выполнения запросов к добавленным таблицам разработчики нередко сталкиваются с ошибками синтаксиса СУБД, в частности: «Ошибка 170. Incorrect syntax near 'dbo'» или «Incorrect syntax near '!'». При этом проверка подключения и добавление структуры таблиц в конфигураторе могут проходить успешно. Разберем по шагам, почему возникает эта ошибка и как ее исправить.

Рассмотрим типичный пример ситуации. В конфигураторе добавлен внешний источник данных к MS SQL Server, добавлена таблица Материалы, и выполняется простой запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |	1 КАК Поле1
    |ИЗ
    |	ВнешнийИсточникДанных.БД.Таблица.Материалы КАК Материалы";
Результат = Запрос.Выполнить();

При выполнении такого кода платформа возвращает синтаксическую ошибку от сервера MS SQL. Проанализируем природу этого поведения и способы его устранения.

Причина 1. Некорректное указание схемы в свойстве «Имя в источнике данных»

Основная причина ошибки «Incorrect syntax near 'dbo'» кроется в механизме трансляции запросов платформы 1С в нативный SQL-диалект. Когда мы указываем в метаданных таблицы внешнего источника данных имя с точкой (например, dbo.materials), платформа 1С пытается экранировать спецсимволы.

Если строка содержит точку и не обрамлена одинарными кавычками, платформа при формировании внутреннего SQL-запроса оборачивает всё выражение в двойные кавычки: "dbo.materials". Для MS SQL Server идентификатор в двойных кавычках воспринимается как единое монолитное имя объекта в текущей схеме, а не как таблица materials внутри схемы dbo. Это приводит к некорректной интерпретации синтаксиса парсером СУБД.

Для исправления ситуации выполним следующие шаги:

  1. Откроем свойства нужной таблицы внешнего источника данных в дереве метаданных конфигуратора.
  2. Найдем поле «Имя в источнике данных» на вкладке «Основные» или «Данные».
  3. Уберем префикс схемы dbo., оставив только физическое имя таблицы — например, просто materials вместо dbo.materials.
  4. Убедимся, что для пользователя SQL Server, под которым выполняется подключение, схема dbo назначена схемой по умолчанию (Default Schema), а также выданы права на чтение (SELECT) данной таблицы.

Если таблица находится в нестандартной схеме и указание схемы строго обязательно, имя объекта в поле «Имя в источнике данных» необходимо экранировать одинарными кавычками по правилам платформы: 'dbo'.'materials'.

Причина 2. Неверно заданный тип СУБД в параметрах соединения

При формировании запросов платформа 1С транслирует внутренние конструкции (такие как ВЫБРАТЬ ПЕРВЫЕ 10) в конструкции конкретной базы данных. Для MS SQL Server это транслируется в конструкцию SELECT TOP 10. Если тип целевой СУБД не определен, платформа генерирует стандартный ANSI SQL запрос, вызывающий ошибку синтаксиса.

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


ПараметрыПодключения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыПодключения.СтрокаСоединения = "DRIVER={SQL Server};SERVER=sql_server_name;UID=user;PWD=password;DATABASE=test_db;";
ПараметрыПодключения.СУБД = "MSSQLServer";

ВнешниеИсточникиДанных.БД.УстановитьОбщиеПараметрыСоединения(ПараметрыПодключения);
ВнешниеИсточникиДанных.БД.УстановитьСоединение();

Обратим внимание на точное строковое значение: для Microsoft SQL Server необходимо указывать "MSSQLServer". Неверное или пустое значение приводит к сбоям синтаксиса уже на стороне драйвера.

Причина 3. Несовпадение разрядности клиента и сервера (32/64 bit)

Часто в процессе разработки возникает ситуация: в конфигураторе мастер успешно подключается к базе и считывает список таблиц, а в режиме «1С:Предприятие» соединение зависает или завершается аварийно. Выясним причину такого расхождения:

  1. Разрядность процессов: Конфигуратор 1С часто запускается как 32-битное приложение, в то время как сервер 1С:Предприятия работает в 64-битной среде. Для работы обоих приложений на сервере должны быть установлены соответствующие ODBC-драйверы (и 32-разрядный, и 64-разрядный).
  2. Тип DSN: Если в строке подключения используется DSN, он должен быть настроен как Системный DSN (System DSN), а не Пользовательский (User DSN). Служба сервера 1С стартует от имени системного пользователя (например, usr1cv8), который не имеет доступа к источникам данных из профиля администратора.
  3. Интерактивные окна: Зависание при вызове метода УстановитьСоединение() часто связано с тем, что драйвер ODBC пытается вывести модальное диалоговое окно запроса пароля или ошибки в невидимую системную сессию (Session 0). Строка подключения должна содержать все параметры аутентификации в явном виде.

Причина 4. Отсутствие первичного ключа и неподдерживаемые типы данных

Если ошибка возникает при попытке открыть динамический список или форму таблицы внешнего источника в режиме предприятия (например, «Incorrect syntax near '!'»), проверим структуру реквизитов:

  1. Таблица внешнего источника данных в 1С обязательно должна иметь хотя бы одно поле, назначенное первичным ключом. Без этого платформа не может построить постраничную выборку и позиционирование курсора.
  2. В составе полей не должно быть неподдерживаемых платформой сложных типов данных (например, hierarchyid, geometry, geography, xml, а также устаревших text и image). Поля с такими типами данных следует удалить из состава реквизитов таблицы в конфигураторе.

Альтернативное решение: создание представления (VIEW)

Если таблица в источнике имеет сложную структуру, имена с точками, спецсимволами или требует специфических прав доступа, наиболее надежным решением является создание представления на стороне SQL Server:


CREATE VIEW dbo.v_Materials AS
SELECT 
    Id,
    Code,
    Name
FROM dbo.materials;

После создания представления подключим в 1С объект v_Materials. В свойстве «Имя в источнике данных» укажем простое имя v_Materials без указания схем. Это исключает любые синтаксические конфликты при трансляции запросов платформой 1С.

← На главную