При интеграции 1С с реляционными СУБД с помощью механизма Внешние источники данных разработчики нередко сталкиваются с ситуацией, когда чтение и первичное добавление записей проходят успешно, но при попытке изменить существующую строку или удалить её возникает ошибка:
Ошибка ODBC. SQLSTATE: 42000. Номер ошибки: 102. Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'T1'.
Разберем детально, почему возникает данный сбой, как работает механизм генерации запросов платформы и какие способы позволяют полностью устранить проблему.
Проанализируем механику работы платформы 1С с внешними СУБД. При выполнении операций обновления (UPDATE) и удаления (DELETE) платформа генерирует специфические конструкции T-SQL с псевдонимами таблиц (например, UPDATE T1 SET ... FROM Table T1 или запросы с директивой OUTPUT). Это необходимо для контроля версий строк и блокировок.
Основными источниками ошибки являются:
DRIVER={SQL Server} ссылается на стандартный системный драйвер Windows MDAC (SQLSRV32.DLL). Этот драйвер был разработан для устаревших версий SQL Server и не поддерживает современный синтаксис T-SQL, который транслирует платформа.WHERE для целевой записи.Рассмотрим основной и наиболее эффективный способ решения проблемы — переход на современный официальный драйвер от Microsoft (ODBC Driver for SQL Server или SQL Server Native Client).
В строке подключения внешнего источника данных необходимо заменить DRIVER={SQL Server} на актуальный драйвер, установленный в операционной системе:
DRIVER={ODBC Driver 17 for SQL Server};SERVER=.\SQLEXPRESS;DATABASE=aaa;UID=sa;PWD=12345;DRIVER={ODBC Driver 18 for SQL Server};SERVER=.\SQLEXPRESS;DATABASE=aaa;UID=sa;PWD=12345;TrustServerCertificate=yes;DRIVER={SQL Server Native Client 11.0};SERVER=.\SQLEXPRESS;DATABASE=aaa;UID=sa;PWD=12345;Если аутентификация в SQL Server выполняется под текущей учетной записью Windows, можно применить доверенное соединение, указав Trusted_Connection=yes вместо параметров UID и PWD.
Посмотрим на пример программной установки параметров и типа СУБД во встроенном языке 1С. Это позволяет динамически задавать актуальный драйвер и исключать синтаксические конфликты при выполнении операций записи:
ПараметрыСоединения = ВнешниеИсточникиДанных.ИмяИсточника.ПолучитьОбщиеПараметрыПодключения();
ПараметрыСоединения.ТипСУБД = "MSSQLServer";
ПараметрыСоединения.СтрокаСоединения = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=.\SQLEXPRESS;DATABASE=aaa;UID=sa;PWD=12345;";
ПараметрыСоединения.АутентификацияСтандартная = Истина;
ВнешниеИсточникиДанных.ИмяИсточника.УстановитьОбщиеПараметрыПодключения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ИмяИсточника.УстановитьСоединение();
Разберем по шагам, какие свойства необходимо проверить в дереве метаданных 1С:
PRIMARY KEY) или уникальным индексом в таблице MS SQL.UPDATE.При настройке внешних источников данных обратите внимание на следующие ключевые моменты:
%windir%\SysWOW64\odbcad32.exe). Для 64-разрядного сервера 1С требуется 64-битный драйвер (%windir%\System32\odbcad32.exe).DBODBC в файле logcfg.xml. Это позволит увидеть сформированный запрос и локализовать ошибку синтаксиса.