Как напрямую работать с базой MS SQL из 1С 7.7 для чтения и записи данных

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

В практике разработчика 1С 7.7 часто возникают задачи по интеграции с внешними информационными системами, данные которых хранятся в СУБД MS SQL Server. Это может быть база интернет-магазина, WMS-система или учетная база другой конфигурации. Использование прямого доступа к таблицам SQL позволяет значительно ускорить обмен данными по сравнению с текстовыми файлами или COM-соединением. В данной статье мы подробно разберем, как организовать чтение и запись данных во внешнюю базу MS SQL, используя стандартные механизмы Windows (ADO) и возможности внешней компоненты 1С++.

Способ 1. Использование технологии ADO (ActiveX Data Objects)

Этот метод является универсальным, так как не требует установки специализированных компонент 1С, работая через стандартные системные библиотеки Windows. Основным объектом для работы является ADODB.Connection.

Разберем по шагам, как настроить подключение. Самым сложным моментом здесь часто является правильное составление строки соединения (ConnectionString). Мы рекомендуем использовать проверенный лайфхак: создайте на рабочем столе пустой файл с расширением .udl, запустите его, настройте параметры подключения к серверу и протестируйте связь. После этого откройте файл блокнотом — там будет готовая строка соединения, которую можно скопировать в код 1С.

Рассмотрим пример кода для подключения и чтения данных:


// Создаем объект соединения
Соединение = СоздатьОбъект("ADODB.Connection");
// Пример строки соединения (используйте свои данные сервера, базы, логина и пароля)
ConnectionString = "Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=True;User ID=sa;Initial Catalog=ExternalDB;Data Source=SQL_SERVER_NAME;";

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

// Выполнение запроса на чтение
ТекстЗапроса = "SELECT id, name, balance FROM Clients WHERE balance > 0";
Recordset = Соединение.Execute(ТекстЗапроса);

Пока Recordset.EOF = 0 Цикл
    // Обработка полученных данных
    ИмяКлиента = Recordset.Fields("name").Value;
    Остаток = Recordset.Fields("balance").Value;
    Сообщить(ИмяКлиента + " : " + Остаток);
    Recordset.MoveNext();
КонецЦикла;

Recordset.Close();
Соединение.Close();

Для записи данных (команды INSERT или UPDATE) мы используем тот же метод Execute, но без обработки возвращаемого набора записей. Важно помнить, что при записи строковых данных, содержащих кириллицу, в поля типа NVARCHAR, перед строкой в SQL-запросе нужно добавлять префикс N, чтобы избежать проблем с кодировкой.

Способ 2. Работа через компоненту 1С++ (ODBCRecordset)

Если в вашей конфигурации уже используется внешняя компонента 1С++, работа с внешними базами становится еще более удобной и производительной. Объект ODBCRecordset позволяет не только выполнять запросы, но и сразу выгружать результаты в привычную для 1С Таблицу Значений (ТЗ), а также использовать типизацию параметров.

Проанализируем пример подключения к внешней базе через 1С++:


// Инициализируем соединение с базой через ODBC
БазаДанных = СоздатьОбъект("ODBCDataBase");
СтрокаСоединения = "Driver={SQL Server};Server=SQL_SERVER_NAME;Database=ExternalDB;Uid=sa;Pwd=MyPassword;";

Если БазаДанных.Соединение(СтрокаСоединения) = 0 Тогда
    Предупреждение("Не удалось подключиться к базе данных!");
    Возврат;
КонецЕсли;

// Создаем объект для выполнения запросов
Запрос = СоздатьОбъект("ODBCRecordset");
Запрос.УстБД(БазаДанных);

// Пример выполнения запроса с параметрами
ТекстЗапроса = "
|SELECT *
|FROM Products
|WHERE CategoryID = :ВыбКатегория
|";

Запрос.УстановитьТекстовыйПараметр("ВыбКатегория", 10);
ТЗ_Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

// Теперь данные находятся в обычной Таблице Значений
ТЗ_Результат.ВыбратьСтроки();
Пока ТЗ_Результат.ПолучитьСтроку() = 1 Цикл
    Сообщить(ТЗ_Результат.ProductName);
КонецЦикла;

Важное преимущество 1С++: компонента корректно обрабатывает типы данных numeric и int, преобразуя их в числовой формат 1С без лишних телодвижений. В случае с ADO иногда приходится принудительно приводить типы на стороне SQL (например, через CAST(Field AS VARCHAR)), чтобы 1С восприняла их корректно.

Технические нюансы и настройки системы

Рассмотрим важные детали, без которых стабильная работа может быть нарушена:

  1. 64-битные системы (Windows 10/11, Server 2019): Поскольку 1С 7.7 является 32-битным приложением, она может работать только с 32-битными драйверами БД. Если вы настраиваете DSN через панель управления, обязательно запускайте 32-битную версию утилиты настройки по адресу C:\Windows\SysWOW64\odbcad32.exe.
  2. Выбор драйвера: Стандартный драйвер {SQL Server} считается устаревшим. Для новых версий MS SQL Server (2016 и выше) лучше использовать MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server). Это обеспечит поддержку современных протоколов безопасности TLS 1.2.
  3. Блокировки и "грязное чтение": При работе с внешними базами, в которых параллельно работают другие программы, мы рекомендуем добавлять в SELECT запросы хинт WITH (NOLOCK). Это позволит избежать ожидания блокировок, если вам достаточно текущего состояния данных без гарантии их мгновенной актуальности.
  4. Хранимые процедуры: Если логика работы с данными сложная, правильнее вынести её на сторону SQL в виде хранимых процедур. Из 1С вы будете просто вызывать процедуру с параметрами, что повышает безопасность и упрощает код на языке 1С.
  5. Использование Linked Servers: Если внешняя база находится на том же сервере, что и ваша база 1С, вы можете настроить "Связанный сервер" (Linked Server) в консоли управления SQL. Это позволит вам писать запросы, объединяющие данные вашей 1С и внешней базы в одном операторе SELECT.

Таким образом, выбор между ADO и 1С++ зависит от ваших текущих инструментов. Если компонента 1С++ уже встроена в проект — используйте её, так как она предоставляет более богатый функционал и высокую скорость выгрузки данных в таблицы. Если же нужно быстрое решение "здесь и сейчас" без регистрации внешних библиотек — ADO прекрасно справится с задачей.

← На главную