При интеграции систем часто возникает необходимость связать информационную базу 1С со сторонними базами данных под управлением СУБД PostgreSQL. В среде Linux эта задача решается с помощью механизма внешних источников данных и диспетчера драйверов unixODBC. Однако при первой попытке настроить соединение разработчики нередко сталкиваются с ошибкой ODBC SQLSTATE: IM002 [unixODBC][Driver Manager] Data source name not found, and no default driver specified. Разберем по шагам, почему возникает эта ошибка и как правильно настроить связку 1С, unixODBC и PostgreSQL на сервере под управлением Linux.
Проанализируем ситуацию: сообщение Data source name not found, and no default driver specified означает, что диспетчер ODBC-драйверов операционной системы не смог найти зарегистрированный драйвер с именем, указанным в параметре Driver={...}, либо в системе отсутствует настроенный системный источник данных (DSN). В большинстве случаев это происходит по двум причинам: в операционной системе не установлен пакет драйвера PostgreSQL ODBC или в системном конфигурационном файле /etc/odbcinst.ini не прописана секция с описанием параметров драйвера.
Для работы внешних источников данных 1С на базе дистрибутивов Ubuntu/Debian нам понадобятся диспетчер unixODBC, утилиты администрирования и сам драйвер PostgreSQL ODBC. Выполним установку необходимых пакетов через терминал:
sudo apt-get update
sudo apt-get install unixodbc unixodbc-bin unixodbc-dev odbcinst odbc-postgresql
Пакет odbc-postgresql содержит необходимые разделяемые библиотеки драйвера — версию ANSI (psqlodbca.so) и версию Unicode (psqlodbcw.so). Для корректной работы с русскоязычными строками и платформой 1С:Предприятие 8 всегда следует использовать версию Unicode.
После установки пакетов пропишем драйвер в глобальном конфигурационном файле /etc/odbcinst.ini. Откроем файл для редактирования с правами суперпользователя:
sudo nano /etc/odbcinst.ini
Добавим в файл описание секции драйвера Unicode (название секции в квадратных скобках будет использоваться в строке подключения 1С):
[PostgreSQL-U]
Description = PostgreSQL ODBC driver (Unicode version)
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
Debug = 0
CommLog = 0
UsageCount = 1
Обратите внимание: пути к файлам psqlodbcw.so и libodbcpsqlS.so могут отличаться в зависимости от архитектуры и версии дистрибутива. Проверить их точное расположение в файловой системе можно с помощью команды find /usr/lib -name psqlodbcw.so.
Теперь перейдем в конфигуратор 1С и настроим подключение без создания предварительного DSN (Direct/DSN-less connection):
DRIVER={PostgreSQL-U};Database=BazaTest;Server=192.168.1.100;Port=5432;
где DRIVER={PostgreSQL-U} — точное имя секции, заданное в /etc/odbcinst.ini (с учетом регистра), Database — имя базы данных, а Server — IP-адрес или DNS-имя сервера PostgreSQL.PostgreSQL.Истина и укажем логин и пароль пользователя СУБД.Если внешний источник данных подключается к базе данных, созданной платформой 1С, имена таблиц в СУБД будут иметь технический вид (например, _reference128 для справочника или _document250 для документа). Чтобы быстро сопоставить объекты метаданных и физические таблицы в PostgreSQL, выполним встроенную функцию платформы ПолучитьСтруктуруХраненияБазыДанных():
&НаСервере
Процедура ОпределитьИменаТаблицНаСервере()
// Получаем таблицу значений со списком всех таблиц и полей базы данных
ТаблицаХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
// Результат можно проанализировать через отладчик или выгрузить в отчет
Для Каждого СтрокаТаблицы Из ТаблицаХранения Цикл
ИмяОбъектаМетаданных = СтрокаТаблицы.ИмяТаблицыХранения;
ИмяВБазеДанных = СтрокаТаблицы.ИмяТаблицы;
КонецЦикла;
КонецПроцедуры
Разберем типичные проблемы, которые могут возникнуть в процессе эксплуатации:
odbcinst -j в консоли Linux показывает актуальные пути к файлам odbcinst.ini и odbc.ini. Убедимся, что изменения внесены именно в те файлы, которые считывает система.ldd /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so. В выводе не должно быть записей not found.isql из состава пакета unixodbc-bin:
isql -v -k "DRIVER={PostgreSQL-U};Server=192.168.1.100;Port=5432;Database=BazaTest;Uid=postgres_user;Pwd=secret_pass;"
/etc/odbcinst.ini и сами библиотеки *.so должны иметь права на чтение для пользователя ОС, от имени которого запущен сервер 1С (по умолчанию usr1cv8).