В процессе интеграции 1С с внешними информационными системами часто возникает задача прямого чтения данных из таблиц MS SQL Server. Несмотря на кажущуюся простоту использования COM-объектов, разработчики регулярно сталкиваются с проблемой: «У пользователя Windows есть доступ к базе, а при выполнении кода из 1С возникает ошибка доступа». Разберем подробно, почему это происходит, как правильно настроить строку соединения и какие современные инструменты платформы 1С стоит использовать для этой задачи.
Проанализируем типичную ситуацию. Когда вы запускаете консоль SQL Management Studio под своей учетной записью Windows, вы успешно видите данные. Однако при выполнении кода в 1С (особенно в клиент-серверном варианте на PostgreSQL) попытка обращения к ADODB.Connection завершается неудачей. Основная причина кроется в контексте исполнения кода. Рассмотрим этот механизм подробнее.
Если код выполняется на стороне сервера (в модуле менеджера, в общем модуле с признаком «Сервер» или в серверном вызове), то инициатором запроса к MS SQL выступает не текущий пользователь 1С, а служба 1C:Enterprise 8.3 Server Agent. По умолчанию эта служба запускается под локальной системной учетной записью (например, USR1CV8) или специальным доменным пользователем. У этой технической учетной записи, как правило, нет прав в сторонней базе MS SQL.
Выясним, под кем работает ваш сервер 1С. Для этого необходимо зайти в оснастку «Службы» на сервере приложений 1С и проверить свойства службы 1C:Enterprise. Именно этому пользователю нужно выдать права в MS SQL Server, если вы планируете использовать Windows-аутентификацию (Trusted Connection).
Самый простой и часто используемый способ обойти ограничения доменного доступа — использование логина и пароля, созданных непосредственно внутри MS SQL Server. Посмотрим на пример формирования строки соединения, который обсуждался в теме:
// Определим параметры подключения
СерверSQL = "Siri";
БазаSQL = "personal";
Логин = "User1C_Integration";
Пароль = "StrongPassword123";
// Формируем строку соединения с использованием SQL-аутентификации
СтрокаСоединения = "Driver={SQL Server};Server=" + СерверSQL + ";Database=" + БазаSQL + ";Uid=" + Логин + ";Pwd=" + Пароль + ";";
MSSQL_сервер = Новый COMОбъект("ADODB.Connection");
Попытка
MSSQL_сервер.Open(СтрокаСоединения);
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить("Ошибка соединения: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание на использование драйвера {SQL Server}. В современных системах рекомендуется использовать более актуальный провайдер, например, Provider=MSOLEDBSQL;, который поддерживает современные протоколы шифрования и безопасности.
Хранение паролей в открытом виде в константах или коде — плохая практика. Рассмотрим, как можно защитить эти данные, если в вашей команде много разработчиков и доступ к внешним данным должен быть ограничен. Разберем два подхода:
ТаблицуЗначений.Пример функции в защищенном модуле:
Функция ВыполнитьЗапросКВнешнейБазе(ТекстЗапроса) Экспорт
// Параметры скрыты внутри запароленного модуля
СтрокаСоединения = ПолучитьСкрытуюСтрокуПодключения();
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаСоединения);
Recordset = Новый COMОбъект("ADODB.Recordset");
Recordset.Open(ТекстЗапроса, Connection, 1, 1); // 1 - adOpenKeyset, 1 - adLockReadOnly
// Переносим данные в ТаблицуЗначений 1С, чтобы закрыть соединение сразу
Результат = ПрочитатьДанныеВТаблицу(Recordset);
Connection.Close();
Возврат Результат;
КонецФункции
Вместо написания кода на ADODB, проанализируем штатный механизм платформы — Внешние источники данных. Это позволяет работать с таблицами MS SQL так же, как с обычными справочниками или документами 1С.
Рассмотрим преимущества этого метода:
Чтобы настроить этот механизм, выполните следующие шаги:
dbo.Начисления) и добавьте их в состав источника.Часто программисты сталкиваются с тем, что код работает на их локальном компьютере, но выдает ошибку на сервере. Выясним причину: разрядность драйверов. Если ваш сервер 1С 64-битный, он не сможет использовать 32-битные драйверы ODBC или компоненты COM. Убедитесь, что на сервере установлен именно 64-битный клиент MS SQL Server.
Также проанализируем настройки сетевого протокола. MS SQL Server по умолчанию может не принимать подключения по TCP/IP. Проверьте через SQL Server Configuration Manager, что протокол TCP/IP включен и сервер прослушивает порт 1433. Если вы используете именованный экземпляр (например, Server\SQLEXPRESS), на целевом сервере должна быть запущена служба SQL Server Browser.
При чтении данных из 1С напрямую через SQL крайне важно не блокировать работу сторонней системы. Разберем использование инструкции NOLOCK. Если внешняя система активно записывает данные в таблицу «Начисления», обычный SELECT может вызвать ожидание блокировок. Используйте следующий синтаксис:
ТекстSQL = "SELECT * FROM dbo.Начисления WITH (NOLOCK) WHERE ТабНомер = 724";
Recordset.Open(ТекстSQL, Connection);
Это позволит прочитать данные, не дожидаясь завершения транзакций на запись во внешней системе, что критически важно для производительности обеих баз данных.
Подводя итог, можно сказать: для разовых или простых задач допустимо использование ADODB с явным указанием SQL-пароля в защищенном модуле. Однако для долгосрочных проектов и стабильной работы лучшим решением будет настройка Внешних источников данных, что обеспечит максимальную безопасность и удобство разработки.