Механизм внешних источников данных (ВИД) в платформе 1С:Предприятие позволяет напрямую взаимодействовать с таблицами сторонних реляционных баз данных через ODBC-драйверы. Однако на этапе выполнения запросов к добавленным таблицам разработчики нередко сталкиваются с ошибками синтаксиса СУБД, в частности: «Ошибка 170. Incorrect syntax near 'dbo'» или «Incorrect syntax near '!'». При этом проверка подключения и добавление структуры таблиц в конфигураторе могут проходить успешно. Разберем по шагам, почему возникает эта ошибка и как ее исправить.
Рассмотрим типичный пример ситуации. В конфигураторе добавлен внешний источник данных к MS SQL Server, добавлена таблица Материалы, и выполняется простой запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| 1 КАК Поле1
|ИЗ
| ВнешнийИсточникДанных.БД.Таблица.Материалы КАК Материалы";
Результат = Запрос.Выполнить();
При выполнении такого кода платформа возвращает синтаксическую ошибку от сервера MS SQL. Проанализируем природу этого поведения и способы его устранения.
Основная причина ошибки «Incorrect syntax near 'dbo'» кроется в механизме трансляции запросов платформы 1С в нативный SQL-диалект. Когда мы указываем в метаданных таблицы внешнего источника данных имя с точкой (например, dbo.materials), платформа 1С пытается экранировать спецсимволы.
Если строка содержит точку и не обрамлена одинарными кавычками, платформа при формировании внутреннего SQL-запроса оборачивает всё выражение в двойные кавычки: "dbo.materials". Для MS SQL Server идентификатор в двойных кавычках воспринимается как единое монолитное имя объекта в текущей схеме, а не как таблица materials внутри схемы dbo. Это приводит к некорректной интерпретации синтаксиса парсером СУБД.
Для исправления ситуации выполним следующие шаги:
dbo., оставив только физическое имя таблицы — например, просто materials вместо dbo.materials.dbo назначена схемой по умолчанию (Default Schema), а также выданы права на чтение (SELECT) данной таблицы.Если таблица находится в нестандартной схеме и указание схемы строго обязательно, имя объекта в поле «Имя в источнике данных» необходимо экранировать одинарными кавычками по правилам платформы: 'dbo'.'materials'.
При формировании запросов платформа 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". Неверное или пустое значение приводит к сбоям синтаксиса уже на стороне драйвера.
Часто в процессе разработки возникает ситуация: в конфигураторе мастер успешно подключается к базе и считывает список таблиц, а в режиме «1С:Предприятие» соединение зависает или завершается аварийно. Выясним причину такого расхождения:
usr1cv8), который не имеет доступа к источникам данных из профиля администратора.УстановитьСоединение() часто связано с тем, что драйвер ODBC пытается вывести модальное диалоговое окно запроса пароля или ошибки в невидимую системную сессию (Session 0). Строка подключения должна содержать все параметры аутентификации в явном виде.Если ошибка возникает при попытке открыть динамический список или форму таблицы внешнего источника в режиме предприятия (например, «Incorrect syntax near '!'»), проверим структуру реквизитов:
hierarchyid, geometry, geography, xml, а также устаревших text и image). Поля с такими типами данных следует удалить из состава реквизитов таблицы в конфигураторе.Если таблица в источнике имеет сложную структуру, имена с точками, спецсимволами или требует специфических прав доступа, наиболее надежным решением является создание представления на стороне SQL Server:
CREATE VIEW dbo.v_Materials AS
SELECT
Id,
Code,
Name
FROM dbo.materials;
После создания представления подключим в 1С объект v_Materials. В свойстве «Имя в источнике данных» укажем простое имя v_Materials без указания схем. Это исключает любые синтаксические конфликты при трансляции запросов платформой 1С.