При разработке механизмов интеграции 1С с внешними базами данных через технологию ADO (ActiveX Data Objects) часто возникает необходимость предоставить пользователю выбор доступных драйверов (провайдеров). Поскольку набор установленных провайдеров на разных серверах и рабочих станциях может значительно отличаться, жесткое прописывание строки соединения в коде не всегда оправдано. В этой статье мы подробно разберем несколько способов получения списка установленных OLE DB провайдеров, используя как стандартные средства Windows, так и программный доступ к системным ресурсам.
Это наиболее простой и надежный метод. Вместо того чтобы вручную собирать список, мы можем вызвать штатное окно Windows «Свойства связи с данными». Этот способ хорош тем, что операционная система сама отфильтрует провайдеры в зависимости от разрядности запущенного процесса (x86 или x64), что критически важно для корректной работы 1С.
Для реализации этого метода мы воспользуемся COM-объектом MSDASC.DataLinks. Рассмотрим пример кода:
Функция ПолучитьСтрокуСоединенияЧерезДиалог()
Попытка
Диалог = Новый COMОбъект("MSDASC.DataLinks");
Соединение = Новый COMОбъект("ADODB.Connection");
// Метод PromptNew() открывает стандартное окно выбора провайдера
Если Диалог.PromptEdit(Соединение) Тогда
Возврат Соединение.ConnectionString;
КонецЕсли;
Исключение
Сообщить("Не удалось открыть диалог выбора провайдеров: " + ОписаниеОшибки());
КонецПопытки;
Возврат Неопределено;
КонецФункции
Разберем, что происходит в этом фрагменте. Мы создаем объект DataLinks, который управляет настройками соединений. Метод PromptEdit принимает объект Connection и открывает модальное окно. Если пользователь выбрал провайдера и нажал «ОК», объект Соединение заполняется готовой строкой подключения, которую можно сохранить или использовать сразу.
Если нам нужно не просто показать диалог, а получить список названий провайдеров в виде таблицы или массива для использования в собственном интерфейсе 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=... строки соединения.
Рассмотрим более низкоуровневый подход, который обсуждался участниками форума. Все OLE DB провайдеры регистрируются в системном реестре в ветке HKEY_CLASSES_ROOT. Каждый провайдер имеет уникальный идентификатор CLSID.
Чтобы найти провайдеры вручную или программно через реестр, нужно выполнить следующие шаги:
HKEY_CLASSES_ROOT\CLSID.OLE DB Provider.ProgID) находится программное имя для использования в коде.Внимание! При работе в 64-битных системах Windows существует нюанс: 32-битные провайдеры хранятся в отдельной ветке HKEY_CLASSES_ROOT\Wow6432Node\CLSID. Если ваша платформа 1С работает в 32-битном режиме, она будет «видеть» провайдеры именно из этой ветки. Это объясняет, почему, например, провайдер Microsoft Jet 4.0 доступен в 32-битных приложениях, но отсутствует в 64-битных.
Проанализируем наиболее часто встречающиеся провайдеры, которые вы можете обнаружить в полученном списке, и выясним их назначение:
Подведем итог нашему исследованию. Если ваша цель — дать пользователю инструмент настройки «под себя», используйте Способ 1 (Диалог). Это избавит вас от написания лишнего кода и обеспечит стопроцентную совместимость с системными настройками.
Если же вы пишете сложную систему мониторинга или универсальную обработку обмена данными, где нужно программно проверять наличие драйверов перед запуском задачи, используйте Способ 2 (MSDAENUM). Он более современный и правильный с точки зрения архитектуры Windows, чем прямой перебор реестра, так как учитывает права доступа и текущий контекст безопасности процесса 1С.