При интеграции систем часто возникает необходимость выгрузки или чтения данных из внешних баз под управлением СУБД Microsoft SQL Server. Традиционный подход с жестким прописыванием логина и пароля (SQL Server Authentication) в коде 1С или в константах сопряжен с серьезными рисками информационной безопасности. Если учетные данные хранятся в открытом виде в строке подключения, любой разработчик или администратор с доступом к коду может их скомпрометировать. Выходом из этой ситуации является использование сквозной (доменной/Windows) авторизации.
В этой статье мы подробно разберем, как правильно реализовать беспарольное подключение к MSSQL из среды «1С:Предприятие», проанализируем синтаксис строк подключения, изучим влияние контекста выполнения кода и рассмотрим сложные архитектурные нюансы, такие как проблема «двойного прыжка» (Double-Hop) и особенности работы на серверах под управлением ОС Linux.
Сквозная авторизация (или Windows Authentication / Integrated Security) основывается на доверительных отношениях в домене Active Directory. Вместо передачи пары «логин-пароль» клиент отправляет СУБД маркер безопасности текущего процесса операционной системы. MSSQL проверяет этот маркер через контроллер домена и сопоставляет его со списком разрешенных пользователей.
Прежде чем настраивать код в 1С, необходимо выполнить обязательное условие на стороне СУБД: на сервере MSSQL, к которому мы планируем подключаться, должны быть созданы соответствующие доменные имена входа (Logins), и им должны быть назначены необходимые роли и права доступа к конкретной базе данных.
Для создания подключения из 1С обычно используется COM-объект ADODB.Connection. Чтобы СУБД поняла, что нужно использовать текущие учетные данные операционной системы, из строки подключения необходимо полностью исключить параметры User ID (или UID) и Password (или PWD), заменив их на специальный параметр.
Рассмотрим синтаксис строки подключения в зависимости от используемого драйвера. Обратите внимание, что устаревший драйвер SQLOLEDB (Microsoft OLE DB Provider for SQL Server) официально не рекомендуется к использованию корпорацией Microsoft. Вместо него следует применять современный драйвер MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server).
Проанализируем примеры формирования строки подключения:
Вариант 1. Использование современного драйвера MSOLEDBSQL (Рекомендуется)
// Формируем строку подключения с использованием Integrated Security
СтрокаПодключения = "Provider=MSOLEDBSQL;Integrated Security=SSPI;Initial Catalog=ИмяВнешнейБазы;Data Source=ИмяСервераБД;";
Вариант 2. Использование классического драйвера SQLOLEDB (Устаревший)
// В устаревшем драйвере также используется Integrated Security=SSPI
СтрокаПодключения = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=ИмяВнешнейБазы;Data Source=ИмяСервераБД;";
Вариант 3. Использование ODBC-драйвера
При использовании ODBC-соединений (например, через системный DSN) вместо Integrated Security=SSPI часто используется синоним Trusted_Connection=yes:
СтрокаПодключения = "Driver={ODBC Driver 17 for SQL Server};Server=ИмяСервераБД;Database=ИмяВнешнейБазы;Trusted_Connection=yes;";
Настройка строки подключения — это лишь вершина айсберга. Самая частая ошибка разработчиков заключается в непонимании того, в каком контексте и под чьим именем запускается сессия соединения с MSSQL. Выясним, под кем именно будет выполняться запрос в различных режимах работы 1С:
&НаКлиенте) либо база работает в файловом режиме, авторизация на сервере MSSQL произойдет под учетной записью текущего Windows-пользователя, который запустил сессию 1С на своем компьютере. В этом случае достаточно предоставить права в MSSQL именно этому доменному пользователю.&НаСервере, фоновые или регламентные задания), запрос к внешней СУБД пойдет не от имени пользователя, сидящего за компьютером. Подключение инициирует сама служба операционной системы «Агент сервера 1С:Предприятия».
По умолчанию служба сервера 1С устанавливается под локальной учетной записью (например, USR1CV8 или USR1CV83). Поскольку эта учетная запись является локальной для сервера приложений 1С, удаленный сервер MSSQL отклонит попытку подключения. Чтобы решить эту проблему, выполните следующие действия:
DOMAIN\usr1cv8_service).DOMAIN\usr1cv8_service.Рассмотрим пример кода на встроенном языке 1С, который безопасно инициализирует подключение к СУБД с обработкой возможных исключений:
&НаСервере
Процедура ПодключитьсяКВнешнейБДНаСервере()
// Инициализируем COM-объект для работы с ADO
Попытка
Соединение = Новый COMОбъект("ADODB.Connection");
Исключение
ЗаписатьЛогОшибок("Не удалось создать объект ADODB.Connection. Возможно, не установлены компоненты MDAC/WDAC.");
Возврат;
КонецПопытки;
// Обратите внимание: параметры User ID и Password не указываются!
// Авторизация произойдет под доменной учетной записью службы сервера 1С
СтрокаПодключения = "Provider=MSOLEDBSQL;Integrated Security=SSPI;Initial Catalog=ExternalProduction;Data Source=SQL-SERVER-01;";
Соединение.ConnectionTimeout = 15;
Попытка
Соединение.Open(СтрокаПодключения);
// Выполняем тестовый запрос
ТекстЗапроса = "SELECT TOP 1 [ID], [Name] FROM [dbo].[Partners]";
Рекордсет = Соединение.Execute(ТекстЗапроса);
Пока Рекордсет.EOF() = 0 Цикл
// Обработка полученных данных
ИмяПартнера = Рекордсет.Fields("Name").Value;
// Переходим к следующей записи
Рекордсет.MoveNext();
КонецЦикла;
// Закрываем соединения
Рекордсет.Close();
Соединение.Close();
Сообщить("Подключение и чтение данных выполнены успешно!");
Исключение
ИнформацияОбОшибке = ОписаниеОшибки();
ЗаписатьЛогОшибок("Ошибка при работе с MSSQL: " + ИнформацияОбОшибке);
// Гарантируем закрытие соединения при возникновении ошибки
Если Соединение.State = 1 Тогда
Соединение.Close();
КонецЕсли;
КонецПопытки;
КонецПроцедуры
Иногда бизнес-требования диктуют следующую логику: необходимо, чтобы сервер 1С подключался к MSSQL не под единой технологической учетной записью службы, а делегировал права конкретного Windows-пользователя, который в данный момент работает в программе 1С. В таком сценарии вы гарантированно столкнетесь с фундаментальным ограничением безопасности Windows, известным как проблема «двойного прыжка» (Double-Hop).
При стандартной конфигурации Windows запрещает передавать учетные данные пользователя «по цепочке» дальше одного узла. Цепочка выглядит так: Клиентский компьютер (Прыжок 1) -> Сервер приложений 1С (Прыжок 2) -> Сервер MSSQL. При попытке выполнить такой запрос без дополнительной настройки вы получите ошибку авторизации: Ошибка входа пользователя NT AUTHORITY\АНОНИМНЫЙ ВХОД (или Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON').
Для того чтобы решить эту проблему, необходимо настроить сквозную **Kerberos-делегируемую аутентификацию** в вашем домене Active Directory. Разберем по шагам действия, которые должен выполнить системный администратор:
setspn. Например:
setspn -A MSSQLSvc/sqlserver.domain.local:1433 domain\sql_service_account
setspn -A 1CV8Server/1cserver.domain.local:1540 domain\1c_service_account
После правильного применения этих политик сервер 1С получит право прозрачно транслировать доменный токен безопасности пользователя на сервер MSSQL, обеспечивая детальный аудит действий каждого сотрудника.
В современных реалиях серверная часть «1С:Предприятия» всё чаще разворачивается на базе Linux-дистрибутивов (Ubuntu, Astra Linux, RED OS), в то время как внешняя база MSSQL по-прежнему работает под управлением ОС Windows. Так как Linux «из коробки» не поддерживает механизмы безопасности Windows-домена, для реализации сквозной авторизации требуется провести дополнительную системную интеграцию:
/etc/krb5.conf, указав в нем параметры вашего домена (KDC, admin_server).usr1cv8, под которым в Linux запускается сервер 1С, настраивается автоматическое получение доменного Kerberos-тикета с помощью утилиты kinit при старте операционной системы.При такой схеме драйвер ODBC на стороне Linux сможет беспрепятственно запрашивать авторизацию у Windows-сервера MSSQL по протоколу Kerberos без прямой передачи паролей.
Если вы хотите избежать написания кода работы с COM-объектами и повысить производительность работы с данными СУБД, отличным решением будет использование встроенного объекта метаданных платформы «1С:Предприятие» — **Внешние источники данных**.
Проанализируем процесс настройки:
Integrated Security=SSPI или Trusted_Connection=yes в зависимости от выбранного провайдера данных).Использование этого штатного механизма позволяет разработчикам манипулировать внешними таблицами СУБД с помощью стандартных запросов 1С, используя конструкции языка запросов платформы и сохраняя при этом высокий уровень информационной безопасности инфраструктуры.