При организации прямого взаимодействия платформы 1С с СУБД MS SQL Server посредством ADO/OLE DB разработчики часто сталкиваются с ошибкой входа пользователя. Разберем причинно-следственные связи этой проблемы, выясним разницу между типами аутентификации и составим правильную строку подключения.
Разберем типичную ситуацию: при выполнении кода в 1С возникает ошибка вида "Ошибка входа пользователя...". При этом имя сервера и базы данных могут быть указаны верно, а сам пользователь успешно работает в среде операционной системы или менеджменте MS SQL Server Management Studio.
Выясним главные причины появления такой ошибки:
UID и PWD, но используется доменное имя (например, DOMAIN\User), СУБД ожидают проверку SQL-аутентификации, которая завершается сбоем.Проанализируем, как MS SQL Server разделяет механизмы авторизации:
1. Windows Authentication (Виндовая авторизация): аутентификация выполняется средствами операционной системы или домена Active Directory. В этом случае MS SQL Server доверяет учетным данным текущей сессии операционной системы. Передавать логин и пароль в явном виде в строке подключения не требуется.
2. SQL Server Authentication (Скульная авторизация): учетные записи создаются и хранятся непосредственно внутри MS SQL Server. Для подключения обязательно требуется передать логин (UID) и пароль (PWD). Для работы этого режима в настройках MS SQL Server должен быть включен смешанный режим аутентификации (Mixed Mode / Windows and SQL Server Authentication Mode).
Важно помнить: проверка имени входа осуществляется в ветке Безопасность -> Имена входа (Security -> Logins) на уровне экземпляра сервера, а не только внутри узла конкретной базы данных.
Если для подключения к MS SQL Server используется доменная или локальная учетная запись Windows, из строки соединения необходимо удалить параметры UID и PWD, заменив их специальным флагом доверенного соединения Trusted_Connection=Yes.
Рассмотрим пример правильного формирования строки подключения на языке 1С:
ConnectString = "Provider=SQLOLEDB;" +
"Data Source=" + ServerName +
";Initial Catalog=" + DSN +
";Trusted_Connection=Yes;";
В данном примере:
SQLOLEDB — провайдер OLE DB для MS SQL Server;
Data Source — имя или IP-адрес экземпляра сервера SQL;
Initial Catalog — наименование целевой базы данных;
Trusted_Connection=Yes — указание использовать текущие учетные данные Windows без явной передачи логина и пароля.
Рассмотрим порядок обращения к объектам базы данных в SQL-запросах из 1С:
Initial Catalog в строке подключения в текстах запросов можно обращаться напрямую к имени таблицы или с указанием схемы (например, dbo.ИмяТаблицы).ИмяСервера.ИмяБазы.ИмяСхемы.ИмяТаблицы.Проанализируем важные технические нюансы, которые необходимо учитывать при разработке:
1. Контекст исполнения на сервере 1С: если код подключения через Trusted_Connection=Yes выполняется на стороне сервера 1С (в клиент-серверном режиме), обращение к MS SQL Server происходит от имени учетной записи операционной системы, под которой запущен сервис 1С (например, usr1cv8). Поэтому соответствующее имя входа должно быть создано на сервере SQL и обладать нужными правами доступа.
2. Выбор современного драйвера: провайдер SQLOLEDB является устаревшим. В новых проектах рекомендуется использовать более актуальные провайдеры и драйверы, такие как MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server) или ODBC-драйверы (например, DRIVER={ODBC Driver 17 for SQL Server}).
3. Разрядность компонентов: используемый OLE DB провайдер или ODBC драйвер должен соответствовать разрядности процесса 1С (32-bit или 64-bit), в контексте которого выполняется код соединения.
4. Альтернатива без COM-объектов: начиная с версии платформы 8.2.14, для чтения и записи данных во внешних базами SQL рекомендуется задействовать штатный механизм платформы — Внешние источники данных. Это позволяет работать с таблицами SQL средствами встроенного языка и языка запросов 1С без ручного создания COM-объектов ADODB.Connection.