RDT1C/DataProcessors/ирУправлениеCOMКлассами1С/Ext/ObjectModule.bsl
Администратор 48c2d81a78 .
2021-06-28 00:02:50 +03:00

629 lines
46 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем мИзданияПлатформы Экспорт;
Функция ВыполнитьРегистрацию() Экспорт
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms687653%28v=vs.85%29.aspx
// http://icodeguru.com/VC%26MFC/APracticalGuideUsingVisualCandATL/133.htm
// Коды ошибок http://msdn.microsoft.com/en-us/library/windows/desktop/dd542647%28v=vs.85%29.aspx
КаталогПриложений = Новый COMОбъект("COMAdmin.COMAdminCatalog");
КаталогПриложений.Connect(ИмяКомпьютера());
ПриложенияСистемы = КаталогПриложений.GetCollection("Applications");
ПриложенияСистемы.Populate();
Для Каждого СтрокаКласса Из Классы Цикл
НовыйСборкаПлатформы = СтрокаКласса.НовыйСборкаПлатформы;
Если ЗначениеЗаполнено(НовыйСборкаПлатформы) Тогда
ЗарегистрироватьCOMКлассСборкиПлатформы(ТипыComКлассов.Найти(СтрокаКласса.ТипКласса, "Имя"), СтрокаКласса.x64, НовыйСборкаПлатформы);
СтрокаКласса.СборкаПлатформы = СтрокаКласса.НовыйСборкаПлатформы;
КонецЕсли;
КонецЦикла;
Если Не ИзменитьПриложения Тогда
Возврат Истина;
КонецЕсли;
Если Ложь
#Если Не Клиент Тогда
Или ирКэш.Это64битныйПроцессЛкс()
#КонецЕсли
Тогда
Сообщить("Изменение COM+ приложений из 64-битного процесса (на сервере) не реализовано");
Иначе
ИзданияПлатформыДляПеререгистрации = Новый Массив;
ТипКласса = ТипыComКлассов.Найти("ComConnector", "Имя");
Для Каждого СтрокаПриложения Из Приложения.НайтиСтроки(Новый Структура("Добавленный, Создать", Истина, Истина)) Цикл
#Если Сервер И Не Сервер Тогда
СтрокаПриложения = Приложения.Добавить();
#КонецЕсли
Если Не ЗначениеЗаполнено(СтрокаПриложения.ИзданиеПлатформы) Тогда
Продолжить;
КонецЕсли;
СтрокаБазовогоПриложения = Приложения.НайтиСтроки(Новый Структура("Добавленный, ИзданиеПлатформы, x64", Ложь, СтрокаПриложения.ИзданиеПлатформы, СтрокаПриложения.x64))[0];
СтрокаБазовогоПриложения.Создать = Истина;
КонецЦикла;
Приложения.Сортировать("ИзданиеПлатформы Убыв, Добавленный");
Для Каждого СтрокаПриложения Из Приложения Цикл
ПриложениеОбъект = Неопределено;
Если ЗначениеЗаполнено(СтрокаПриложения.Идентификатор) Тогда
ПриложениеОбъект = НайтиУдалитьОбъектКоллекции(ПриложенияСистемы, СтрокаПриложения.Идентификатор, Не СтрокаПриложения.Создать);
Если Не СтрокаПриложения.Создать Тогда
ИзданияПлатформыДляПеререгистрации.Добавить(СтрокаПриложения.ИзданиеПлатформы);
Продолжить;
КонецЕсли;
КонецЕсли;
Если СтрокаПриложения.Создать Тогда
ИмяФайла = "";
Если СтрокаПриложения.Добавленный Тогда
Если Не ЗначениеЗаполнено(СтрокаПриложения.СборкаПлатформы) Тогда
ирОбщий.СообщитьЛкс("Для добавленного класса " + СтрокаПриложения.ИмяКласса + " COM+ приложения не указана сборка платформы");
Продолжить;
КонецЕсли;
Иначе
СтрокаКласса = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, СтрокаПриложения.x64))[0];
#Если Сервер И Не Сервер Тогда
СтрокаКласса = Классы[0];
#КонецЕсли
СтрокаПриложения.СборкаПлатформы = СтрокаКласса.СборкаПлатформы;
КонецЕсли;
ОписаниеСборкиПлатформы = ОписаниеСборкиПлатформы(СтрокаПриложения.СборкаПлатформы, СтрокаПриложения.x64);
#Если Сервер И Не Сервер Тогда
ОписаниеСборкиПлатформы = СборкиПлатформы.Найти();
#КонецЕсли
Если ОписаниеСборкиПлатформы <> Неопределено Тогда
ИмяФайла = ОписаниеСборкиПлатформы.Каталог + "bin\" + ТипКласса.КлючевойФайл;
КонецЕсли;
Если ЗначениеЗаполнено(ИмяФайла) Тогда
Если ПриложениеОбъект = Неопределено Тогда
ПриложениеОбъект = ПриложенияСистемы.Add();
КонецЕсли;
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms687653%28v=vs.85%29.aspx
ИмяПриложения = СтрокаПриложения.ИмяКласса + "_" + ?(СтрокаПриложения.x64, "64", "32");
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms686107%28v=vs.85%29.aspx
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, ИмяПриложения, "Value", "Name");
//ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, "", "Value", "Description");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, ?(СтрокаПриложения.Добавленный Или СтрокаПриложения.ОтдельнаяАктивация, 1, 0), "Value", "Activation");
//ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, СтрокаПриложения.Включено, "Value", "IsEnabled");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, Истина, "Value", "IsEnabled");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, 100, "Value", "ConcurrentApps");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, 1, "Value", "RecycleActivationLimit");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, 1440, "Value", "RecycleExpirationTimeout");
Если ЗначениеЗаполнено(ПриложениеПользовательОС) Тогда
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, ПриложениеПользовательОС, "Value", "Identity");
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, ПриложениеПарольПользователяОС, "Value", "Password");
КонецЕсли;
//ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(ПриложениеОбъект, Истина, "Value", "RunForever");
Попытка
ПриложенияСистемы.SaveChanges();
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Если Найти(ОписаниеОшибки, "0x80110414") > 0 Тогда
ВызватьИсключение "Новые имя или пароль пользователя COM+ приложений указаны неверно";
ИначеЕсли Найти(ОписаниеОшибки, "0x80070005") > 0 Тогда
ВызватьИсключение "Нет разрешения на изменение COM+ приложений. Запустите приложение от имени администратора или отключите флажок ""Изменить приложения"".";
Иначе
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
СтрокаПриложения.Идентификатор = ПриложениеОбъект.Key;
Если Не СтрокаПриложения.Добавленный Тогда
Для Каждого СтрокаКонкурентногоПриложения Из Приложения.НайтиСтроки(Новый Структура("ИзданиеПлатформы, x64", СтрокаПриложения.ИзданиеПлатформы, СтрокаПриложения.x64)) Цикл
Если Не ЗначениеЗаполнено(СтрокаКонкурентногоПриложения.Идентификатор) Тогда
Продолжить;
КонецЕсли;
Компоненты = ПриложенияСистемы.GetCollection("Components", СтрокаКонкурентногоПриложения.Идентификатор);
Компоненты.Populate();
НайтиУдалитьОбъектКоллекции(Компоненты);
КонецЦикла;
КаталогПриложений.InstallComponent(ПриложениеОбъект.Key, ИмяФайла, "", "");
ИзданияПлатформыДляПеререгистрации.Добавить(СтрокаПриложения.ИзданиеПлатформы);
Иначе
СтрокаБазовогоПриложения = Приложения.НайтиСтроки(Новый Структура("Добавленный, ИзданиеПлатформы, x64", Ложь, СтрокаПриложения.ИзданиеПлатформы, СтрокаПриложения.x64))[0];
Компоненты = ПриложенияСистемы.GetCollection("Components", СтрокаБазовогоПриложения.Идентификатор);
Компоненты.Populate();
КомпонентаОбъект = НайтиУдалитьОбъектКоллекции(Компоненты,, Ложь);
НовыйИдентификатор = "{" + Новый УникальныйИдентификатор + "}";
КаталогПриложений.AliasComponent(СтрокаБазовогоПриложения.Идентификатор, КомпонентаОбъект.Key, ПриложениеОбъект.Key, СтрокаПриложения.ИмяКласса, НовыйИдентификатор);
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СкриптРегистрации = ПолучитьМакет("ComConnectorReg").ПолучитьТекст();
РезультатКоманды = мПлатформа.ВнестиФайлCOMКомпонентыВРеестр(СкриптРегистрации, СтрЗаменить(ИмяФайла, "\", "\\"), НовыйИдентификатор, СтрокаПриложения.x64);
КонецЕсли;
Роли = ПриложенияСистемы.GetCollection("Roles", ПриложениеОбъект.Key);
Роли.Populate();
Роль = Неопределено;
Для Каждого лРоль Из Роли Цикл
Роль = лРоль;
Прервать;
КонецЦикла;
Если Роль = Неопределено Тогда
Роль = Роли.Add();
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(Роль, "CreatorOwner", "Value", "Name");
Роли.SaveChanges();
КонецЕсли;
ПользователиИБ = Роли.GetCollection("UsersInRole", Роль.Key);
ПользователиИБ.Populate();
// Добавляем пользователя "Все" ("Everyone")
Для Каждого лПользователь Из ПользователиИБ Цикл
//Если ирОбщий.СтрокиРавныЛкс("Everyone", лПользователь.Value("User")) Тогда
// Пользователь = лПользователь;
// Прервать;
//КонецЕсли;
ПользователиИБ.Remove(0);
КонецЦикла;
Пользователь = ПользователиИБ.Add();
//ИмяПользователяИнициатора = ИмяСистемногоПользователяEveryone();
ИмяПользователяИнициатора = ИмяСлужебногоПользователяОСAuthenticatedUsers();
ирОбщий.УстановитьЗначениеПоФункциональнойСсылкеЛкс(Пользователь, ИмяПользователяИнициатора, "Value", "User");
ПользователиИБ.SaveChanges();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого ИзданиеПлатформы Из ирОбщий.СвернутьМассивЛкс(ИзданияПлатформыДляПеререгистрации) Цикл
// При вызове InstallComponent удаляются все разрядности класса устанавливаемой компоненты. Поэтому нужно заново зарегистрировать их.
СтрокиКлассов = Классы.НайтиСтроки(Новый Структура("ИзданиеПлатформы, ТипКласса, Добавленный", ИзданиеПлатформы, ТипКласса.Имя, Ложь));
Для Каждого СтрокаКласса Из СтрокиКлассов Цикл
#Если Сервер И Не Сервер Тогда
СтрокаКласса = Классы[0];
#КонецЕсли
ЗарегистрироватьCOMКлассСборкиПлатформы(ТипКласса, СтрокаКласса.x64, СтрокаКласса.СборкаПлатформы);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Результат = Истина;
Возврат Результат;
КонецФункции
Функция НайтиУдалитьОбъектКоллекции(Знач КоллекцияОбъектов, Знач Идентификатор = "", Удалить = Истина)
Перем Объект;
НачальноеКоличество = КоллекцияОбъектов.Count;
Для ОбратныйИндекс = 1 По НачальноеКоличество Цикл
Индекс = НачальноеКоличество - ОбратныйИндекс;
Объект = КоллекцияОбъектов.Item(Индекс);
Если Ложь
Или Не ЗначениеЗаполнено(Идентификатор)
Или Объект.Key = Идентификатор
Тогда
Если Удалить Тогда
КоллекцияОбъектов.Remove(Индекс);
Иначе
ПриложениеОбъект = Объект;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Удалить Тогда
КоллекцияОбъектов.SaveChanges();
КонецЕсли;
Возврат ПриложениеОбъект;
КонецФункции
Функция ИмяСлужебногоПользователяОСAuthenticatedUsers() Экспорт
Результат = Неопределено;
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс();
Пользователи = СлужбаWMI.ExecQuery("SELECT Name
|FROM Win32_SystemAccount
|WHERE SID = 'S-1-5-11'");
Для Каждого Пользователь Из Пользователи Цикл
Результат = Пользователь.Name;
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура ЗарегистрироватьCOMКлассСборкиПлатформы(Знач ТипКласса, Знач x64 = Неопределено, Знач СборкаПлатформы = Неопределено) Экспорт
СтрокаТаблицыНовогоРелиза = ОписаниеСборкиПлатформы(СборкаПлатформы, x64);
Если СтрокаТаблицыНовогоРелиза <> Неопределено Тогда
#Если Сервер И Не Сервер Тогда
ТипКласса = ТипыComКлассов.Найти();
#КонецЕсли
ЗарегистрироватьCOMКлассИзКаталогаФайлов(ТипКласса, x64, СтрокаТаблицыНовогоРелиза.Каталог + "bin", СборкаПлатформы);
Иначе
ВызватьИсключение "Файл регистрации класса " + ТипКласса.Имя + " для сборки платформы " + СборкаПлатформы + " не найден";
КонецЕсли;
КонецПроцедуры
Функция ОписаниеСборкиПлатформы(СборкаПлатформы, x64 = Неопределено)
Если x64 = Неопределено Тогда
x64 = ирКэш.Это64битныйПроцессЛкс();
КонецЕсли;
ОтборСтрок = Новый Структура("СборкаПлатформы", ирОбщий.ПервыйФрагментЛкс(СборкаПлатформы, " - "));
Фрагменты = ирОбщий.СтрРазделитьЛкс(СборкаПлатформы, " - ");
Если Фрагменты.Количество() > 1 Тогда
ОтборСтрок.Вставить("x64", Фрагменты[1] = "64");
Иначе
ОтборСтрок.Вставить("x64", x64);
КонецЕсли;
СтрокиТаблицы = СборкиПлатформы.НайтиСтроки(ОтборСтрок);
Если СтрокиТаблицы.Количество() > 0 Тогда
СтрокаТаблицыНовогоРелиза = СтрокиТаблицы[0];
КонецЕсли;
Возврат СтрокаТаблицыНовогоРелиза;
КонецФункции
Функция ЗарегистрироватьCOMКлассИзКаталогаФайлов(ТипКласса, x64 = Неопределено, пКаталогФайла = Неопределено, СборкаПлатформы = Неопределено) Экспорт
Если Не ЗначениеЗаполнено(пКаталогФайла) Тогда
КаталогФайла = КаталогПрограммы();
СборкаПлатформы = ТекущаяСборкаПлатформы;
Иначе
КаталогФайла = пКаталогФайла;
КонецЕсли;
Если ТипКласса.Внутрипроцессный Тогда
Если x64 <> Неопределено И ирКэш.Это64битнаяОСЛкс() Тогда
Если x64 Тогда
Команда = "%systemroot%\System32\regsvr32.exe";
Иначе
Команда = "%systemroot%\SysWoW64\regsvr32.exe";
КонецЕсли;
Иначе
Команда = "regsvr32.exe";
КонецЕсли;
Если ТипКласса.Имя = "ComConnector" Тогда
ПолноеИмяФайла = КаталогФайла + "\" + ТипКласса.КлючевойФайл;
Команда = Команда + " """ + ПолноеИмяФайла + """ ";
ИначеЕсли ТипКласса.Имя = "ServerAdminScope" Тогда
ПолноеИмяФайла = КаталогФайла + "\" + ТипКласса.КлючевойФайл;
//Команда = Команда + " """ + ПолноеИмяФайла + """ /n /i:user";
Команда = Команда + " """ + ПолноеИмяФайла + """ /i:user";
Иначе
РезультатКоманды = "Неизвестный тип COM класса """ + ТипКласса.Имя + """ платформы 1С";
КонецЕсли;
Если Не ПоказыватьРезультатРегистрации Тогда
Команда = Команда + " /s";
КонецЕсли;
Иначе
#Если Не Клиент Тогда
Если Не ЗначениеЗаполнено(пКаталогФайла) Тогда
ВызватьИсключение "Регистрация COM класса типа """ + ТипКласса.Имя + """ отменена, т.к. определение пути к исполняемому файлу клиентского приложения на сервере не реализовано.";
КонецЕсли;
#КонецЕсли
Если Не ЗначениеЗаполнено(РезультатКоманды) Тогда
ПолноеИмяФайла = КаталогФайла + "\" + ТипКласса.КлючевойФайл;
Команда = """" + ПолноеИмяФайла + """ /regserver";
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Команда) Тогда
Файл = Новый Файл(ПолноеИмяФайла);
Если Не Файл.Существует() Тогда
ВызватьИсключение "При регистрации COM класса типа """ + ТипКласса.Имя + """ не найден файл """ + Файл.ПолноеИмя + """
|Переустановите платформу с необходимой компонентой";
Иначе
РезультатКоманды = ирОбщий.ВыполнитьКомандуОСЛкс(Команда,,, Истина); // Тут всегда пустой результат
КонецЕсли;
КонецЕсли;
#Если Сервер И Не Клиент Тогда
Текст = "серверном контексте";
#Иначе
Текст = "клиентском контексте";
#КонецЕсли
ПроцессОС = ирОбщий.ПолучитьПроцессОСЛкс("текущий");
//#Если Клиент Тогда
// Текст = Текст + " из процесса " + ПроцессОС.Name + "(" + XMLСтрока(ПроцессОС.ProcessID) + ")";
//#КонецЕсли
ТекстСообщения = "Выполнена локальная регистрация COM класса """ + ТипКласса.Имя + """ " + СборкаПлатформы + " в " + Текст;
ирОбщий.СообщитьЛкс(ТекстСообщения);
//#Если Клиент Тогда
// Сообщить("! После регистрации для возможности использовать класс может потребоваться перезапуск процесса 1С !", СтатусСообщения.Внимание);
//#КонецЕсли
Возврат РезультатКоманды;
КонецФункции
Процедура ЗаполнитьКлассыИзКоллекции(Компоненты, x64)
Компоненты.Populate();
Для Каждого Компонента Из Компоненты Цикл
ИмяКласса = Компонента.Name;
Если Найти(НРег(ИмяКласса), "v8") = 1 Тогда
Для Каждого СтрокаТипаКласса Из ТипыComКлассов Цикл
Если Найти(НРег(ИмяКласса), НРег(СтрокаТипаКласса.ИмяКлассаПослеV8)) = 4 Тогда
ИдентификаторКомпоненты = Компонента.Key;
НомерИзданияПлатформы = Число(Сред(ИмяКласса, 3, 1));
Если СтрокаТипаКласса.Внутрипроцессный Тогда
ПолноеИмяФайла = Компонента.Value("InprocServer32");
Иначе
ПолноеИмяФайла = Компонента.Value("LocalServer32");
КонецЕсли;
ИмяКласса = "V8" + НомерИзданияПлатформы + СтрокаТипаКласса.ИмяКлассаПослеV8;
СтрокиКлассов = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", ИмяКласса, x64));
Если СтрокиКлассов.Количество() > 0 Тогда
СтрокаПриложения = СтрокиКлассов[0];
СтрокаПриложения.ИмяФайла = ПолноеИмяФайла;
СтрокаПриложения.Идентификатор = Компонента.Key;
СтрокаПриложения.Зарегистрирован = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьТаблицуКлассов(ЗаполнятьТолькоВнешниеСоединения = Ложь) Экспорт
Классы.Очистить();
Приложения.Очистить();
МассивРазрядностей = Новый Массив();
МассивРазрядностей.Добавить(Ложь);
Если ирКэш.Это64битнаяОСЛкс() Тогда
МассивРазрядностей.Добавить(Истина);
//Если ЗаполнятьТолькоВнешниеСоединения Тогда
// Если КэшКонтекстаИис.Это64битныйПроцессИис() Тогда
// МассивРазрядностей.Удалить(0);
// Иначе
// МассивРазрядностей.Удалить(1);
// КонецЕсли;
//КонецЕсли;
КонецЕсли;
Для Каждого ИзданиеПлатформы Из мИзданияПлатформы Цикл
Для Каждого ТипКласса Из ТипыComКлассов Цикл
Если Истина
И ЗаполнятьТолькоВнешниеСоединения
И ТипКласса.Имя <> "ComConnector"
Тогда
Продолжить;
КонецЕсли;
Для Каждого x64 Из МассивРазрядностей Цикл
Если Не ТипКласса.Внутрипроцессный И x64 И ИзданиеПлатформы.Значение < "83" Тогда
Продолжить;
КонецЕсли;
ИмяКласса = "V" + ИзданиеПлатформы.Значение + ТипКласса.ИмяКлассаПослеV8;
СтрокаКласса = Классы.Добавить();
СтрокаКласса.ИзданиеПлатформы = ИзданиеПлатформы.Представление;
СтрокаКласса.ИмяКласса = ИмяКласса;
ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаКласса, "ИмяКласса");
СтрокаКласса.ВнутриПроцессный = ТипКласса.Внутрипроцессный;
СтрокаКласса.ТипКласса = ТипКласса.Имя;
СтрокаКласса.x64 = x64;
КонецЦикла;
КонецЦикла;
Для Каждого x64 Из МассивРазрядностей Цикл
СтрокаПриложения = Приложения.Добавить();
СтрокаПриложения.ИзданиеПлатформы = ИзданиеПлатформы.Значение;
СтрокаПриложения.ИмяКласса = "V" + ИзданиеПлатформы.Значение + ".ComConnector";
ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаПриложения, "ИмяКласса");
СтрокаПриложения.x64 = x64;
КонецЦикла;
КонецЦикла;
КаталогПриложений = Новый COMОбъект("COMAdmin.COMAdminCatalog");
КаталогПриложений.Connect(ИмяКомпьютера());
Если ирКэш.Это64битнаяОСЛкс() Тогда
Компоненты = КаталогПриложений.GetCollection("InprocServers");
ЗаполнитьКлассыИзКоллекции(Компоненты, Истина);
Компоненты = КаталогПриложений.GetCollection("WOWLegacyServers");
ЗаполнитьКлассыИзКоллекции(Компоненты, Ложь);
КонецЕсли;
Компоненты = КаталогПриложений.GetCollection("LegacyServers");
ЗаполнитьКлассыИзКоллекции(Компоненты, ирКэш.Это64битнаяОСЛкс());
ПриложенияСистемы = КаталогПриложений.GetCollection("Applications");
ПриложенияСистемы.Populate();
Для Каждого Приложение Из ПриложенияСистемы Цикл
Если Ложь
Или Приложение.Key = "{9EB3B62C-79A2-11D2-9891-00C04F79AF51}"
Или Приложение.Key = "{7B4E1F3C-A702-11D2-A336-00C04F7978E0}"
Или Приложение.Key = "{01885945-612C-4A53-A479-E97507453926}"
Или Приложение.Key = "{02D4B3F1-FD88-11D1-960D-00805FC79235}"
Тогда
Продолжить;
КонецЕсли;
СтрокаПриложения = Неопределено;
Компоненты = ПриложенияСистемы.GetCollection("Components", Приложение.Key);
Попытка
Компоненты.Populate();
Исключение
Компоненты = Неопределено;
ирОбщий.СообщитьЛкс("Ошибка получения компонент приложения """ + Приложение.Value("Name") + """: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Продолжить;
КонецПопытки;
Если Компоненты <> Неопределено Тогда
Для Каждого Компонента Из Компоненты Цикл
ИмяКласса = Компонента.Value("ProgID");
Если Истина
И ирОбщий.СтрНачинаетсяСЛкс(НРег(ИмяКласса), "v8")
И Найти(НРег(ИмяКласса), ".comconnector") > 0
Тогда
ПолноеИмяФайла = Компонента.Value("DLL");
Это64битнаяКомпонента = Найти(НРег(ПолноеИмяФайла), "(x86)") = 0 И ирКэш.Это64битнаяОСЛкс(); // Ненадежно
СтрокаПриложения = ЗаполнитьКлассыПриложения(ИмяКласса, Компонента, ПолноеИмяФайла, Приложение, ПриложенияСистемы, Это64битнаяКомпонента);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ирКэш.Это64битнаяОСЛкс() Тогда
Компоненты = ПриложенияСистемы.GetCollection("LegacyComponents", Приложение.Key);
Компоненты.Populate();
Для Каждого Компонента Из Компоненты Цикл
ИмяКласса = Компонента.Value("ProgID");
Если Истина
И ирОбщий.СтрНачинаетсяСЛкс(НРег(ИмяКласса), "v8")
И Найти(НРег(ИмяКласса), ".comconnector") > 0
Тогда
ПолноеИмяФайла = Компонента.Value("InprocServer32");
Это64битнаяКомпонента = Ложь;
СтрокаПриложения = ЗаполнитьКлассыПриложения(ИмяКласса, Компонента, ПолноеИмяФайла, Приложение, ПриложенияСистемы, Это64битнаяКомпонента);
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Прервать;
КонецЦикла;
Для Каждого СтрокаТаблицы Из Классы Цикл
Если ЗначениеЗаполнено(СтрокаТаблицы.ИмяФайла) Тогда
ФайлWMI = ирОбщий.ПолучитьФайлWMIЛкс(СтрокаТаблицы.ИмяФайла);
Если ФайлWMI <> Неопределено Тогда
СтрокаТаблицы.ФайлСуществует = Истина;
КонецЕсли;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СтрЗаменить(СтрокаТаблицы.ИмяФайла, "\\", "\"), "\");
КаталогСборки = ирОбщий.СтрСоединитьЛкс(Фрагменты, "\", -2) + "\";
СтрокаСборкиПлатформы = СборкиПлатформы.Найти(НРег(КаталогСборки), "НКаталог");
Если ЗначениеЗаполнено(СтрокаСборкиПлатформы) Тогда
СтрокаТаблицы.СборкаПлатформы = ПредставлениеСборкиПлатформы(СтрокаСборкиПлатформы, СтрокаТаблицы.Внутрипроцессный);
Иначе
Если ФайлWMI <> Неопределено Тогда
СтрокаТаблицы.СборкаПлатформы = ФайлWMI.Version;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаТаблицы.ИзданиеПлатформы) Тогда
СтрокаТаблицы.ИзданиеПлатформы = ирОбщий.СтрСоединитьЛкс(ирОбщий.СтрРазделитьЛкс(СтрокаТаблицы.СборкаПлатформы), ".", 2);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Классы.Сортировать("ИзданиеПлатформы Убыв, ТипКласса, x64, Добавленный, ИмяКласса");
Для Каждого СтрокаПриложения Из Приложения Цикл
ОтборКлассов = Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, СтрокаПриложения.x64);
СтрокаКласса = Классы.НайтиСтроки(ОтборКлассов)[0];
#Если Сервер И Не Сервер Тогда
СтрокаКласса = Классы.Добавить();
#КонецЕсли
СтрокаПриложения.СборкаПлатформы = СтрокаКласса.СборкаПлатформы;
СтрокаПриложения.ИзданиеПлатформы = СтрокаКласса.ИзданиеПлатформы;
КонецЦикла;
Приложения.Сортировать("ИзданиеПлатформы Убыв, x64, Добавленный, ИмяКласса");
КонецПроцедуры
Функция ЗаполнитьКлассыПриложения(Знач ИмяКласса, Знач Компонента, Знач ПолноеИмяФайла, Знач Приложение, Знач ПриложенияСистемы, Знач Это64битнаяКомпонента)
НомерИзданияПлатформы = Число(Сред(ИмяКласса, 3, 1));
//ИмяКласса = "V8" + НомерИзданияПлатформы + ".ComConnector";
Отбор = Новый Структура("НИмяКласса, x64, ТипКласса", НРег(ИмяКласса), Это64битнаяКомпонента, "ComConnector");
СтрокиКлассов = Классы.НайтиСтроки(Отбор);
Если Истина
И СтрокиКлассов.Количество() = 0
И ирОбщий.СтрКончаетсяНаЛкс(ИмяКласса, ".1")
Тогда
ИмяКласса = ирОбщий.СтрокаБезКонцаЛкс(ИмяКласса, СтрДлина(".1"));
Отбор = Новый Структура("НИмяКласса, x64, ТипКласса", НРег(ИмяКласса), Это64битнаяКомпонента, "ComConnector");
СтрокиКлассов = Классы.НайтиСтроки(Отбор);
КонецЕсли;
Если СтрокиКлассов.Количество() = 0 Тогда
СтрокаКласса = Классы.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаКласса, Отбор);
СтрокаКласса.ИмяКласса = ИмяКласса;
СтрокаКласса.Добавленный = Истина;
Иначе
СтрокаКласса = СтрокиКлассов[0];
КонецЕсли;
СтрокаКласса.Идентификатор = Компонента.Key;
СтрокаКласса.ИмяФайла = ПолноеИмяФайла;
СтрокаКласса.Зарегистрирован = Истина;
СтрокаПриложения = НайтиЗаполнитьСтрокуПриложения(ИмяКласса, Приложение, Это64битнаяКомпонента, ПриложенияСистемы);
Возврат СтрокаПриложения;
КонецФункции
Функция НайтиЗаполнитьСтрокуПриложения(ИмяКласса, Приложение, x64, ПриложенияСистемы)
Отбор = Новый Структура("НИмяКласса, x64, Идентификатор", НРег(ИмяКласса), x64, "");
НайденныеСтроки = Приложения.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаПриложения = Приложения.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаПриложения, Отбор);
СтрокаПриложения.ИмяКласса = ИмяКласса;
СтрокаПриложения.Добавленный = Истина;
Иначе
СтрокаПриложения = НайденныеСтроки[0];
КонецЕсли;
СтрокаПриложения.ИмяПриложения = Приложение.Name;
СтрокаПриложения.Идентификатор = Приложение.Key;
ДоступенПользователям = "";
Роли = ПриложенияСистемы.GetCollection("Roles", Приложение.Key);
Роли.Populate();
Для Каждого Роль Из Роли Цикл
Пользователи = Роли.GetCollection("UsersInRole", Роль.Key);
Пользователи.Populate();
Для Каждого Пользователь Из Пользователи Цикл
Если ДоступенПользователям <> "" Тогда
ДоступенПользователям = ДоступенПользователям + ",";
КонецЕсли;
ДоступенПользователям = ДоступенПользователям + Пользователь.Value("User");
КонецЦикла;
КонецЦикла;
СтрокаПриложения.ДоступенПользователям = ДоступенПользователям;
Если Приложение.Value("Activation") > 0 Тогда
СтрокаПриложения.ОтдельнаяАктивация = Истина;
КонецЕсли;
СтрокаПриложения.Создать = Истина;
СтрокаПриложения.ВремяОжидания = Приложение.Value("RecycleExpirationTimeout");
СтрокаПриложения.ИмяПользователя = Приложение.Value("Identity");
СтрокаПриложения.ПредельноеЧислоАктиваций = Приложение.Value("RecycleActivationLimit");
СтрокаПриложения.РазмерГруппы = Приложение.Value("ConcurrentApps");
СтрокаПриложения.Включено = Приложение.Value("IsEnabled");
НомерИзданияПлатформы = Прав(Приложение.Name, 1);
//Роли = ПриложенияСистемы.GetCollection("Roles", Приложение.Key);
//Роли.Populate();
//Для Каждого Роль Из Роли Цикл
// Прервать;
//КонецЦикла;
//Пользователи = Роли.GetCollection("UsersInRole", Роль.Key);
//Пользователи.Populate();
//Для Каждого Пользователь Из Пользователи Цикл
// Прервать;
//КонецЦикла;
Возврат СтрокаПриложения;
КонецФункции
Функция ПредставлениеСборкиПлатформы(Знач СтрокаСборки, Знач Внутрипроцессный = Ложь) Экспорт
ПредставлениеСборки = СтрокаСборки.СборкаПлатформы;
//Если Не Внутрипроцессный Тогда
// ПредставлениеСборки = ПредставлениеСборки + " - " + ?(СтрокаСборки.x64, "64", "32");
//КонецЕсли;
Возврат ПредставлениеСборки;
КонецФункции
Функция ЗаполнитьТипыCOMКлассов() Экспорт
ТабличныйДокумент = ПолучитьМакет("ТипыCOMКлассов");
Результат = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ТабличныйДокумент);
ТипыComКлассов.Загрузить(Результат);
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтотОбъект.ТекущаяСборкаПлатформы = СистемнаяИнформация.ВерсияПриложения;
ЭтотОбъект.ТекущийПользовательОС = ирКэш.ТекущийПользовательОСЛкс();
ЭтотОбъект.x64Текущая = ирКэш.Это64битныйПроцессЛкс();
Возврат Результат;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
мИзданияПлатформы = Новый СписокЗначений;
Для Счетчик = 1 По 3 Цикл
Представление = "8." + Счетчик;
мИзданияПлатформы.Добавить("8" + Счетчик, Представление);
КонецЦикла;