Как зарегистрировать компоненту comcntr.dll, не зная пути к платформе 1С?

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

При интеграции 1С с внешними информационными системами или при автоматизации задач администрирования часто используется COM-соединение. Главным связующим звеном здесь выступает библиотека comcntr.dll (COM-соединитель). Однако в процессе эксплуатации ИТ-инфраструктуры разработчики и администраторы регулярно сталкиваются со следующей проблемой: на целевом компьютере или сервере пути к платформе динамически меняются с выходом новых релизов (например, каталоги вида C:\Program Files\1cv8\8.3.22.1709\bin). Прописывать пути «вручную» в скриптах или коде — непрактично и чревато постоянными сбоями при обновлениях.

В этой статье мы подробно рассмотрим и разберем по шагам несколько надежных и автоматизированных способов регистрации компоненты comcntr.dll, когда точный путь к ней заранее неизвестен.

Способ 1. Программное определение каталога из запущенного сеанса 1С

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

Функция КаталогПрограммы() возвращает полный путь к каталогу bin текущего запущенного приложения. Поскольку библиотека comcntr.dll всегда находится в той же папке, где расположены исполняемые файлы платформы, мы можем составить беспроигрышный алгоритм:


// Определяем путь к библиотеке для текущей запущенной версии платформы
ПутьКБиблиотеке = КаталогПрограммы() + "comcntr.dll";

ФайлКомпоненты = Новый Файл(ПутьКБиблиотеке);
Если ФайлКомпоненты.Существует() Тогда
    // Формируем команду для системного регистратора regsvr32
    // Параметр /s запускает регистрацию в «тихом» режиме без вывода диалоговых окон
    СтрокаЗапуска = "regsvr32.exe /s """ + ПутьКБиблиотеке + """";
    
    // Запуск приложения с требованием ожидания завершения процесса
    ЗапуститьПриложение(СтрокаЗапуска, , Истина);
КонецЕсли;

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

Способ 2. Использование механизмов Библиотеки стандартных подсистем (БСП)

В современных конфигурациях, созданных на базе БСП, разработчикам больше нет необходимости писать собственные процедуры вызова системных утилит Windows. В составе БСП есть готовый к использованию программный интерфейс.

Рассмотрим процедуру ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(). Этот метод выполняет следующие действия под капотом:

  1. Самостоятельно определяет версию и разрядность текущего запущенного клиента.
  2. Находит файл библиотеки в рабочем каталоге платформы.
  3. Инициирует регистрацию библиотеки в операционной системе с запросом прав администратора, если текущих прав пользователя недостаточно.
  4. При необходимости предлагает пользователю перезапустить текущий сеанс для применения изменений в системе.

Пример вызова процедуры в коде управляемой формы:


&НаКлиенте
Процедура ЗарегистрироватьКомпонентуАвтоматически()
    Оповещение = Новый ОписаниеОповещения("ПослеРегистрацииCOM", ЭтотОбъект);
    // Первый параметр Истина означает необходимость перезапуска сеанса после успешной регистрации
    ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Истина, Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеРегистрацииCOM(РезультатРегистрации, ДополнительныеПараметры) Экспорт
    Если РезультатРегистрации Тогда
        ПоказатьПредупреждение(, "Регистрация COM-соединителя завершена успешно!");
    Иначе
        ПоказатьПредупреждение(, "Не удалось зарегистрировать компоненту. Проверьте права доступа.");
    EndIf;
КонецПроцедуры

Способ 3. Поиск последней версии через реестр Windows (PowerShell)

Выясним, как решить задачу на уровне системного администрирования, когда запуск 1С не планируется, а регистрацию необходимо выполнить удаленно или в процессе развертывания операционной системы (например, через Active Directory или SCCM).

При установке платформы 1С инсталлятор всегда записывает пути установки в системный реестр ОС Windows. Скрипты автоматизации могут считывать эти пути, находить самую свежую установленную версию и производить регистрацию. Ниже приведен пример сценария PowerShell, реализующего эту логику:


# Проверяем пути установки 1С в ветках реестра (для 32- и 64-битных систем)
$RegPaths = @(
    "HKLM:\SOFTWARE\1C\1Cv8",
    "HKLM:\SOFTWARE\WOW6432Node\1C\1Cv8"
)

$InstalledPaths = @()

foreach ($RegPath in $RegPaths) {
    if (Test-Path $RegPath) {
        # Извлекаем пути из установленных параметров
        $PathValue = Get-ItemProperty -Path $RegPath -Name "InstallPath" -ErrorAction SilentlyContinue
        if ($PathValue) {
            $InstalledPaths += $PathValue.InstallPath
        }
    }
}

# Если пути найдены, сканируем каталоги версий на диске
foreach ($BasePath in $InstalledPaths) {
    if (Test-Path $BasePath) {
        # Ищем все папки версий вида 8.3.X.Y и сортируем по убыванию (берем самую новую)
        $LatestVersion = Get-ChildItem -Path $BasePath | 
            Where-Object { $_.PSIsContainer -and $_.Name -match "^\d+\.\d+\.\d+\.\d+$" } | 
            Sort-Object { [version]$_.Name } -Descending | 
            Select-Object -First 1

        if ($LatestVersion) {
            $TargetDll = Join-Path $BasePath $LatestVersion.Name | Join-Path -ChildPath "bin\comcntr.dll"
            
            if (Test-Path $TargetDll) {
                # Регистрируем найденную библиотеку с повышением прав администратора
                Start-Process "regsvr32.exe" -ArgumentList "/s `"$TargetDll`"" -Verb RunAs -Wait
                Write-Host "Компонента успешно зарегистрирована из каталога: $TargetDll"
                break
            }
        }
    }
}

Способ 4. Создание изолированного приложения COM+ (Решение конфликта разрядностей)

Рассмотрим более сложную, но крайне важную ситуацию. На сервере одновременно установлены 32-разрядные и 64-разрядные версии платформы 1С. Обычный вызов утилиты regsvr32 перезаписывает пути к COM-объекту в реестре Windows. В результате регистрация 64-битной версии «ломает» работу 32-битных внешних приложений, работающих с 1С по COM, и наоборот.

Чтобы раз и навсегда решить эту проблему, настроим специальную изолированную оболочку — **Приложение COM+** в службах компонентов ОС Windows. В этом случае операционная система сама берет на себя маршрутизацию вызовов через суррогатный процесс dllhost.exe, избавляя нас от необходимости указывать точные пути внутри кода.

Разберем этот процесс по шагам:

  1. Откройте консоль управления службами компонентов. Для этого нажмите комбинацию клавиш Win + R, введите команду comexp.msc и нажмите Enter.
  2. Перейдите по дереву: Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши по разделу «Приложения COM+» и выберите пункт Создать -> Приложение. Появится мастер установки.
  4. В мастере выберите «Создать новое приложение», введите понятное имя (например, 1C_COM_Connector) и установите переключатель Способ активации в положение Серверное приложение. Это критически важно для изоляции разрядности.
  5. В качестве учетной записи удостоверения укажите конкретного системного пользователя (желательно специально созданную локальную или доменную учетную запись с правами доступа к каталогам 1С), под чьим именем будет запускаться суррогатный процесс.
  6. После создания приложения откройте его ветку, найдите папку Компоненты, нажмите правой кнопкой мыши и выберите Создать -> Компонент.
  7. В мастере импорта выберите «Установка новых компонентов» и укажите путь к файлу comcntr.dll самой актуальной версии платформы. Нажмите «Далее» и завершите установку.

Теперь внешние приложения будут успешно подключаться к базам данных 1С независимо от того, какой разрядности клиент обращается к серверу, а сама операционная система жестко зафиксирует путь к библиотеке внутри контейнера COM+.

Резюме и практические рекомендации

Выбор конкретного метода зависит от архитектуры вашей системы:

← На главную