При миграции серверной инфраструктуры 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), не находит их и прерывает загрузку с общим кодом ошибки.
Проанализируем причины. В 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С.
Наиболее надежным и простым способом решения данной проблемы на современных дистрибутивах Linux (Ubuntu, Debian) является использование драйвера от MariaDB. MariaDB является ответвлением (форком) MySQL, и их протоколы передачи данных совместимы. Драйвер odbc-mariadb, доступный в официальных репозиториях Ubuntu, собран именно под текущую версию операционной системы и имеет все необходимые зависимости.
Разберем процесс установки и настройки по шагам.
Вместо попыток ручной установки .deb пакетов с сайта MySQL, воспользуемся пакетным менеджером apt. Выполним команду в терминале сервера:
sudo apt-get update
sudo apt-get install odbc-mariadb
Эта команда установит совместимый ODBC-драйвер. Процесс займет совсем немного времени и автоматически подтянет все нужные системные библиотеки.
После установки нам необходимо убедиться, что драйвер зарегистрировался в системе 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/). Если путь не стандартный, там был бы полный путь к файлу.
Теперь перейдем к коду 1С. Ранее, при попытке использовать драйвер MySQL, строка подключения могла выглядеть так, ссылаясь на секцию [MySQL] или имя файла драйвера MySQL. Теперь нам нужно указать драйвер MariaDB.
Существует два способа указания драйвера в строке соединения (Connection String):
Driver точное название секции в квадратных скобках из файла настроек..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.
Если вы настраиваете Внешний источник данных в конфигураторе:
Driver={MariaDB Unicode};Server=... (имя драйвера должно совпадать с тем, что в odbcinst.ini).Если в /etc/odbcinst.ini секция называется [MariaDB Unicode], то в строке подключения параметр должен быть именно Driver={MariaDB Unicode}.
Давайте подробнее разберем, как 1С находит нужный драйвер, чтобы избежать путаницы в будущем.
В Linux системе ODBC управляется двумя основными файлами:
/etc/odbcinst.ini — список установленных драйверов. Здесь мы связываем "Имя драйвера" (например, "MariaDB Unicode") с физическим файлом библиотеки (libmaodbc.so)./etc/odbc.ini — список настроенных источников данных (DSN - Data Source Name). Здесь можно заранее прописать параметры подключения (хост, базу, логин) и дать этому набору имя.Если вы используете 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") считается использование корректного имени драйвера, чтобы будущие администраторы понимали, какая именно библиотека используется.
Подведем итоги решения проблемы подключения:
sudo apt-get install odbc-mariadb./etc/odbcinst.ini.Driver на то имя, которое указано в конфигурационном файле (обычно MariaDB Unicode).Используя этот подход, вы обеспечите стабильное соединение сервера 1С с базой данных, используя нативные библиотеки дистрибутива Linux, что гарантирует отсутствие проблем при последующих обновлениях системы.