Работа с внешними базами данных через механизмы ADO (ActiveX Data Objects) — стандартная задача для разработчика 1С, когда требуется получить данные напрямую из SQL-сервера, минуя объектную модель платформы. Однако на этапе установления связи часто возникают ошибки типа «Недопустимое соединение» или «Нет поименованных аргументов». В этой статье мы подробно разберем причины этих проблем и выработаем надежный алгоритм подключения.
Проанализируем самую распространенную ситуацию. Платформа 1С может быть как 32-битной, так и 64-битной. Это критически важно, так как COM-объект ADO использует драйверы ODBC или OLE DB, установленные в операционной системе. Если ваша консоль 1С или сервер 1С, на котором выполняется код, имеет разрядность 32 бит (x86), то и драйвер SQL Server должен быть настроен через 32-битный менеджер источников данных.
Выясним, как это проверить. На 64-битных версиях Windows существует два разных конфигуратора ODBC:
C:\Windows\System32\odbcad32.exeC:\Windows\SysWOW64\odbcad32.exeЕсли вы запускаете код в 32-битном клиенте 1С, а драйвер {SQL Server} настроен только для 64-бит, вы неизбежно получите ошибку о недопустимом соединении. Убедитесь, что нужный драйвер виден именно в той версии утилиты odbcad32.exe, которая соответствует разрядности вашего приложения 1С.
Посмотрим на попытку автора темы конкретизировать подключение с помощью параметра 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).
Рассмотрим два основных способа формирования строки подключения. Для работы из 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Объект это часто означает, что объект не может корректно интерпретировать передаваемые параметры из-за того, что само соединение не было инициализировано.
Проанализируем правильную последовательность действий для выполнения запроса:
Connection.Command или Recordset.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();
Если строка подключения верна, но «Недопустимое соединение» сохраняется, выясним причину в настройках самого сервера. По умолчанию MS SQL Server может принимать только локальные соединения через Shared Memory.
Выполним следующие шаги:
Server\Instance), убедимся, что служба SQL Server Browser запущена. Без нее клиент не сможет определить порт, на котором работает именованный экземпляр.Подведем итоги нашего исследования. Для успешного подключения из 1С к SQL-серверу через ADO необходимо соблюдать три правила:
Provider=SQLOLEDB как наиболее совместимый.CONNECT на базу данных и SELECT на конкретную таблицу.Проанализировав все варианты, мы видим, что использование Внешних источников данных (стандартный механизм платформы 1С) часто является более предпочтительным, так как платформа сама управляет драйверами и пулом соединений. Однако, если вам необходим именно ADO, следуйте приведенным выше инструкциям по формированию строки подключения.