Как устранить ошибку ODBC "File not found" при подключении 1С на Ubuntu к базе MySQL?

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

При миграции серверной инфраструктуры 1С с Windows на Linux (в частности, на популярный дистрибутив Ubuntu 22.04) администраторы часто сталкиваются с проблемами настройки внешних источников данных. Одна из самых распространенных ситуаций — необходимость подключить сервер 1С к внешней базе данных MySQL. В Windows эта задача решается установкой MSI-пакета драйвера, но в Linux механизм взаимодействия через ODBC имеет свои особенности.

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

Суть проблемы и диагностика ошибки

Разберем типичный сценарий. У нас есть сервер 1С:Предприятие (64 bit), развернутый на Ubuntu 22.04. Нам необходимо подключиться к базе данных MySQL (которая может находиться на этом же сервере или на другом). Для этого мы устанавливаем unixodbc и скачиваем официальный коннектор с сайта MySQL (например, mysql-connector-odbc).

Однако при выполнении кода подключения в 1С мы получаем следующее сообщение об ошибке:

Ошибка ODBC. SQLSTATE: 01000 Номер ошибки: 0 Описание: [unixODBC][Driver Manager]Can't open lib '/usr/lib/x86_64-linux-gnu/odbc/libmyodbc9w.so' : file not found

При этом, если мы проверим наличие файла командой ls -la в консоли Linux, мы увидим, что файл /usr/lib/x86_64-linux-gnu/odbc/libmyodbc9w.so существует и права на него установлены корректно. Возникает логичный вопрос: почему система не видит файл, который есть?

Важный момент: В среде Linux сообщение "file not found" при попытке загрузить динамическую библиотеку (shared object, .so) часто означает не отсутствие самого файла, а отсутствие одной из его зависимостей. Системный загрузчик пытается открыть библиотеку драйвера, видит, что ей нужны другие библиотеки (например, определенная версия OpenSSL), не находит их и прерывает загрузку с общим кодом ошибки.

Почему не работает официальный драйвер MySQL?

Проанализируем причины. В Ubuntu 22.04 произошел переход на новые версии системных библиотек (в частности, OpenSSL 3.0). Официальные пакеты драйверов MySQL (от Oracle) часто собираются с зависимостью от старых библиотек (например, libssl1.1), которые исключены из стандартной поставки новых дистрибутивов Ubuntu.

Если бы мы использовали утилиту диагностики ldd для файла драйвера, мы бы увидели картину, похожую на эту:


ldd /usr/lib/x86_64-linux-gnu/odbc/libmyodbc9w.so
    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

Именно эти "not found" зависимости и приводят к ошибке в 1С.

Решение: Использование драйвера MariaDB Connector

Наиболее надежным и простым способом решения данной проблемы на современных дистрибутивах Linux (Ubuntu, Debian) является использование драйвера от MariaDB. MariaDB является ответвлением (форком) MySQL, и их протоколы передачи данных совместимы. Драйвер odbc-mariadb, доступный в официальных репозиториях Ubuntu, собран именно под текущую версию операционной системы и имеет все необходимые зависимости.

Разберем процесс установки и настройки по шагам.

Шаг 1. Установка драйвера

Вместо попыток ручной установки .deb пакетов с сайта MySQL, воспользуемся пакетным менеджером apt. Выполним команду в терминале сервера:


sudo apt-get update
sudo apt-get install odbc-mariadb

Эта команда установит совместимый ODBC-драйвер. Процесс займет совсем немного времени и автоматически подтянет все нужные системные библиотеки.

Шаг 2. Проверка конфигурации драйверов

После установки нам необходимо убедиться, что драйвер зарегистрировался в системе unixODBC. Для этого проанализируем содержимое файла /etc/odbcinst.ini. Этот файл служит реестром доступных драйверов.

Откроем файл для просмотра:


cat /etc/odbcinst.ini

Мы должны увидеть секцию, похожую на эту (название секции может отличаться, но обычно это MariaDB Unicode):


[MariaDB Unicode]
Driver=libmaodbc.so
Description=MariaDB Connector/ODBC(Unicode)
Threading=0
UsageCount=1

Обратите внимание на параметр Driver=libmaodbc.so. В данном случае указано только имя файла, так как библиотека лежит в стандартном пути, известном системе (обычно /usr/lib/x86_64-linux-gnu/odbc/). Если путь не стандартный, там был бы полный путь к файлу.

Шаг 3. Настройка строки подключения в 1С

Теперь перейдем к коду 1С. Ранее, при попытке использовать драйвер MySQL, строка подключения могла выглядеть так, ссылаясь на секцию [MySQL] или имя файла драйвера MySQL. Теперь нам нужно указать драйвер MariaDB.

Существует два способа указания драйвера в строке соединения (Connection String):

  1. По имени секции в odbcinst.ini (Рекомендуемый). Вы указываете в параметре Driver точное название секции в квадратных скобках из файла настроек.
  2. По прямому пути к файлу. Вы указываете полный путь к файлу .so.

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


Попытка
    // Создаем объект COM-объекта (в Windows) или используем AddIn, 
    // но на Linux чаще всего используется прямое создание через внешние источники 
    // или объект "Connection" из ADODB не доступен, поэтому используется провайдер SQL.
    // В контексте 1С на Linux для внешних источников данных часто используется строка:
    
    СтрокаПодключения = "Driver={MariaDB Unicode};Server=localhost;Database=my_db_name;User=my_user;Password=my_password;Option=3;";
    
    // Если мы используем объект ВнешнийИсточникДанных, то эту строку мы прописываем в свойствах.
    // Если мы используем код для прямого подключения (например через внешнюю компоненту или провайдер):
    
    Соединение = Новый COMОбъект("ADODB.Connection"); // На Linux это работать НЕ будет напрямую без Wine.
    // На Linux подключение обычно настраивается через дерево метаданных "Внешние источники данных".
    
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;

Важное уточнение для Linux: В среде Linux нет реестра Windows и COM-объектов ADODB в том виде, как мы привыкли. Взаимодействие идет через библиотеку unixODBC.

Если вы настраиваете Внешний источник данных в конфигураторе:

  1. Откройте свойства внешнего источника.
  2. В поле "Строка соединения" укажите: Driver={MariaDB Unicode};Server=... (имя драйвера должно совпадать с тем, что в odbcinst.ini).

Если в /etc/odbcinst.ini секция называется [MariaDB Unicode], то в строке подключения параметр должен быть именно Driver={MariaDB Unicode}.

Разбор нюансов конфигурационных файлов

Давайте подробнее разберем, как 1С находит нужный драйвер, чтобы избежать путаницы в будущем.

В Linux системе ODBC управляется двумя основными файлами:

Если вы используете DSN (системный источник данных), то в 1С строка подключения будет очень короткой: DSN=MyDatabaseName;. В этом случае файл odbc.ini должен выглядеть так:


[MyDatabaseName]
Driver=MariaDB Unicode
Server=127.0.0.1
Database=test_db
User=admin
Password=secret
Port=3306

Однако чаще программисты 1С используют DSN-less connection (подключение без DSN), прописывая все параметры прямо в коде. В этом случае odbc.ini не нужен, но odbcinst.ini обязателен, так как именно из него система понимает, какой файл библиотеки загружать при упоминании Driver={MariaDB Unicode}.

Что делать, если старый драйвер остался в конфигах?

В обсуждении проблемы автор заметил, что у него в файле настроек остались записи от старого драйвера MySQL:


[MySQL]
Description=MySQL ODBC Driver
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc9w.so
Usagecount=1

Если вы в 1С продолжаете использовать строку Driver={MySQL}, система будет пытаться загрузить именно libmyodbc9w.so, который не работает из-за зависимостей. Само наличие нового драйвера MariaDB рядом не исправит ситуацию, пока вы явно не укажете его в строке подключения или не перенастроите секцию [MySQL] на использование новой библиотеки.

Рекомендация: Чтобы не переписывать код в 1С (если там жестко прописано "MySQL"), можно пойти на хитрость — изменить путь в секции [MySQL] файла /etc/odbcinst.ini, указав там библиотеку от MariaDB:


[MySQL]
Description=MySQL ODBC Driver (Replaced by MariaDB)
Driver=libmaodbc.so
...

Однако более правильным подходом ("Best Practice") считается использование корректного имени драйвера, чтобы будущие администраторы понимали, какая именно библиотека используется.

Резюме

Подведем итоги решения проблемы подключения:

  1. Ошибка "File not found" для существующего драйвера ODBC в Linux почти всегда означает проблему с зависимостями библиотек (часто OpenSSL).
  2. Для Ubuntu 22.04 и новее лучшим выбором для работы с MySQL является драйвер MariaDB Connector/ODBC.
  3. Установка выполняется командой sudo apt-get install odbc-mariadb.
  4. После установки необходимо проверить имя секции драйвера в /etc/odbcinst.ini.
  5. В строке подключения 1С необходимо изменить параметр Driver на то имя, которое указано в конфигурационном файле (обычно MariaDB Unicode).

Используя этот подход, вы обеспечите стабильное соединение сервера 1С с базой данных, используя нативные библиотеки дистрибутива Linux, что гарантирует отсутствие проблем при последующих обновлениях системы.

← На главную