Как настроить подключение к MS SQL Server через ADODB.Connection под доменным пользователем в 1С?

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

При интеграции 1С с внешними базами данных Microsoft SQL Server разработчики нередко используют COM-объект ADODB.Connection. Если со стандартной авторизацией по логину и паролю SQL Server (SQL Server Authentication) сложностей обычно не возникает, то попытка переключиться на учетную запись домена Active Directory часто приводит к ошибке «Login failed for user». Проанализируем причину этой ошибки и подробно разберем, как правильно организовать доменное подключение.

Выясним причину ошибки

Посмотрим на исходную попытку формирования строки соединения:


СтрокаСоединения = "Provider=SQLOLEDB; 
    |Data Source=" + ИмяСервера + ";
    |Password='" + ПарольПользователя +"';
    |User ID='" + ИмяПользователя +"';
    |Initial Catalog=" + ИмяБазы;

Когда мы передаем параметры User ID и Password, OLE DB провайдер всегда интерпретирует это как попытку аутентификации средствами самого SQL Server (SQL Authentication). Даже если мы укажем имя пользователя в формате DOMAIN\Username, сервер баз данных не будет проверять пароль через контроллер домена Windows, а попытается найти локального SQL-пользователя с точно таким же именем. Так как доменного пользователя с паролем в базе данных SQL нет, сервер немедленно возвращает ошибку авторизации.

Технология Windows Authentication (NTLM или Kerberos) работает принципиально иначе: она не передает открытый пароль провайдеру, а использует существующий токен безопасности текущего процесса Windows. Следовательно, передавать логин и пароль в строке подключения нельзя — вместо этого необходимо включить режим доверительного соединения.

Пошаговая настройка доверительного подключения

Разберем по шагам, как модифицировать код 1С для работы с доменной авторизацией:

  1. Полностью удалим параметры User ID и Password из строки инициализации.
  2. Добавим специальный параметр Trusted_Connection=Yes; (или его аналог Integrated Security=SSPI;).
  3. Обратим внимание на форматирование: внутри многострочных строковых литералов 1С не должно быть комментариев с двойным слэшем (//), так как они становятся частью самой строки подключения и приводят к синтаксической ошибке OLE DB парсера.

Посмотрим на рабочий пример кода для платформы 1С:


ИмяСервера = "sql-server-main";
ИмяБазы    = "ProductionDB";

СтрокаСоединения = "Provider=SQLOLEDB;"
    + "Data Source=" + ИмяСервера + ";"
    + "Initial Catalog=" + ИмяБазы + ";"
    + "Trusted_Connection=Yes;";

Попытка
    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = СтрокаСоединения;
    Соединение.Open();
    
    // Подключение успешно установлено, выполняем необходимые запросы
    
    Соединение.Close();
Исключение
    ВызватьИсключение "Не удалось подключиться к базе данных: " + ОписаниеОшибки();
КонецПопытки;

Контекст выполнения: Клиент или Сервер 1С

Рассмотрим критически важную деталь, от которой зависит успешность подключения. Поскольку мы используем доверенное соединение, SQL Server получает информацию о том пользователе, в контексте которого запущен процесс, исполняющий код 1С:

  1. Код выполняется на клиенте (толстый или тонкий клиент): Соединение устанавливается от имени пользователя Windows, который залогинен на текущем компьютере. В этом случае права на сервере SQL Server должны быть выданы именно этой учетной записи домена.
  2. Код выполняется на сервере 1С (в серверном модуле или фоновом задании): Авторизация происходит от имени учетной записи операционной системы, под которой запущена служба сервера 1С (например, usr1cv8 или SYSTEM). Если служба запущена под локальным системным пользователем, а SQL Server расположен на отдельном сервере, доменная авторизация завершится ошибкой. В такой ситуации необходимо запускать службу сервера 1С под специальной доменной сервисной учетной записью и предоставлять права на SQL Server именно ей.

Важное ограничение: Если вам требуется подключиться к базе под конкретным доменным пользователем, отличным от пользователя текущего запущенного процесса Windows, сделать это напрямую через параметры строки ADODB.Connection невозможно. В архитектуре Windows для этого требуется имперсонация потока через API-функции операционной системы (например, LogonUser), что требует привлечения внешних компонент.

Выбор современного OLE DB провайдера

Проанализируем используемый драйвер. Провайдер SQLOLEDB (Microsoft OLE DB Provider for SQL Server) входит в состав операционной системы Windows по умолчанию, но на сегодняшний день является устаревшим. Он не обеспечивает полноценную поддержку современных протоколов безопасности (таких как TLS 1.2 и TLS 1.3) при работе с новыми версиями MS SQL Server.

Для современной инфраструктуры рекомендуется использовать обновленный драйвер MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server). Для этого его предварительно устанавливают на рабочий сервер или клиентскую машину, а строку подключения формируют следующим образом:


СтрокаСоединения = "Provider=MSOLEDBSQL;"
    + "Data Source=" + ИмяСервера + ";"
    + "Initial Catalog=" + ИмяБазы + ";"
    + "Integrated Security=SSPI;";

Ограничения платформы 1С при работе с COM-объектами

При проектировании обменов и прямых запросов к базам данных учитываем технические ограничения платформы 1С:Предприятие:

  1. Операционная система: Объект COMОбъект("ADODB.Connection") работает исключительно в среде Windows. Если кластер серверов 1С функционирует под управлением ОС Linux, создание COM-объекта вызовет фатальное исключение.
  2. Разрядность процессов (32 и 64 бит): Разрядность установленного в системе провайдера OLE DB должна совпадать с разрядностью процесса 1С. Если на сервере работает 64-битный рабочий процесс 1С, на машине обязательно должен быть установлен 64-битный OLE DB драйвер.
  3. Веб-клиент: Создание и использование COM-объектов в веб-клиенте напрямую не поддерживается.

Альтернативные подходы к интеграции

Если настроить доменную аутентификацию в гетерогенной среде сложно или сервер 1С работает под Linux, рассмотрим альтернативные варианты архитектуры:

  1. Аутентификация SQL Server: Включение на стороне СУБД смешанного режима проверки подлинности (SQL Server and Windows Authentication mode) и создание выделенного SQL-пользователя с ограниченными правами. В этом случае в строке подключения передаются стандартные параметры User ID и Password.
  2. Интеграция через Web-сервисы и HTTP: Разработка API (REST / OData / SOAP) на стороне целевой системы. Это позволяет полностью избавиться от прямых низкоуровневых подключений к базе данных, повышает общую безопасность контура и решает проблемы кроссплатформенности.
  3. Использование внешних компонент Native API: Если требуется прямое подключение из-под Linux, применяются специализированные внешние компоненты, работающие через ODBC-драйверы.
← На главную