Как подключиться из 1С на Windows к PostgreSQL на Linux и исправить ошибку «источник данных не найден»?

Программист
← На главную

В задачах интеграции часто возникает необходимость подключить 1С, работающую на сервере Windows, к внешней базе данных, например, PostgreSQL, развернутой на Linux. Стандартным способом для таких задач является использование технологии ADO (ActiveX Data Objects). Однако при настройке такого подключения можно столкнуться с ошибками, которые на первый взгляд не очевидны. Рассмотрим типичную ситуацию: есть код для подключения, но при его выполнении система выдает ошибку «Диспетчер драйверов ODBC источник данных не найден». Выясним причину этой ошибки и разберем по шагам, как ее исправить.

Анализ проблемы и исходного кода

Давайте проанализируем ситуацию, описанную на форуме. Автор пытается выполнить SQL-запрос к базе PostgreSQL из 1С. Для этого используется следующий код:


Connection  = Новый COMОбъект("ADODB.Connection");
Command     = Новый COMОбъект("ADODB.Command");
RecordSet   = Новый COMОбъект("ADODB.RecordSet");

Connection.ConnectionTimeout = ТаймаутЗапроса;
Connection.Open(СокрЛП(СтрокаСоединения));

Command.ActiveConnection = Connection;
Command.CommandText = КомандаЗагрузки;
Command.CommandTimeout = ТаймаутЗапроса;
Command.Execute();

Connection.Close();

Сам по себе этот код абсолютно корректен для работы с ADO. Проблема кроется не в нем, а в том, что происходит внутри метода Connection.Open() и как операционная система Windows обрабатывает переданную строку соединения.

Строка соединения выглядит так:

DRIVER={PostgreSQL Unicode};Data Source=PostgreSQL35W;SERVER=192.168.130.18;PORT=5434;UID=user;PWD=1234ppo;DATABASE=service

Ошибка «Диспетчер драйверов ODBC источник данных не найден» прямо говорит нам о том, что диспетчер ODBC в Windows получил запрос на соединение, но не смог найти драйвер с именем {PostgreSQL Unicode}, который бы умел работать с базой PostgreSQL. Это центральная точка нашей проблемы: на машине, где исполняется код (сервер 1С на Windows), отсутствует или некорректно настроен необходимый "переводчик" между универсальной технологией ODBC и конкретной СУБД PostgreSQL.

Решение: Установка и настройка ODBC-драйвера (psqlodbc)

Чтобы операционная система Windows "научилась" общаться с PostgreSQL, нам необходимо установить специальный драйвер — psqlodbc. Разберем процесс по шагам.

Шаг 1. Выбор и установка драйвера правильной разрядности

Это самый важный и критический момент, на котором часто допускают ошибки. Разрядность (32-бит или 64-бит) устанавливаемого ODBC-драйвера должна строго соответствовать разрядности процесса сервера 1С (rphost.exe), который будет выполнять наш код.

  1. Определяем разрядность сервера 1С. Запустите "Диспетчер задач" на сервере Windows, перейдите на вкладку "Подробности", найдите в списке процесс rphost.exe. Если в имени процесса есть приписка "*32", значит, сервер 1С 32-битный. Если такой приписки нет (на 64-битной ОС), то сервер 64-битный.
  2. Скачиваем нужный драйвер. Перейдите на официальный сайт PostgreSQL в раздел загрузок и найдите установщик ODBC-драйвера (psqlodbc) для Windows нужной вам разрядности (x86 для 32-бит, x64 для 64-бит).
  3. Устанавливаем драйвер. Процесс установки стандартный и не требует особых настроек. Просто следуйте инструкциям мастера установки.

Важно: Если вы установите 64-битный драйвер, а сервер 1С будет 32-битным, то 1С просто "не увидит" этот драйвер, и вы продолжите получать ту же самую ошибку.

Шаг 2. Настройка источника данных (System DSN)

После установки драйвера лучшей практикой является создание системного источника данных (System DSN). Это именованная настройка подключения, которая хранится в системе. Использование DSN делает строку подключения в коде 1С проще и позволяет централизованно управлять параметрами доступа к базе, не меняя код.

  1. Открываем администратор источников данных ODBC. Здесь также важна разрядность.
    • Для 64-битного драйвера: Панель управления → Администрирование → Источники данных ODBC (64-разрядная версия).
    • Для 32-битного драйвера: необходимо запустить 32-битную версию утилиты вручную. Она находится по пути C:\Windows\SysWOW64\odbcad32.exe.
  2. Создаем системный DSN. В открывшемся окне перейдите на вкладку "Системный DSN" (System DSN). Системные источники данных доступны всем пользователям и службам, что необходимо для сервера 1С. Нажмите "Добавить".
  3. Выбираем драйвер. В списке установленных драйверов выберите "PostgreSQL Unicode" (или похожее название, например, "PostgreSQL ODBC Driver(UNICODE)").
  4. Заполняем параметры подключения.
    • Data Source: Придумайте понятное имя для вашего подключения, например, PostgresServiceDB. Это имя мы будем использовать в коде 1С.
    • Database: Имя базы данных (в нашем примере `service`).
    • Server: IP-адрес или DNS-имя сервера Linux (в нашем примере `192.168.130.18`).
    • Port: Порт, на котором работает PostgreSQL (в примере `5434`).
    • User Name: Имя пользователя для подключения (в примере `user`).
    • Password: Пароль пользователя.
  5. Проверяем соединение. Нажмите кнопку "Test". Если все настроено верно (драйвер установлен, сетевой доступ есть, логин/пароль корректны), вы увидите сообщение "Connection successful". Если тест не прошел, проблема не в 1С, а в сетевой доступности или настройках самого PostgreSQL.
  6. Сохраните DSN.

Шаг 3. Корректировка строки соединения в коде 1С

Теперь, когда у нас есть настроенный и проверенный DSN, мы можем значительно упростить строку подключения в коде.

Рекомендуемый вариант (с использованием DSN):

Вместо длинной строки используйте короткую и надежную, ссылающуюся на созданный DSN:

СтрокаСоединения = "DSN=PostgresServiceDB;UID=user;PWD=1234ppo;";

Здесь PostgresServiceDB — это имя, которое вы задали на шаге 2.4. Этот подход более предпочтителен, так как при смене пароля или сервера вам не придется менять код, а достаточно будет отредактировать настройки DSN в Windows.

Альтернативный вариант (DSN-less подключение):

Если вы все же хотите использовать строку без предварительной настройки DSN, убедитесь, что имя драйвера указано в точности так, как оно отображается в администраторе ODBC. Название может отличаться в зависимости от версии. Корректный вариант может выглядеть так:

СтрокаСоединения = "Driver={PostgreSQL ODBC Driver(UNICODE)};Server=192.168.130.18;Port=5434;Database=service;Uid=user;Pwd=1234ppo;";

Шаг 4. Проверка сетевого доступа и настроек PostgreSQL на Linux

Если даже после установки драйвера и настройки DSN тест соединения не проходит, проблема находится на стороне сети или сервера PostgreSQL.

  1. Проверка сетевой доступности. С сервера Windows, где работает 1С, убедитесь, что порт PostgreSQL доступен. Откройте PowerShell и выполните команду:

    Test-NetConnection -ComputerName 192.168.130.18 -Port 5434

    Если `TcpTestSucceeded` равно `False`, значит, соединение блокируется брандмауэром на стороне Windows, Linux или на промежуточном сетевом оборудовании.

  2. Настройка PostgreSQL для приема внешних подключений. По умолчанию PostgreSQL может принимать подключения только с локального хоста. Это нужно изменить.
    • Откройте конфигурационный файл postgresql.conf (обычно находится в /etc/postgresql/<версия>/main/). Найдите параметр listen_addresses и установите его значение в '*', чтобы разрешить подключения со всех сетевых интерфейсов:

      listen_addresses = '*'

    • Откройте файл аутентификации pg_hba.conf (находится в той же папке). Добавьте в конец файла строку, разрешающую подключение для вашего пользователя с IP-адреса сервера 1С. Например, если IP сервера 1С — 192.168.130.50:

      host   service   user   192.168.130.50/32   md5

      Эта строка означает: разрешить подключение (host) к базе `service` для пользователя `user` с IP-адреса `192.168.130.50` с использованием пароля (md5).

  3. Перезапустите службу PostgreSQL на сервере Linux, чтобы применить изменения:

    sudo systemctl restart postgresql

Выполнив эти шаги, вы подготовите полную цепочку для успешного соединения: 1С → ADO → Драйвер ODBC → Сеть → PostgreSQL. Ошибка «источник данных не найден» будет устранена, и ваш код сможет успешно выполнять запросы к внешней базе данных.

← На главную