Как устранить ошибку «Недопустимое соединение» при выполнении SQL-запроса из 1С через ADO?

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

Работа с внешними базами данных через механизмы ADO (ActiveX Data Objects) — стандартная задача для разработчика 1С, когда требуется получить данные напрямую из SQL-сервера, минуя объектную модель платформы. Однако на этапе установления связи часто возникают ошибки типа «Недопустимое соединение» или «Нет поименованных аргументов». В этой статье мы подробно разберем причины этих проблем и выработаем надежный алгоритм подключения.

Разберем причину №1: Разрядность драйверов (x86 vs x64)

Проанализируем самую распространенную ситуацию. Платформа 1С может быть как 32-битной, так и 64-битной. Это критически важно, так как COM-объект ADO использует драйверы ODBC или OLE DB, установленные в операционной системе. Если ваша консоль 1С или сервер 1С, на котором выполняется код, имеет разрядность 32 бит (x86), то и драйвер SQL Server должен быть настроен через 32-битный менеджер источников данных.

Выясним, как это проверить. На 64-битных версиях Windows существует два разных конфигуратора ODBC:

  1. Для 64-битных приложений: C:\Windows\System32\odbcad32.exe
  2. Для 32-битных приложений: C:\Windows\SysWOW64\odbcad32.exe

Если вы запускаете код в 32-битном клиенте 1С, а драйвер {SQL Server} настроен только для 64-бит, вы неизбежно получите ошибку о недопустимом соединении. Убедитесь, что нужный драйвер виден именно в той версии утилиты odbcad32.exe, которая соответствует разрядности вашего приложения 1С.

Разберем причину №2: Синтаксис строки подключения и параметр Table

Посмотрим на попытку автора темы конкретизировать подключение с помощью параметра Table=dbo.sp;. Проанализируем этот момент: в стандартных спецификациях Microsoft SQL Server ODBC Driver или OLE DB Provider параметра Table не существует. Попытка передать его в строке подключения приводит к тому, что драйвер либо игнорирует его, либо выдает ошибку синтаксиса.

Права доступа в SQL Server реализуются на уровне пользователя базы данных, а не на уровне строки подключения. Если пользователю разрешен доступ только к одной таблице, это настраивается внутри SQL Management Studio командой GRANT SELECT ON [dbo].[sp] TO [user]. В строке подключения из 1С мы всегда указываем только сервер и базу данных (Initial Catalog).

Выбор правильного провайдера: ODBC vs OLE DB

Рассмотрим два основных способа формирования строки подключения. Для работы из 1С через ADODB.Connection чаще рекомендуется использовать провайдер OLE DB, так как он более нативен для COM-технологий Windows и часто работает быстрее.

Вариант 1: Использование SQLOLEDB (OLE DB Provider)

Это наиболее стабильный вариант для 1С. Разберем пример кода:


Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB;Data Source=sql\mssqlserver;Initial Catalog=db528;User ID=myUser;Password=myPassword;";
Попытка
    Соединение.Open(СтрокаПодключения);
    Сообщить("Соединение успешно установлено!");
Исключение
    Сообщить("Ошибка при подключении: " + ОписаниеОшибки());
КонецПопытки;

Вариант 2: Использование ODBC Driver

Если вы предпочитаете использовать драйвер ODBC, убедитесь, что указываете актуальную версию драйвера. Вместо устаревшего {SQL Server} лучше использовать {SQL Server Native Client 11.0} или {ODBC Driver 17 for SQL Server}.


СтрокаПодключения = "Driver={ODBC Driver 17 for SQL Server};Server=sql\mssqlserver;Database=db528;UID=myUser;PWD=myPassword;TrustServerCertificate=yes;";

Обратите внимание на параметр TrustServerCertificate=yes;. В современных версиях драйверов он необходим, если на SQL-сервере не настроен доверенный SSL-сертификат, иначе соединение будет сброшено по соображениям безопасности.

Анализируем ошибку «Нет поименованных аргументов»

Рассмотрим ситуацию, когда 1С выдает ошибку «нет поименованных аргументов» при попытке обращения к методам Open или ActiveConnection. В контексте работы с COMОбъект это часто означает, что объект не может корректно интерпретировать передаваемые параметры из-за того, что само соединение не было инициализировано.

Проанализируем правильную последовательность действий для выполнения запроса:

  1. Создаем объект Connection.
  2. Открываем его с правильной строкой подключения.
  3. Создаем объект Command или Recordset.
  4. Передаем объект соединения в свойство ActiveConnection.

Пример правильной реализации:


Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);

Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection; // Передаем объект, а не строку!
Command.CommandText = "SELECT * FROM dbo.sp";

RecordSet = Command.Execute();
Пока RecordSet.EOF() = 0 Цикл
    // Обработка данных
    RecordSet.MoveNext();
КонецЦикла;
Connection.Close();

Проверка сетевых настроек SQL Server

Если строка подключения верна, но «Недопустимое соединение» сохраняется, выясним причину в настройках самого сервера. По умолчанию MS SQL Server может принимать только локальные соединения через Shared Memory.

Выполним следующие шаги:

Итоги и рекомендации

Подведем итоги нашего исследования. Для успешного подключения из 1С к SQL-серверу через ADO необходимо соблюдать три правила:

  1. Соответствие разрядности: Используйте драйверы той же битности, что и ваше приложение 1С.
  2. Корректный провайдер: Рекомендуется использовать Provider=SQLOLEDB как наиболее совместимый.
  3. Полные права в базе: Убедитесь, что у пользователя SQL есть права CONNECT на базу данных и SELECT на конкретную таблицу.

Проанализировав все варианты, мы видим, что использование Внешних источников данных (стандартный механизм платформы 1С) часто является более предпочтительным, так как платформа сама управляет драйверами и пулом соединений. Однако, если вам необходим именно ADO, следуйте приведенным выше инструкциям по формированию строки подключения.

← На главную