При интеграции 1С с внешними базами Microsoft SQL Server через механизм Внешние источники данных разработчики часто сталкиваются с ситуацией: в файловой или локальной тестовой базе строка соединения с параметром Trusted_Connection=Yes отрабатывает без нареканий, но при переносе конфигурации на рабочий сервер 1С:Предприятия попытка обращения к таблицам внешнего источника завершается сбоем: «Ошибка входа пользователя NT AUTHORITY\АНОНИМНЫЙ ВХОД» (или в англоязычном варианте NT AUTHORITY\ANONYMOUS LOGON).
Проанализируем архитектурные особенности взаимодействия платформы 1С и MS SQL Server, выясним техническую причину такого поведения и разберем практические способы настройки подключения.
Для понимания корня проблемы разберем цепочку вызовов в клиент-серверном режиме работы 1С:
rphost. Платформа 1С не умеет передавать Windows-токен пользователя клиентской рабочей станции дальше на внешний сервер СУБД. Настройка логинов и паролей внешнего источника для каждого пользователя в режиме «1С:Предприятие» предназначена только для внутренней аутентификации средствами СУБД (SQL Server Authentication), а не для доменной сквозной аутентификации.DRIVER={SQL Server}; использует древний системный драйвер MDAC (sqlsrv32.dll). Он некорректно работает с современными механизмами SPPI/Kerberos при межсерверных вызовах и не поддерживает современные протоколы шифрования.Если перед нами стоит задача разграничить доступ пользователей или обеспечить стабильную межсерверную интеграцию, самым надежным и простым решением является отказ от Trusted_Connection=Yes в пользу внутренней аутентификации средствами MS SQL Server.
Разберем по шагам, как перевести внешний источник на аутентификацию SQL:
Посмотрим на пример корректной строки подключения:
DRIVER={ODBC Driver 17 for SQL Server};SERVER=sql-server-name;DATABASE=TargetDatabase;UID=db_user;PWD=StrongPassword123;
Если требуется, чтобы каждый пользователь работал под своими реквизитами, мы можем воспользоваться встроенным в 1С механизмом назначения параметров аутентификации для каждого пользователя информационной базы через пункт меню Администрирование -> Параметры аутентификации внешнего источника данных.
Если регламент безопасности предприятия категорически запрещает использование логинов SQL Server и требует исключительно авторизацию по доменным учетным записям, все серверные вызовы 1С должны идти от одной выделенной доменной службы, для которой настроена инфраструктура Kerberos.
Разберем последовательность системной настройки:
services.msc на сервере 1С найдем службу Агент сервера 1С:Предприятия (ragent) и на вкладке Вход в систему переопределим запуск: вместо локальной системной учетной записи укажем специально созданную доменную учетную запись (например, DOMAIN\svc_1c_server).
setspn -s MSSQLSvc/sql-server.domain.local:1433 DOMAIN\svc_sql_server
setspn -s MSSQLSvc/sql-server:1433 DOMAIN\svc_sql_server
DOMAIN\svc_1c_server), откроем ее свойства, перейдем на вкладку Делегирование (Delegation), выберем вариант Доверять этой учетной записи делегирование только указанным службам -> Использовать только Kerberos и добавим в список службу MSSQLSvc целевого сервера SQL.
DRIVER={ODBC Driver 17 for SQL Server};SERVER=sql-server.domain.local;DATABASE=TargetDatabase;Trusted_Connection=Yes;
При использовании 18-й версии драйвера с самоподписанным сертификатом на стороне SQL Server добавим в строку параметр TrustServerCertificate=Yes;.
Если ключевое требование задачи — фиксировать в журнале SQL Server именно конкретного доменного пользователя, сидящего за рабочим местом, встроенный механизм Внешние источники данных в клиент-серверной 1С применить не удастся из-за ограничений архитектуры платформы. В таком случае логику выборки данных необходимо выносить в клиентский контекст с обращением через ADO.
Посмотрим на пример реализации выборки на стороне клиентского приложения:
&НаКлиенте
Процедура ПолучитьДанныеИзSQL()
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=MSOLEDBSQL;Data Source=sql-server;Initial Catalog=TargetDatabase;Integrated Security=SSPI;";
Попытка
Соединение.Open();
Исключение
ВызватьИсключение "Не удалось подключиться к SQL: " + ОписаниеОшибки();
КонецПопытки;
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.CommandText = "SELECT Id, Name FROM Customers";
НаборЗаписей = Команда.Execute();
Пока НЕ НаборЗаписей.EOF() Цикл
// Обработка полученных полей
Идентификатор = НаборЗаписей.Fields("Id").Value;
Наименование = НаборЗаписей.Fields("Name").Value;
НаборЗаписей.MoveNext();
КонецЦикла;
Соединение.Close();
КонецПроцедуры
При выполнении этого кода в процедуре с директивой &НаКлиенте обращение к базе данных инициируется непосредственно операционной системой пользователя с рабочей станции, благодаря чему в MS SQL Server успешно передаются доменные учетные данные текущей пользовательской сессии.