mirror of
https://github.com/tormozit/RDT1C.git
synced 2025-12-17 13:14:11 +00:00
549 lines
38 KiB
Plaintext
549 lines
38 KiB
Plaintext
//ирПортативный Перем ирПортативный Экспорт;
|
||
//ирПортативный Перем ирОбщий Экспорт;
|
||
//ирПортативный Перем ирСервер Экспорт;
|
||
//ирПортативный Перем ирКэш Экспорт;
|
||
//ирПортативный Перем ирПривилегированный Экспорт;
|
||
|
||
Функция ВыполнитьРегистрацию() Экспорт
|
||
|
||
//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";
|
||
//ирПортативный #Если Клиент Тогда
|
||
//ирПортативный Контейнер = Новый Структура();
|
||
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
|
||
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
|
||
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
|
||
//ирПортативный ирПортативный.Открыть();
|
||
//ирПортативный КонецЕсли;
|
||
//ирПортативный #Иначе
|
||
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
|
||
//ирПортативный #КонецЕсли
|
||
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
|
||
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
|
||
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
|
||
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
|