Как подключиться к базе SQL из 1С на сервере Linux?

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

При переносе серверной инфраструктуры 1С:Предприятие на операционную систему Linux разработчики часто сталкиваются с неработоспособностью привычных механизмов интеграции. Попытка создать привычный COM-объект с помощью конструкции Новый COMОбъект("ADODB.Connection") завершается ошибкой, так как технология COM (Component Object Model) является проприетарной технологией Microsoft и поддерживается исключительно в среде Windows.

Разберем основные и наиболее надежные способы организации прямого взаимодействия с реляционными СУБД из 1С на платформе Linux, выясним причины типичных ошибок и проанализируем настройку параметров подключения.

Использование механизма внешних источников данных и unixODBC

Основным платформенным решением для прямой работы с таблицами внешних реляционных баз данных (MS SQL Server, PostgreSQL, MySQL, Oracle) в среде Linux является объект метаданных Внешние источники данных. Платформа 1С взаимодействует с внешними базами через системный менеджер драйверов unixODBC.

Рассмотрим по шагам процесс подготовки среды и конфигурации:

  1. Установка менеджера драйверов и необходимого ODBC-драйвера в ОС Linux: В операционной системе должны быть установлены пакеты unixodbc, а также специализированный драйвер СУБД (например, msodbcsql для Microsoft SQL Server).
  2. Настройка драйвера в системе: Конфигурация драйверов прописывается в системном файле /etc/odbcinst.ini. Пользователь ОС, от имени которого запущен процесс сервера 1С (обычно usr1cv8), обязательно должен иметь права на чтение этого файла и библиотек драйвера. Ошибка вида Can't open lib свидетельствует о неверном пути к библиотеке драйвера .so или об отсутствии прав доступа.
  3. Добавление источника в дерево метаданных: В дереве конфигуратора добавляется объект ВнешнийИсточникДанных, в котором описываются необходимые таблицы и поля.

Посмотрим на пример формирования строки соединения без предварительного создания DSN (DSN-less подключение). Прямое указание драйвера и параметров в строке соединения снижает зависимость от локальных конфигурационных файлов пользователя:


СтрокаПодключения = "DRIVER={ODBC Driver 17 for SQL Server};"
    + "SERVER=192.168.1.100,1433;"
    + "DATABASE=ExternalDB;"
    + "UID=db_user;"
    + "PWD=secret_password;"
    + "TrustServerCertificate=yes;"
    + "Connection Timeout=15;";

Разберем программное управление сеансом подключения к внешнему источнику данных из встроенного языка 1С. Для установки параметров и открытия сессии используем методы менеджера источника данных:


ИмяИсточника = "МойВнешнийSQL";

// Разрываем предыдущее соединение при его наличии
ВнешниеИсточникиДанных[ИмяИсточника].РазорватьСоединение();

// Устанавливаем параметры подключения для текущего сеанса
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = СтрокаПодключения;

ВнешниеИсточникиДанных[ИмяИсточника].УстановитьПараметрыСоединенияПользователя(ПараметрыСоединения);
ВнешниеИсточникиДанных[ИмяИсточника].УстановитьСоединение();

Почему зависает подключение к SQL и как это исправить?

Проанализируем распространенную ситуацию: первичное подключение к базе данных проходит успешно, однако при повторной попытке подключения процесс rphost или сеанс пользователя зависает. Выделим основные причины такого поведения и способы их устранения:

  1. Конфликт встроенного пула соединений (Connection Pooling): Диспетчер unixODBC может удерживать неактивные соединения в собственном пуле, что конфликтует с многопоточной моделью сервера 1С. Для решения проблемы отключим пулинг в конфигурационном файле /etc/odbcinst.ini, прописав в секции [ODBC] строчку Pooling = No.
  2. Некорректная многопоточность драйвера (Threading): Сервер 1С обращается к драйверу параллельно из нескольких потоков. Чтобы избежать взаимных блокировок (deadlock), укажем уровень потокобезопасности драйвера в /etc/odbcinst.ini: параметр Threading = 1 (блокировка драйвера) или Threading = 2 (блокировка на уровне дескриптора соединения).
  3. Отсутствие таймаутов на сетевом уровне: При потере пакетов или зависании транзакции драйвер без явных ограничений переходит в бесконечное ожидание сокета. Рекомендуется обязательно указывать Connection Timeout=15;LoginTimeout=15; прямо в строке соединения.
  4. Ошибки TLS/SSL-шифрования: Современные версии ODBC-драйверов по умолчанию форсируют шифрование трафика. При отсутствии валидного сертификата драйвер может циклично повторять рукопожатие. Добавление параметра TrustServerCertificate=yes; (или Encrypt=no;) решает проблему подвисания на этапе согласования TLS.

Альтернативные способы интеграции на Linux

Если специфика инфраструктуры или сложность администрирования ODBC не позволяют использовать внешние источники данных, рассмотрим альтернативные варианты интеграции:

  1. Промежуточные HTTP-сервисы и REST API: Создание микросервиса (на Python, Node.js, Go) или использование готового REST API целевой СУБД. В 1С обращение выполняется через объекты HTTPСоединение и HTTPЗапрос. Этот подход полностью изолирует сервер 1С от низкоуровневых драйверов баз данных.
  2. Внешние компоненты Native API: Подключение динамической библиотеки (.so) через метод платформы ПодключитьВнешнююКомпоненту(). Компонента реализует прямой доступ к клиентским библиотекам СУБД и возвращает результат в сеанс 1С.
← На главную