При необходимости получить данные из сторонней базы PostgreSQL в среде 1С программисты часто сталкиваются с ошибками вроде «Недопустимый атрибут строки соединения» или «Источник данных не найден и не указан драйвер». Эти ошибки могут запутать, так как они не указывают напрямую на причину, которая может крыться как в коде, так и в системных настройках сервера или клиента. В этой статье мы совместно разберем процесс настройки подключения, проанализируем типичные ошибки и выясним, как обеспечить стабильную связь между 1С и PostgreSQL.
Разберем ситуацию, когда при попытке соединения возникает исключение «Microsoft OLE DB Provider for SQL Server: Недопустимый атрибут строки соединения». Проанализируем код и выполнение запросов через COM-подключение, которые часто становятся источником этой проблемы:
ConnectString="Provider=SQLOLEDB;Data Source="+Cервер+";DatabaseName="+База+";UID="+Пользователь+";PWD="+Пароль;
Соединение=Новый COMОбъект("ADODB.Connection");
Соединение.Open(ConnectString);
Основная ошибка здесь заключается в параметре Provider=SQLOLEDB. Этот провайдер предназначен исключительно для работы с Microsoft SQL Server. При попытке передать ему специфичные для PostgreSQL параметры (или даже стандартные, но направленные на другой тип СУБД), драйвер выдает ошибку о недопустимом атрибуте. Чтобы успешно подключиться к PostgreSQL через механизм COM-объектов, нам необходимо использовать мост ODBC. Для этого в качестве провайдера следует указывать MSDASQL.
Перейдем к следующему этапу. Чтобы 1С «увидела» базу PostgreSQL, на компьютере должен быть установлен соответствующий драйвер. Рассмотрим важные моменты, которые часто упускают из виду:
PostgreSQL Unicode или PostgreSQL ANSI.Рассмотрим несколько вариантов строк подключения, которые зависят от версии установленного драйвера. Мы будем использовать объект ADODB.Connection и провайдер MSDASQL. Обратите внимание на синтаксис:
// Создаем объект соединения
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Provider = "MSDASQL.1";
// Вариант 1: Использование Unicode драйвера (рекомендуется для корректной работы с кириллицей)
ConnectionString = "Driver={PostgreSQL UNICODE};Server=srv1;Port=5432;Database=b1c;Uid=adm;Pwd=111;";
// Вариант 2: Если база требует SSL соединения
ConnectionString = "Driver={PostgreSQL UNICODE};Server=srv1;Port=5432;Database=b1c;Uid=adm;Pwd=111;sslmode=require;";
Попытка
Соединение.Open(ConnectionString);
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Если вы получаете ошибку «Источник данных не найден», это означает, что текст в фигурных скобках Driver={...} не совпадает с именем драйвера. Проверьте реестр, утилиту odbcad32.exe.
На 64-битных операционных системах Windows существуют две версии администратора ODBC, управлять которыми помогает командная строка Windows. Это часто становится причиной путаницы, когда драйвер вроде бы установлен, но 1С его не видит:
C:\Windows\System32\odbcad32.exe. Используйте её для настройки соединений сервера 1С (x64).C:\Windows\SysWOW64\odbcad32.exe. Используйте её для настройки соединений 32-битного клиента.Всегда проверяйте наличие драйвера именно в той версии утилиты, которая соответствует разрядности вашего приложения 1С.
Даже при идеально написанном коде в 1С, PostgreSQL может отклонить соединение. Разберем, что нужно проверить на стороне сервера базы данных:
host all all 192.168.1.0/24 md5 (или scram-sha-256 для новых версий).listen_addresses. Если там указано 'localhost', сервер не примет внешние подключения. Для разрешения всех подключений установите listen_addresses = '*'.scram-sha-256. Старые версии ODBC драйверов могут его не поддерживать. В таком случае стоит либо обновить драйвер, либо временно переключить метод аутентификации пользователя в md5.Для более надежной работы, особенно если вы планируете не только читать, но и записывать данные, в строку подключения полезно добавить параметры управления кодировкой и поведением типов данных. Посмотрим на расширенный пример:
ConnectionString = "Driver={PostgreSQL UNICODE};Server=srv1;Database=b1c;Uid=adm;Pwd=111;STMT=set client_encoding to 'UTF8';ReadOnly=0;BoolsAsChar=0;";
Параметр STMT=set client_encoding to 'UTF8'; гарантирует, что строковые данные будут передаваться в кодировке UTF-8, что критично для 1С. Параметр BoolsAsChar=0 помогает драйверу правильно интерпретировать логические типы PostgreSQL (boolean) как значения, понятные для 1С.
Рассмотрим еще один важный момент. Начиная с версии платформы 8.3, 1С предоставляет мощный инструмент — «Внешние источники данных». Вместо того чтобы писать громоздкий код на ADO и вручную управлять COM-объектами, мы можем добавить таблицы PostgreSQL прямо в дерево конфигурации. Это позволяет:
Новый Запрос).Для настройки внешнего источника данных вам также потребуется установленный ODBC драйвер, но управление соединением платформа возьмет на себя, что значительно упрощает отладку и поддержку кода.
Подведем итог: Для решения проблемы «Недопустимого атрибута» необходимо заменить провайдера на MSDASQL, установить ODBC драйвер соответствующей разрядности и убедиться, что имя драйвера в строке Driver={...} точно соответствует системному. Тщательная проверка настроек сервера PostgreSQL завершит процесс настройки и обеспечит стабильный обмен данными.