Как настроить доступ и получить данные из MS SQL в 1С:Предприятие

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

В процессе интеграции 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).

Способ 1. Использование явной SQL-аутентификации (логин и пароль)

Самый простой и часто используемый способ обойти ограничения доменного доступа — использование логина и пароля, созданных непосредственно внутри 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;, который поддерживает современные протоколы шифрования и безопасности.

Способ 2. Обеспечение безопасности учетных данных

Хранение паролей в открытом виде в константах или коде — плохая практика. Рассмотрим, как можно защитить эти данные, если в вашей команде много разработчиков и доступ к внешним данным должен быть ограничен. Разберем два подхода:

  1. Вынос кода в привилегированный модуль с паролем. Мы можем создать общий модуль, установить у него признак «Сервер» и «Привилегированный». Чтобы скрыть текст кода от других программистов, на модуль устанавливается пароль (через контекстное меню модуля — «Установить пароль»). В этом модуле будет находиться функция, которая возвращает уже открытое соединение или выполняет запрос и возвращает ТаблицуЗначений.
  2. Использование хранилища секретов. В новых версиях платформы (начиная с 8.3.15) реализован механизм «Хранилище секретов», который позволяет хранить пароли вне информационной базы в зашифрованном виде.

Пример функции в защищенном модуле:


Функция ВыполнитьЗапросКВнешнейБазе(ТекстЗапроса) Экспорт
    // Параметры скрыты внутри запароленного модуля
    СтрокаСоединения = ПолучитьСкрытуюСтрокуПодключения(); 
    
    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.Open(СтрокаСоединения);
    
    Recordset = Новый COMОбъект("ADODB.Recordset");
    Recordset.Open(ТекстЗапроса, Connection, 1, 1); // 1 - adOpenKeyset, 1 - adLockReadOnly
    
    // Переносим данные в ТаблицуЗначений 1С, чтобы закрыть соединение сразу
    Результат = ПрочитатьДанныеВТаблицу(Recordset);
    
    Connection.Close();
    Возврат Результат;
КонецФункции

Способ 3. Внешние источники данных (самый эффективный путь)

Вместо написания кода на ADODB, проанализируем штатный механизм платформы — Внешние источники данных. Это позволяет работать с таблицами MS SQL так же, как с обычными справочниками или документами 1С.

Рассмотрим преимущества этого метода:

Чтобы настроить этот механизм, выполните следующие шаги:

  1. В дереве метаданных найдите ветку «Внешние источники данных» и добавьте новый объект.
  2. В мастере подключения укажите строку соединения. Помните, что для работы 64-битного сервера 1С на самом сервере должен быть установлен 64-битный драйвер ODBC или OLE DB для SQL Server.
  3. Выберите нужные таблицы (например, dbo.Начисления) и добавьте их в состав источника.
  4. В режиме «1С:Предприятие» зайдите в функции для технического специалиста, найдите ваш внешний источник данных и настройте «Параметры подключения», указав там логин и пароль.

Технические нюансы драйверов и разрядности

Часто программисты сталкиваются с тем, что код работает на их локальном компьютере, но выдает ошибку на сервере. Выясним причину: разрядность драйверов. Если ваш сервер 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-пароля в защищенном модуле. Однако для долгосрочных проектов и стабильной работы лучшим решением будет настройка Внешних источников данных, что обеспечит максимальную безопасность и удобство разработки.

← На главную