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

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

В процессе разработки часто возникают задачи интеграции 1С с внешними базами данных. Зачастую штатный механизм «Внешние источники данных» не подходит из-за динамического изменения структуры таблиц или имен баз, что требует постоянного изменения конфигурации. Рассмотрим, как реализовать прямое подключение к SQL-базе программными средствами.

Решение для ОС Windows через ADO

В среде Windows наиболее эффективным и проверенным способом является использование объекта COMОбъект с библиотекой ADODB.Connection. Этот метод позволяет передавать строку подключения динамически, что решает проблему с меняющимися именами баз.

Рассмотрим пошагово, как организовать такое подключение:

  1. Создаем объект ADODB.Connection.
  2. Формируем строку подключения, включающую драйвер ODBC, адрес сервера, учетные данные и имя базы.
  3. Открываем соединение и выполняем SQL-запросы.

Пример программного кода для реализации соединения:


АДОСоединение = Новый COMОбъект("ADODB.Connection");
Если АДОСоединение.State = 0 Тогда
    SRV = "192.168.1.10"; // Адрес сервера
    DB = "MyDatabase";    // Имя базы
    UID = "user";         // Пользователь
    PWD = "password";     // Пароль
    PORT = "3306";        // Порт
    
    // Формируем строку подключения (драйвер должен быть установлен в системе)
    cstr = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=" + SRV + 
           ";UID=" + UID + ";PASSWORD=" + PWD + 
           ";DATABASE=" + DB + ";PORT=" + PORT + ";";
    
    Попытка
        АДОСоединение.Open(cstr);
    Исключение
        АДОСоединение = Неопределено;
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Если АДОСоединение <> Неопределено Тогда
    ТекстЗапроса = "SELECT ID FROM ITEMS";
    Table = АДОСоединение.Execute(ТекстЗапроса);
    Пока Table.EOF = 0 Цикл
        Сообщить(Table.Fields("ID").Value);
        Table.MoveNext();
    КонецЦикла;
    Table.Close();
КонецЕсли;

Важное примечание: при работе с драйверами убедитесь, что версия драйвера в строке DRIVER={...} в точности соответствует установленной в вашей операционной системе через администратор источников данных ODBC.

Особенности и сложности работы в Linux

Ситуация кардинально меняется, если 1С запущена на сервере под управлением Linux. В этой среде технология COM не поддерживается, поэтому использование ADODB.Connection невозможно.

Если архитектура требует доступа к удаленной базе, а использование стандартных инструментов 1С ограничено, можно рассмотреть следующие подходы:

Вариант 1: Разработка REST-сервиса

Если прямое обращение невозможно, создайте промежуточный прокси-сервер. Например, с помощью языка Python и библиотеки pyodbc можно поднять сервис (например, на базе FastAPI), который будет принимать HTTP-запросы от 1С, выполнять SQL-запрос к БД и возвращать результат в формате JSON или XML.

Это решение позволяет:

Вариант 2: Использование внешних компонент (Native API)

Для продвинутых разработчиков существует возможность написания собственной внешней компоненты (Native API). Это библиотека на языке C++, которая компилируется под Linux в формат .so и предоставляет 1С методы для выполнения SQL-запросов напрямую через библиотеку unixODBC. Это технически сложный, но наиболее производительный путь интеграции внутри процесса 1С.

Вариант 3: Переосмысление внешних источников данных

Даже если имена баз меняются, попробуйте проанализировать возможность программного управления внешними источниками. В объектной модели 1С существует метод УстановитьПараметрыСоединения для объекта ВнешнийИсточникДанных. Создав шаблон подключения, вы можете динамически перенаправлять его на нужную базу данных без внесения правок в конфигуратор, что снимает вопрос о «ручном исправлении продуктовой базы».

Подводя итог, выбор метода зависит от ваших технических ограничений. Если вы работаете на Windows — используйте классический ADODB. Если же в распоряжении Linux — ориентируйтесь на создание микросервисной архитектуры (прокси-сервис) или использование внешних компонент, так как прямое подключение на уровне платформы в этом случае не поддерживается.

← На главную