При интеграции 1С с внешними информационными системами или при автоматизации задач администрирования часто используется COM-соединение. Главным связующим звеном здесь выступает библиотека comcntr.dll (COM-соединитель). Однако в процессе эксплуатации ИТ-инфраструктуры разработчики и администраторы регулярно сталкиваются со следующей проблемой: на целевом компьютере или сервере пути к платформе динамически меняются с выходом новых релизов (например, каталоги вида C:\Program Files\1cv8\8.3.22.1709\bin). Прописывать пути «вручную» в скриптах или коде — непрактично и чревато постоянными сбоями при обновлениях.
В этой статье мы подробно рассмотрим и разберем по шагам несколько надежных и автоматизированных способов регистрации компоненты comcntr.dll, когда точный путь к ней заранее неизвестен.
Если задача регистрации компоненты выполняется непосредственно из среды 1С (например, в рамках запуска обработки обновления или первоначальной настройки обмена), мы можем легко выяснить путь к исполняемым файлам текущей версии платформы. Для этого проанализируем возможности встроенного языка.
Функция КаталогПрограммы() возвращает полный путь к каталогу bin текущего запущенного приложения. Поскольку библиотека comcntr.dll всегда находится в той же папке, где расположены исполняемые файлы платформы, мы можем составить беспроигрышный алгоритм:
// Определяем путь к библиотеке для текущей запущенной версии платформы
ПутьКБиблиотеке = КаталогПрограммы() + "comcntr.dll";
ФайлКомпоненты = Новый Файл(ПутьКБиблиотеке);
Если ФайлКомпоненты.Существует() Тогда
// Формируем команду для системного регистратора regsvr32
// Параметр /s запускает регистрацию в «тихом» режиме без вывода диалоговых окон
СтрокаЗапуска = "regsvr32.exe /s """ + ПутьКБиблиотеке + """";
// Запуск приложения с требованием ожидания завершения процесса
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
КонецЕсли;
Этот простой метод гарантирует, что будет зарегистрирована компонента именно той версии и разрядности, в которой в данный момент работает пользователь или регламентное задание.
В современных конфигурациях, созданных на базе БСП, разработчикам больше нет необходимости писать собственные процедуры вызова системных утилит Windows. В составе БСП есть готовый к использованию программный интерфейс.
Рассмотрим процедуру ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(). Этот метод выполняет следующие действия под капотом:
Пример вызова процедуры в коде управляемой формы:
&НаКлиенте
Процедура ЗарегистрироватьКомпонентуАвтоматически()
Оповещение = Новый ОписаниеОповещения("ПослеРегистрацииCOM", ЭтотОбъект);
// Первый параметр Истина означает необходимость перезапуска сеанса после успешной регистрации
ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Истина, Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеРегистрацииCOM(РезультатРегистрации, ДополнительныеПараметры) Экспорт
Если РезультатРегистрации Тогда
ПоказатьПредупреждение(, "Регистрация COM-соединителя завершена успешно!");
Иначе
ПоказатьПредупреждение(, "Не удалось зарегистрировать компоненту. Проверьте права доступа.");
EndIf;
КонецПроцедуры
Выясним, как решить задачу на уровне системного администрирования, когда запуск 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
}
}
}
}
Рассмотрим более сложную, но крайне важную ситуацию. На сервере одновременно установлены 32-разрядные и 64-разрядные версии платформы 1С. Обычный вызов утилиты regsvr32 перезаписывает пути к COM-объекту в реестре Windows. В результате регистрация 64-битной версии «ломает» работу 32-битных внешних приложений, работающих с 1С по COM, и наоборот.
Чтобы раз и навсегда решить эту проблему, настроим специальную изолированную оболочку — **Приложение COM+** в службах компонентов ОС Windows. В этом случае операционная система сама берет на себя маршрутизацию вызовов через суррогатный процесс dllhost.exe, избавляя нас от необходимости указывать точные пути внутри кода.
Разберем этот процесс по шагам:
comexp.msc и нажмите Enter.1C_COM_Connector) и установите переключатель Способ активации в положение Серверное приложение. Это критически важно для изоляции разрядности.comcntr.dll самой актуальной версии платформы. Нажмите «Далее» и завершите установку.Теперь внешние приложения будут успешно подключаться к базам данных 1С независимо от того, какой разрядности клиент обращается к серверу, а сама операционная система жестко зафиксирует путь к библиотеке внутри контейнера COM+.
Выбор конкретного метода зависит от архитектуры вашей системы:
ОбщегоНазначенияКлиент) или функцию КаталогПрограммы().