Для авторегистрации компоненты задействована следующая логика:
Пытаемся зарегистрировать компоненту с помощью объета "WScript.Shell", по умолчанию система регистрирует компоненту в раздел HKEY_LOCAL_MACHINE, поэтому если данный шаг выполнять не под администратором программа выдаст ошибку на нарушение доступа к реестру, если вдруг получили ошибку, то пытаемся сделать запись в другой раздел рестра в ветку "HKEY_CURRENT_USER".
При помощи дополнительных агруменов /regfile /codebase для утилиты RegAsm.exe получаем файл с информацией которая будет записана в реестр (.reg).
wshShell.Run(ПутьRegAsm + " " + """" + ПутьДоКомпоненты + """" + " /regfile /codebase", 0, true);
Основная задача подменить имена корневых разделов и сделать запись в реестр с помощью wshShell.RegWrite
Сам парсинг файла .reg будет с помощью процедуры ПолучитьСписокКомандРегистрации c 2 агрументами МассивЗаписей - пустой масcив и ИмяФайла - путь до нашего .reg файла
&НаКлиенте
Процедура ПолучитьСписокКомандРегистрации(МассивЗаписей, ИмяФайла)
Перем Ключ, Параметр, ИмяПараметра, СчетчикПараметров;
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
Строка = ЧтениеТекста.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Если Лев(Строка, 1) = "[" Тогда //ключ реестра
Если Ключ <> Неопределено И СчетчикПараметров = 0 Тогда //Ключ без параметров
ДанныеКлюча = Новый Соответствие;
ДанныеКлюча.Вставить(Ключ, "");
МассивЗаписей.Добавить(ДанныеКлюча);
КонецЕсли;
Ключ = Строка + "\";
Ключ = СтрЗаменить(Ключ, "[", "");
Ключ = СтрЗаменить(Ключ, "]", "");
Ключ = СтрЗаменить(Ключ, "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER\Software\Classes");
СчетчикПараметров = 0;
ИначеЕсли Лев(Строка, 1) = "@" Тогда //параметр без имени
ДанныеКлюча = Новый Соответствие;
Параметр = Строка;
Параметр = СтрЗаменить(Параметр, "@=", "");
Параметр = СтрЗаменить(Параметр, """", "");
ДанныеКлюча.Вставить(Ключ, Параметр);
МассивЗаписей.Добавить(ДанныеКлюча);
СчетчикПараметров = СчетчикПараметров + 1;
ИначеЕсли Лев(Строка, 1) = """" Тогда //параметр с именем
ДанныеКлюча = Новый Соответствие;
Параметр = Строка;
Параметр = СтрЗаменить(Параметр, """", "");
РазделительПараметра = Найти(Параметр, "=");
ИмяПараметра = Лев(Параметр, РазделительПараметра - 1);
Параметр = Сред(Параметр, РазделительПараметра + 1, СтрДлина(Параметр) - РазделительПараметра);
ДанныеКлюча.Вставить(Ключ + ИмяПараметра, Параметр);
МассивЗаписей.Добавить(ДанныеКлюча);
СчетчикПараметров = СчетчикПараметров + 1;
КонецЕсли;
Строка = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
Если Ключ <> Неопределено И СчетчикПараметров = 0 Тогда //Ключ без параметров
ДанныеКлюча = Новый Соответствие;
ДанныеКлюча.Вставить(Ключ, "");
МассивЗаписей.Добавить(ДанныеКлюча);
КонецЕсли;
ЧтениеТекста.Закрыть();
КонецПроцедуры
Далее другой процедурой ЗаписатьВРеестр записываем полученные данные
&НаКлиенте
Процедура ЗаписатьВРеестр(wshShell, МассивЗаписей, ПробыватьПодАдминистратором = Ложь)
Для каждого Запись Из МассивЗаписей Цикл
Для каждого КлючИЗначение Из Запись Цикл
КлючРеестра = КлючИЗначение.Ключ;
Если ПробыватьПодАдминистратором Тогда
КлючРеестра = СтрЗаменить(КлючИЗначение.Ключ, "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE");
КонецЕсли;
wshShell.RegWrite(КлючРеестра, КлючИЗначение.Значение);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Также приложена обработка с примером работы данного механизма, протестировано на Windows 8 и Windows 10.