В задачах интеграции часто возникает необходимость подключить 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.
Чтобы операционная система Windows "научилась" общаться с PostgreSQL, нам необходимо установить специальный драйвер — psqlodbc. Разберем процесс по шагам.
Это самый важный и критический момент, на котором часто допускают ошибки. Разрядность (32-бит или 64-бит) устанавливаемого ODBC-драйвера должна строго соответствовать разрядности процесса сервера 1С (rphost.exe), который будет выполнять наш код.
rphost.exe. Если в имени процесса есть приписка "*32", значит, сервер 1С 32-битный. Если такой приписки нет (на 64-битной ОС), то сервер 64-битный.Важно: Если вы установите 64-битный драйвер, а сервер 1С будет 32-битным, то 1С просто "не увидит" этот драйвер, и вы продолжите получать ту же самую ошибку.
После установки драйвера лучшей практикой является создание системного источника данных (System DSN). Это именованная настройка подключения, которая хранится в системе. Использование DSN делает строку подключения в коде 1С проще и позволяет централизованно управлять параметрами доступа к базе, не меняя код.
C:\Windows\SysWOW64\odbcad32.exe.PostgresServiceDB. Это имя мы будем использовать в коде 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;";
Если даже после установки драйвера и настройки DSN тест соединения не проходит, проблема находится на стороне сети или сервера PostgreSQL.
Test-NetConnection -ComputerName 192.168.130.18 -Port 5434
Если `TcpTestSucceeded` равно `False`, значит, соединение блокируется брандмауэром на стороне Windows, Linux или на промежуточном сетевом оборудовании.
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).
sudo systemctl restart postgresql
Выполнив эти шаги, вы подготовите полную цепочку для успешного соединения: 1С → ADO → Драйвер ODBC → Сеть → PostgreSQL. Ошибка «источник данных не найден» будет устранена, и ваш код сможет успешно выполнять запросы к внешней базе данных.