Как подключиться к внешней базе данных MS SQL Server из 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе интеграции различных систем перед разработчиками часто возникает задача выгрузки или загрузки данных из внешних баз данных в 1С:Предприятие 7.7. Одной из наиболее популярных СУБД является Microsoft SQL Server. В этой статье мы подробно разберем, как правильно организовать подключение к СУБД MS SQL Server из среды 1С 7.7, рассмотрим типичные ошибки при настройке драйверов, приведем готовые примеры кода на ADO и 1С++, а также изучим тонкости системного администрирования, влияющие на работу этого механизма.

Критическая ошибка: Путаница между MS SQL и MySQL

Самая распространенная ошибка при копировании примеров кода из интернета — использование неподходящих драйверов. Начинающие разработчики часто путают СУБД Microsoft SQL Server и MySQL. Например, строка подключения с параметром DRIVER={MySQL ODBC 5.1 Driver} предназначена исключительно для базы данных MySQL. Если вы попытаетесь применить ее к базе MS SQL, система вернет ошибку:

«[Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию»

Помните: это принципиально разные СУБД, требующие установки соответствующих драйверов на клиентской машине.

Способ 1. Подключение через стандартный механизм ADODB

Наиболее надежный и универсальный метод интеграции, не требующий установки дополнительных внешних компонент в 1С 7.7, — это использование встроенной в операционную систему Windows технологии ActiveX Data Objects (ADO). В этом случае мы создаем COM-объект ADODB.Connection и отправляем запросы напрямую на сервер.

Рассмотрим подробный пример кода для выполнения SQL-запроса и обхода полученной выборки:


// Создаем объект подключения
Connection = СоздатьОбъект("ADODB.Connection");

// Задаем строку подключения к серверу MS SQL 2008
// В данном примере используется авторизация SQL Server (Mixed Mode)
ConnectionString = "Provider=SQLOLEDB;Data Source=192.168.1.100;Initial Catalog=MyExternalDB;User Id=my_sql_user;Password=my_super_password;";

Connection.ConnectionTimeOut = 30; // таймаут соединения в секундах

Попытка
    Connection.Open(ConnectionString);
Исключение
    Сообщить("Не удалось подключиться к базе данных MS SQL!");
    Сообщить(ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Формируем текст SQL-запроса
ТекстЗапроса = "SELECT id, item_name, quantity FROM GoodsTable WHERE quantity > 0";

// Создаем объект команды и рекордсет для чтения данных
Command = СоздатьОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandText = ТекстЗапроса;

RecordSet = СоздатьОбъект("ADODB.RecordSet");

Попытка
    Состояние("Выполнение SQL-запроса...");
    RecordSet = Command.Execute();
Исключение
    Сообщить("Ошибка при выполнении запроса!");
    Сообщить(ОписаниеОшибки());
    Connection.Close();
    Возврат;
КонецПопытки;

// Проверяем наличие записей в выборке
Попытка
    RecordSet.MoveFirst();
Исключение
    Сообщить("Запрос вернул пустой результат.");
    Connection.Close();
    Возврат;
КонецПопытки;

// Обходим полученные данные в цикле
Пока RecordSet.EOF() = 0 Цикл
    ТекущийID = RecordSet.Fields("id").Value;
    ИмяТовара = RecordSet.Fields("item_name").Value;
    Количество = RecordSet.Fields("quantity").Value;
    
    Сообщить("Товар: " + ИмяТовара + " | Кол-во: " + Количество);
    
    RecordSet.MoveNext();
КонецЦикла;

// Закрываем соединения
RecordSet.Close();
Connection.Close();

Способ 2. Подключение с помощью внешней компоненты 1С++ (1cpp.dll)

Если в вашей информационной базе используется популярная внешняя компонента 1С++ (1cpp.dll), вы можете использовать ее специализированные классы для работы с внешними источниками данных. Это классы ODBCDatabase и ODBCRecordSet. Данный метод работает быстрее стандартного ADODB и предоставляет более удобные механизмы для обработки типизированных данных.

Разберем по шагам, как подключить внешнюю базу с использованием классов компоненты 1С++:


// Проверяем, загружена ли внешняя компонента
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 0 Тогда
    Предупреждение("Не удалось загрузить компоненту 1С++!");
    Возврат;
КонецЕсли;

// Создаем объект базы данных ODBC
DB = СоздатьОбъект("ODBCDatabase");

// Задаем строку подключения через драйвер SQL Server
ConnectionString = "Driver={SQL Server};Server=192.168.1.100;Database=MyExternalDB;Uid=my_sql_user;Pwd=my_super_password;";

// Пытаемся установить соединение
Если DB.Соединение(ConnectionString) = 0 Тогда
    Предупреждение("Ошибка подключения к базе SQL Server!");
    Возврат;
КонецЕсли;

// Создаем рекордсет и привязываем его к нашей базе данных
RS = СоздатьОбъект("ODBCRecordSet");
RS.УстБД(DB);

ТекстЗапроса = "SELECT code, description FROM SkladTable";

// Выполняем запрос
Если RS.Открыть(ТекстЗапроса) = 0 Тогда
    Сообщить("Ошибка выполнения запроса: " + RS.ПолучитьОписаниеОшибки());
    DB.Закрыть();
    Возврат;
КонецЕсли;

// Обходим результаты запроса
Пока RS.ВКонце() = 0 Цикл
    КодСклада = RS.ПолучитьЗначение("code");
    ИмяСклада = RS.ПолучитьЗначение("description");
    
    Сообщить("Склад: " + КодСклада + " - " + ИмяСклада);
    
    RS.Вперед();
КонецЦикла;

RS.Закрыть();
DB.Закрыть();

Варианты строк подключения (Connection Strings) для MS SQL

В зависимости от конфигурации сети, операционной системы и установленных на локальном компьютере драйверов, строки подключения могут отличаться. Ниже представлены наиболее стабильные варианты шаблонов подключения к MS SQL Server:

  1. Через провайдер OLE DB (рекомендуется для ADO):

    Provider=SQLOLEDB;Data Source=Имя_Или_IP_Сервера;Initial Catalog=Имя_Базы_Данных;User Id=Логин_SQL;Password=Пароль_SQL;

    Этот провайдер по умолчанию присутствует в любой версии Windows, что делает его максимально кроссплатформенным.

  2. Через стандартный драйвер ODBC (рекомендуется для 1С++):

    Driver={SQL Server};Server=Имя_Или_IP_Сервера;DataBase=Имя_Базы_Данных;UID=Логин_SQL;PWD=Пароль_SQL;

  3. Через современный драйвер Native Client (требует установки клиента на ПК):

    Provider=SQLNCLI10;Server=Имя_Или_IP_Сервера;DataBase=Имя_Базы_Данных;UID=Логин_SQL;PWD=Пароль_SQL;

    Используйте SQLNCLI10 для SQL Server 2008 или SQLNCLI11 для SQL Server 2012+.

Важные технические нюансы работы с MS SQL из 1С 7.7

Проанализируем основные подводные камни, с которыми сталкиваются программисты при настройке соединения:

1. Проблема разрядности (32-бит vs 64-бит)

Платформа 1С:Предприятие 7.7 является исключительно 32-разрядным (x86) приложением. На современных 64-битных операционных системах Windows это вызывает проблемы с видимостью драйверов. Если вы настраиваете Системный DSN (источник данных) через стандартную панель управления, 1С 7.7 его не увидит. Для настройки источников данных ODBC необходимо запускать строго 32-битную утилиту администрирования, которая расположена по пути: C:\Windows\SysWOW64\odbcad32.exe.

2. Авторизация Windows vs Авторизация SQL Server

Если в параметрах подключения вы хотите использовать учетную запись пользователя Windows, вы не можете просто прописать ее логин и пароль в поля UID и PWD. Для использования учетных данных Windows в строке подключения необходимо указывать параметр доверительного соединения:

Trusted_Connection=yes; (или Integrated Security=SSPI;)

В этом случае подключение к MS SQL произойдет под правами того пользователя Windows, под которым в данный момент запущена сессия 1С. Если же вы используете SQL-авторизацию (Mixed Mode), то администратор СУБД должен предварительно создать пользователя в MS SQL Server Management Studio и выдать ему права доступа к целевой базе данных.

3. Попытка прочитать файл базы данных напрямую (.mdf)

Иногда возникает вопрос: «Можно ли подключиться напрямую к файлу базы данных .mdf, который лежит в сетевой папке?». Ответ однозначный: нет, нельзя. Файл базы данных .mdf не является локальной базой данных типа Access или SQLite. Для его обработки обязательно должна быть запущена служба СУБД Microsoft SQL Server. Кроме того, никогда не пытайтесь монтировать файлы СУБД через сетевые шары (протокол SMB) к удаленному серверу SQL. Сетевые задержки гарантированно приведут к повреждению файлов базы данных. Файлы должны физически располагаться на дисках сервера, на котором запущена служба SQL Server.

Лайфхак: Как быстро сгенерировать точную строку подключения прямо в 1С

Чтобы не подбирать параметры вручную и избежать синтаксических ошибок, воспользуйтесь стандартной системной утилитой Windows Data Links. Для этого выполните в обработке 1С 7.7 следующий короткий отладочный код:


Соединение = СоздатьОбъект("ADODB.Connection");
ДатаЛ = СоздатьОбъект("DataLinks");

Если ДатаЛ.PromptEdit(Соединение) = 1 Тогда
    // Выводим сгенерированную строку подключения в окно сообщений
    Сообщить(Соединение.ConnectionString);
КонецЕсли;

При запуске этого кода откроется визуальное диалоговое окно операционной системы. На вкладке «Провайдер» выберите нужного драйвера (например, Microsoft OLE DB Provider for SQL Server), перейдите во вкладку «Соединение», укажите адрес сервера, логин, пароль и выберите базу данных из выпадающего списка. Нажмите кнопку «Проверить соединение». Если проверка прошла успешно, закройте окно по кнопке «ОК» — и готовая, идеально настроенная строка подключения отобразится в окне сообщений 1С. Вам останется только скопировать ее в свой программный код.

← На главную