Как получить список всех ADODB провайдеров в системе?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов интеграции 1С с внешними базами данных через технологию ADO (ActiveX Data Objects) часто возникает необходимость предоставить пользователю выбор доступных драйверов (провайдеров). Поскольку набор установленных провайдеров на разных серверах и рабочих станциях может значительно отличаться, жесткое прописывание строки соединения в коде не всегда оправдано. В этой статье мы подробно разберем несколько способов получения списка установленных OLE DB провайдеров, используя как стандартные средства Windows, так и программный доступ к системным ресурсам.

Способ 1: Использование стандартного системного диалога (MSDASC)

Это наиболее простой и надежный метод. Вместо того чтобы вручную собирать список, мы можем вызвать штатное окно Windows «Свойства связи с данными». Этот способ хорош тем, что операционная система сама отфильтрует провайдеры в зависимости от разрядности запущенного процесса (x86 или x64), что критически важно для корректной работы 1С.

Для реализации этого метода мы воспользуемся COM-объектом MSDASC.DataLinks. Рассмотрим пример кода:


Функция ПолучитьСтрокуСоединенияЧерезДиалог()
    Попытка
        Диалог = Новый COMОбъект("MSDASC.DataLinks");
        Соединение = Новый COMОбъект("ADODB.Connection");
        
        // Метод PromptNew() открывает стандартное окно выбора провайдера
        Если Диалог.PromptEdit(Соединение) Тогда
            Возврат Соединение.ConnectionString;
        КонецЕсли;
    Исключение
        Сообщить("Не удалось открыть диалог выбора провайдеров: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат Неопределено;
КонецФункции

Разберем, что происходит в этом фрагменте. Мы создаем объект DataLinks, который управляет настройками соединений. Метод PromptEdit принимает объект Connection и открывает модальное окно. Если пользователь выбрал провайдера и нажал «ОК», объект Соединение заполняется готовой строкой подключения, которую можно сохранить или использовать сразу.

Способ 2: Программное получение списка через Microsoft OLE DB Enumerator

Если нам нужно не просто показать диалог, а получить список названий провайдеров в виде таблицы или массива для использования в собственном интерфейсе 1С, следует использовать специализированный перечислитель MSDAENUM. Этот объект предназначен именно для сканирования системы на наличие зарегистрированных поставщиков данных.

Проанализируем алгоритм работы с этим объектом. Перечислитель возвращает стандартный Recordset, который мы можем перебрать в цикле:


Процедура ВывестиСписокПровайдеров()
    Попытка
        // Создаем объект перечислителя
        Enumerator = Новый COMОбъект("MSDAENUM");
        
        // Получаем набор данных со всеми источниками
        // Используем специфический интерфейс для получения Recordset
        Источники = Enumerator.GetSourcesRowset(Неопределено, "{C8B522BC-5CF3-11CE-ADE5-00AA0044773D}", 0);
        
        // Нам понадобится ADODB.Recordset для чтения результата
        НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
        НаборЗаписей.Open(Источники);
        
        Пока НЕ НаборЗаписей.EOF Цикл
            // SOURCES_NAME - программный идентификатор (например, SQLOLEDB)
            // SOURCES_DESCRIPTION - человекочитаемое описание
            ИмяПровайдера = НаборЗаписей.Fields("SOURCES_NAME").Value;
            ОписаниеПровайдера = НаборЗаписей.Fields("SOURCES_DESCRIPTION").Value;
            ТипИсточника = НаборЗаписей.Fields("SOURCES_TYPE").Value;
            
            // Тип 1 означает, что это именно OLE DB Provider
            Если ТипИсточника = 1 Тогда
                Сообщить(Строка(ИмяПровайдера) + " --- " + Строка(ОписаниеПровайдера));
            КонецЕсли;
            
            НаборЗаписей.MoveNext();
        КонецЦикла;
        
        НаборЗаписей.Close();
    Исключение
        Сообщить("Ошибка при получении списка: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Этот метод позволяет получить «чистые» данные без участия пользователя. Важно помнить, что поле SOURCES_NAME — это именно то, что нужно подставлять в параметр Provider=... строки соединения.

Способ 3: Прямое чтение из реестра Windows

Рассмотрим более низкоуровневый подход, который обсуждался участниками форума. Все OLE DB провайдеры регистрируются в системном реестре в ветке HKEY_CLASSES_ROOT. Каждый провайдер имеет уникальный идентификатор CLSID.

Чтобы найти провайдеры вручную или программно через реестр, нужно выполнить следующие шаги:

  1. Просмотреть все подразделы в ветке HKEY_CLASSES_ROOT\CLSID.
  2. Искать те ключи, внутри которых присутствует подраздел OLE DB Provider.
  3. Значение по умолчанию этого подраздела обычно содержит дружелюбное название провайдера.
  4. Рядом (в родительском ключе или в ProgID) находится программное имя для использования в коде.

Внимание! При работе в 64-битных системах Windows существует нюанс: 32-битные провайдеры хранятся в отдельной ветке HKEY_CLASSES_ROOT\Wow6432Node\CLSID. Если ваша платформа 1С работает в 32-битном режиме, она будет «видеть» провайдеры именно из этой ветки. Это объясняет, почему, например, провайдер Microsoft Jet 4.0 доступен в 32-битных приложениях, но отсутствует в 64-битных.

Сводная таблица популярных провайдеров

Проанализируем наиболее часто встречающиеся провайдеры, которые вы можете обнаружить в полученном списке, и выясним их назначение:

Рекомендации по выбору метода

Подведем итог нашему исследованию. Если ваша цель — дать пользователю инструмент настройки «под себя», используйте Способ 1 (Диалог). Это избавит вас от написания лишнего кода и обеспечит стопроцентную совместимость с системными настройками.

Если же вы пишете сложную систему мониторинга или универсальную обработку обмена данными, где нужно программно проверять наличие драйверов перед запуском задачи, используйте Способ 2 (MSDAENUM). Он более современный и правильный с точки зрения архитектуры Windows, чем прямой перебор реестра, так как учитывает права доступа и текущий контекст безопасности процесса 1С.

← На главную