RDT1C/DataProcessors/ирУправлениеCOMКлассами1С/Ext/ObjectModule.bsl
Администратор 24d76d5724 .
2021-03-01 07:42:26 +03:00

549 lines
38 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-битного процесса (на сервере) не реализовано");
Иначе
Для Каждого СтрокаПриложения Из Приложения Цикл
СтрокаКласса = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, СтрокаПриложения.x64))[0];
Если Истина
И ЗначениеЗаполнено(СтрокаКласса.ИмяФайла)
Тогда
Если Не ЗначениеЗаполнено(СтрокаПриложения.ИмяПриложения) Тогда
ПриложениеОбъект = ПриложенияСистемы.Add();
Иначе
Для Индекс = 0 По ПриложенияСистемы.Count - 1 Цикл
лПриложениеОбъект = ПриложенияСистемы.Item(Индекс);
Если лПриложениеОбъект.Key = СтрокаПриложения.ИдентификаторКласса Тогда
Если Не СтрокаПриложения.Создать Тогда
ПриложенияСистемы.Remove(Индекс);
Иначе
ПриложениеОбъект = лПриложениеОбъект;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если Истина
И СтрокаПриложения.Создать
И ПриложениеОбъект = Неопределено
Тогда
ВызватьИсключение "COM+ приложение с именем """ + СтрокаПриложения.ИмяПриложения + """ не найдено. Попробуйте обновить имена.";
КонецЕсли;
КонецЕсли;
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms687653%28v=vs.85%29.aspx
Если ПриложениеОбъект <> Неопределено Тогда
ИмяПриложения = ПолучитьИмяПриложения(СтрокаКласса.ИзданиеПлатформы);
//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+ приложений. Запустите приложение от имени администратора или отключите флажок ""Изменить приложения"".";
Иначе
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
Если ПриложениеОбъект = Неопределено Тогда
Продолжить;
КонецЕсли;
//Если Истина
// И ирКэш.Это64битнаяОСЛкс()
// И Не СтрокаПриложения.x64
//Тогда
// ИмяКоллекцииКомпонент = "LegacyComponents";
//Иначе
ИмяКоллекцииКомпонент = "Components";
//КонецЕсли;
Компоненты = ПриложенияСистемы.GetCollection(ИмяКоллекцииКомпонент, ПриложениеОбъект.Key);
Компоненты.Populate();
Компонента = Неопределено;
Для Каждого лКомпонента Из Компоненты Цикл
//Если ОбщийИис.СтрокиРавныИис(СтрокаПриложения.ИмяКласса + ".1", лКомпонента.Value("ProgID")) Тогда
Если ирОбщий.СтрокиРавныЛкс(СтрокаКласса.ИдентификаторКласса, лКомпонента.Key) Тогда
Компонента = лКомпонента;
Прервать;
КонецЕсли;
КонецЦикла;
Если Компонента = Неопределено Тогда
//Компонента = КаталогПриложений.ImportComponent(ПриложениеОбъект.Key, СтрокаПриложения.ИмяКласса);
Компонента = КаталогПриложений.ImportComponent(ПриложениеОбъект.Key, СтрокаКласса.ИдентификаторКласса);
КонецЕсли;
Роли = ПриложенияСистемы.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();
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = Истина;
Возврат Результат;
КонецФункции
Функция ПолучитьИмяПриложения(ИзданиеПлатформы) Экспорт
#Если _ Тогда
ИзданиеПлатформы = Справочники.ИзданияПлатформИис.ПустаяСсылка();
#КонецЕсли
ИмяПриложения = "1C" + СтрЗаменить(ИзданиеПлатформы, ".", "_") + " ComConnector";
Возврат ИмяПриложения;
КонецФункции
Процедура ЗарегистрироватьCOMКлассСборкиПлатформы(Знач ТипКласса, Знач x64 = Неопределено, Знач СборкаПлатформы = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ТипКласса = ТипыComКлассов.Найти();
#КонецЕсли
Если x64 = Неопределено Тогда
x64 = ирКэш.Это64битныйПроцессЛкс();
КонецЕсли;
ОтборСтрок = Новый Структура("СборкаПлатформы", ирОбщий.ПервыйФрагментЛкс(СборкаПлатформы, " - "));
Фрагменты = ирОбщий.СтрРазделитьЛкс(СборкаПлатформы, " - ");
Если Фрагменты.Количество() > 1 Тогда
ОтборСтрок.Вставить("x64", Фрагменты[1] = "64");
Иначе
ОтборСтрок.Вставить("x64", x64);
КонецЕсли;
СтрокиТаблицы = СборкиПлатформы.НайтиСтроки(ОтборСтрок);
Если СтрокиТаблицы.Количество() > 0 Тогда
СтрокаТаблицыНовогоРелиза = СтрокиТаблицы[0];
ЗарегистрироватьCOMКлассИзКаталогаФайлов(ТипКласса, x64, СтрокаТаблицыНовогоРелиза.Каталог + "bin", СборкаПлатформы);
Иначе
ВызватьИсключение "Файл регистрации класса " + ТипКласса.Имя + " для сборки платформы " + СборкаПлатформы + " не найден";
КонецЕсли;
КонецПроцедуры
Функция Зарегистрировать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);
// КонецЕсли;
//КонецЕсли;
КонецЕсли;
ИзданияПлатформы = Новый СписокЗначений;
Для Счетчик = 1 По 3 Цикл
ИзданияПлатформы.Добавить("8" + Счетчик, "8." + Счетчик);
КонецЦикла;
Для Каждого ИзданиеПлатформы Из ИзданияПлатформы Цикл
Для Каждого ТипКласса Из ТипыComКлассов Цикл
Если Истина
И ЗаполнятьТолькоВнешниеСоединения
И ТипКласса.Имя <> "ComConnector"
Тогда
Продолжить;
КонецЕсли;
Для Каждого x64 Из МассивРазрядностей Цикл
Если Не ТипКласса.Внутрипроцессный И x64 И ИзданиеПлатформы.Значение < "83" Тогда
Продолжить;
КонецЕсли;
ИмяКласса = "V" + ИзданиеПлатформы.Значение + ТипКласса.ИмяКлассаПослеV8;
СтрокаКласса = Классы.Добавить();
СтрокаКласса.ИзданиеПлатформы = ИзданиеПлатформы.Представление;
СтрокаКласса.ИмяКласса = ИмяКласса;
СтрокаКласса.ВнутриПроцессный = ТипКласса.Внутрипроцессный;
СтрокаКласса.ТипКласса = ТипКласса.Имя;
СтрокаКласса.x64 = x64;
КонецЦикла;
КонецЦикла;
СтрокаПриложения = Приложения.Добавить();
СтрокаПриложения.ИзданиеПлатформы = ИзданиеПлатформы.Значение;
СтрокаПриложения.ИмяКласса = "V" + ИзданиеПлатформы.Значение + ".ComConnector";
КонецЦикла;
КаталогПриложений = Новый 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") = 1
И Найти(НРег(ИмяКласса), ".comconnector") = 4
Тогда
НомерИзданияПлатформы = Число(Сред(ИмяКласса, 3, 1));
ИмяКласса = "V8" + НомерИзданияПлатформы + ".ComConnector";
ПолноеИмяФайла = Компонента.Value("DLL");
Это64битнаяКомпонента = Найти(НРег(ПолноеИмяФайла), "(x86)") = 0 И ирКэш.Это64битнаяОСЛкс(); // Ненадежно
СтрокаПриложения = НайтиЗаполнитьСтрокуДоступногоПриложения(ИмяКласса, Приложение, Это64битнаяКомпонента, ПриложенияСистемы);
СтрокиКлассов = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", ИмяКласса, Это64битнаяКомпонента));
Если СтрокиКлассов.Количество() > 0 Тогда
СтрокаКласса = СтрокиКлассов[0];
СтрокаКласса.ИмяФайла = ПолноеИмяФайла;
СтрокаКласса.ИдентификаторКласса = Компонента.Key;
СтрокаКласса.Зарегистрирован = Истина;
КонецЕсли;
КонецЕсли;
Прервать;
КонецЦикла;
КонецЕсли;
Если ирКэш.Это64битнаяОСЛкс() Тогда
Компоненты = ПриложенияСистемы.GetCollection("LegacyComponents", Приложение.Key);
Компоненты.Populate();
Для Каждого Компонента Из Компоненты Цикл
ИмяКласса = Компонента.Value("ProgID");
Если Истина
И Найти(НРег(ИмяКласса), "v8") = 1
И Найти(НРег(ИмяКласса), ".comconnector") = 4
Тогда
НомерИзданияПлатформы = Число(Сред(ИмяКласса, 3, 1));
ИмяКласса = "V8" + НомерИзданияПлатформы + ".ComConnector";
СтрокаПриложения = НайтиЗаполнитьСтрокуДоступногоПриложения(ИмяКласса, Приложение, Ложь, ПриложенияСистемы);
СтрокиКлассов = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", ИмяКласса, Ложь));
Если СтрокиКлассов.Количество() > 0 Тогда
СтрокаКласса = СтрокиКлассов[0];
ПолноеИмяФайла = Компонента.Value("InprocServer32");
СтрокаКласса.ИдентификаторКласса = Компонента.Key;
СтрокаКласса.ИмяФайла = ПолноеИмяФайла;
СтрокаКласса.Зарегистрирован = Истина;
КонецЕсли;
КонецЕсли;
Прервать;
КонецЦикла;
КонецЕсли;
Если СтрокаПриложения = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Приложение.Value("Activation") > 0 Тогда
СтрокаПриложения.ОтдельнаяАктивация = Истина;
КонецЕсли;
СтрокаПриложения.Создать = Истина;
СтрокаПриложения.ВремяОжидания = Приложение.Value("RecycleExpirationTimeout");
СтрокаПриложения.ИмяПользователя = Приложение.Value("Identity");
СтрокаПриложения.ПредельноеЧислоАктиваций = Приложение.Value("RecycleActivationLimit");
СтрокаПриложения.РазмерГруппы = Приложение.Value("ConcurrentApps");
СтрокаПриложения.Включено = Приложение.Value("IsEnabled");
НомерИзданияПлатформы = Прав(Приложение.Name, 1);
Роли = ПриложенияСистемы.GetCollection("Roles", Приложение.Key);
Роли.Populate();
Для Каждого Роль Из Роли Цикл
Прервать;
КонецЦикла;
//Пользователи = Роли.GetCollection("UsersInRole", Роль.Key);
//Пользователи.Populate();
//Для Каждого Пользователь Из Пользователи Цикл
// Прервать;
//КонецЦикла;
//Прервать;
КонецЦикла;
Для Каждого СтрокаТаблицы Из Классы Цикл
Если ЗначениеЗаполнено(СтрокаТаблицы.ИмяФайла) Тогда
ФайлWMI = ирОбщий.ПолучитьФайлWMIЛкс(СтрокаТаблицы.ИмяФайла);
Если ФайлWMI <> Неопределено Тогда
СтрокаТаблицы.ФайлСуществует = Истина;
КонецЕсли;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СтрЗаменить(СтрокаТаблицы.ИмяФайла, "\\", "\"), "\");
Фрагменты.Удалить(Фрагменты.ВГраница());
Фрагменты.Удалить(Фрагменты.ВГраница());
КаталогСборки = ирОбщий.СтрСоединитьЛкс(Фрагменты, "\") + "\";
СтрокаСборкиПлатформы = СборкиПлатформы.Найти(НРег(КаталогСборки), "НКаталог");
Если ЗначениеЗаполнено(СтрокаСборкиПлатформы) Тогда
СтрокаТаблицы.СборкаПлатформы = ПредставлениеСборкиПлатформы(СтрокаСборкиПлатформы, СтрокаТаблицы.Внутрипроцессный);
Иначе
Если ФайлWMI <> Неопределено Тогда
СтрокаТаблицы.СборкаПлатформы = ФайлWMI.Version;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Классы.Сортировать("ИзданиеПлатформы Убыв, ТипКласса");
Для Каждого СтрокаПриложения Из Приложения Цикл
НайденныеКлассы = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, Ложь));
Если НайденныеКлассы.Количество() > 0 Тогда
СтрокаПриложения.Доступен32 = НайденныеКлассы[0].Зарегистрирован;
КонецЕсли;
Если Не СтрокаПриложения.Доступен32 Тогда
СтрокаПриложения.x64 = ирКэш.Это64битнаяОСЛкс();
КонецЕсли;
Если ирКэш.Это64битнаяОСЛкс() Тогда
НайденныеКлассы = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, Истина));
Если НайденныеКлассы.Количество() > 0 Тогда
СтрокаПриложения.Доступен64 = НайденныеКлассы[0].Зарегистрирован;
КонецЕсли;
Если Не СтрокаПриложения.Доступен64 Тогда
СтрокаПриложения.x64 = Ложь;
КонецЕсли;
КонецЕсли;
Если Не СтрокаПриложения.ОтдельнаяАктивация Тогда
СтрокаПриложения.x64 = ирКэш.Это64битныйПроцессЛкс();
КонецЕсли;
НайденныеКлассы = Классы.НайтиСтроки(Новый Структура("ИмяКласса, x64", СтрокаПриложения.ИмяКласса, СтрокаПриложения.x64));
Если НайденныеКлассы.Количество() > 0 Тогда
СтрокаПриложения.СборкаПлатформы = НайденныеКлассы[0].СборкаПлатформы;
КонецЕсли;
КонецЦикла;
Приложения.Сортировать("ИмяКласса Убыв");
КонецПроцедуры
Функция НайтиЗаполнитьСтрокуДоступногоПриложения(ИмяКласса, Приложение, x64, УстановленныеПриложения)
СтрокаПриложения = Приложения.НайтиСтроки(Новый Структура("ИмяКласса", ИмяКласса))[0];
СтрокаПриложения.ИмяПриложения = Приложение.Name;
СтрокаПриложения.ИдентификаторКласса = Приложение.Key;
СтрокаПриложения.x64 = x64;
ДоступенПользователям = "";
Роли = УстановленныеПриложения.GetCollection("Roles", Приложение.Key);
Роли.Populate();
Для Каждого Роль Из Роли Цикл
Пользователи = Роли.GetCollection("UsersInRole", Роль.Key);
Пользователи.Populate();
Для Каждого Пользователь Из Пользователи Цикл
Если ДоступенПользователям <> "" Тогда
ДоступенПользователям = ДоступенПользователям + ",";
КонецЕсли;
ДоступенПользователям = ДоступенПользователям + Пользователь.Value("User");
КонецЦикла;
КонецЦикла;
СтрокаПриложения.ДоступенПользователям = ДоступенПользователям;
Возврат СтрокаПриложения;
КонецФункции
Функция ПредставлениеСборкиПлатформы(Знач СтрокаСборки, Знач Внутрипроцессный = Ложь) Экспорт
ПредставлениеСборки = СтрокаСборки.СборкаПлатформы;
//Если Не Внутрипроцессный Тогда
// ПредставлениеСборки = ПредставлениеСборки + " - " + ?(СтрокаСборки.x64, "64", "32");
//КонецЕсли;
Возврат ПредставлениеСборки;
КонецФункции
Функция ЗаполнитьТипыCOMКлассов() Экспорт
ТабличныйДокумент = ПолучитьМакет("ТипыCOMКлассов");
Результат = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ТабличныйДокумент);
ТипыComКлассов.Загрузить(Результат);
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтотОбъект.ТекущаяСборкаПлатформы = СистемнаяИнформация.ВерсияПриложения;
ЭтотОбъект.ТекущийПользовательОС = ирКэш.ТекущийПользовательОСЛкс();
ЭтотОбъект.x64Текущая = ирКэш.Это64битныйПроцессЛкс();
Возврат Результат;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");