//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем мПлатформа;
Перем мТипыСлужб Экспорт;
// "C:\Program Files\1cv8\current\bin\ras.exe" cluster --service --port=1545 localhost:2540
// "C:\Program Files\1cv8\current\bin\dbgs.exe" --service -p 2610"
// "C:\Program Files\1cv8\current\bin\crserver.exe" -srvc -port 1542 -d e:\storage83\
Функция ПрименитьИзменения() Экспорт
Для Каждого ТипСлужбы Из мТипыСлужб Цикл
ТаблицаСлужб = ЭтотОбъект[ТипСлужбы.Значение.ИмяТабличнойЧасти];
Для Каждого СтрокаСлужбы Из ТаблицаСлужб Цикл
ОбновитьСлужбуПоСтроке(СтрокаСлужбы);
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция ИзменитьСостояниеСлужбы(Знач СтрокаТаблицыСлужб, НовоеСостояния = "start") Экспорт
Если ирОбщий.ЭтоИмяЛокальногоСервераЛкс(Компьютер) Тогда
Команда = "net " + НовоеСостояния + " """ + СтрокаТаблицыСлужб.Имя + """";
Результат = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(Команда,,, Истина);
Результат = СокрЛП(Результат);
Сообщить(Результат);
Результат = НРег(Результат);
Результат = Ложь
Или Найти(Результат, "успешно")
Или Найти(Результат, "success");
Иначе
Служба = ПолучитьWMIОбъектСлужбы(СтрокаТаблицыСлужб.Имя, Компьютер);
РезультатКоманды = Служба.StopService();
РезультатКоманды = Служба.StartService();
Если РезультатКоманды <> 0 Тогда
// Расшифровка кодов
Если РезультатКоманды = 2 Тогда
Сообщить("Недостаточно прав", СтатусСообщения.Внимание);
Иначе
Сообщить("Код ошибки = " + РезультатКоманды + ", https://msdn.microsoft.com/ru-ru/library/aa393673(v=vs.85).aspx", СтатусСообщения.Внимание);
КонецЕсли;
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ОбновитьСлужбуПоСтроке(СтрокаСлужбы)
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = СлужбыАгентовСерверов.Добавить();
#КонецЕсли
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс(Компьютер);
Если СлужбаWMI = Неопределено Тогда
Возврат;
КонецЕсли;
АктуальныеСлужбы = СлужбаWMI.ExecQuery("SELECT *
|FROM Win32_Service
|WHERE NAME = '" + СтрокаСлужбы.Имя + "'");
АктуальнаяСлужба = Неопределено;
Для Каждого АктуальнаяСлужба Из АктуальныеСлужбы Цикл
Прервать;
КонецЦикла;
Команда = "sc \\" + Компьютер;
ИмяСлужбы = СтрокаСлужбы.Имя;
Если Ложь
Или Не ЗначениеЗаполнено(ИмяСлужбы)
Или ирОбщий.СтрокиРавныЛкс("<Авто>", ИмяСлужбы)
Тогда
Порт = ПортСтрокиСлужбы(СтрокаСлужбы);
ПортСтрока = XMLСтрока(Порт);
ИмяСлужбы = мТипыСлужб[СтрокаСлужбы.ТипСлужбы].ИмяПоУмолчанию + " " + ПортСтрока;
КонецЕсли;
ТекстИмяСлужбы = """" + ИмяСлужбы + """";
Если СтрокаСлужбы.Удалить Тогда
Команда = Команда + " delete " + ТекстИмяСлужбы;
Иначе
ОбновитьСтрокуЗапускаСлужбы(СтрокаСлужбы);
СтрокаЗапускаНовая = СтрокаСлужбы.СтрокаЗапускаНовая;
ПредставлениеСлужбы = СтрокаСлужбы.Представление;
Если Ложь
Или Не ЗначениеЗаполнено(ПредставлениеСлужбы)
Или ирОбщий.СтрокиРавныЛкс("<Авто>", ПредставлениеСлужбы)
Тогда
ПредставлениеСлужбы = мТипыСлужб[СтрокаСлужбы.ТипСлужбы].ПредставлениеПоУмолчанию + " " + ПортСтрока;
КонецЕсли;
ПредставлениеСлужбы = """" + ПредставлениеСлужбы + """";
//Если УдалитьСуществующуюПоИмени Тогда
// Команда = "sc delete " + ТекстИмяСлужбы;
// Результат = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(Команда);
// Сообщить(Результат);
//КонецЕсли;
Если АктуальнаяСлужба = Неопределено Тогда
ТипОперации = "create";
Иначе
ТипОперации = "config";
КонецЕсли;
Если СтрокаСлужбы.Автозапуск Тогда
РежимЗапускаСлужбы = "auto";
Иначе
РежимЗапускаСлужбы = "demand";
КонецЕсли;
Команда = Команда + " " + ТипОперации + " " + ТекстИмяСлужбы + " binPath= """ + СтрЗаменить(СтрокаЗапускаНовая, """", "\""") + """ start= " + РежимЗапускаСлужбы
+ " depend= Dnscache/Tcpip/lanmanworkstation/lanmanserver displayname= " + ПредставлениеСлужбы;
Если ЗначениеЗаполнено(СтрокаСлужбы.ПарольПользователя) Тогда
Команда = Команда + " obj= " + СтрокаСлужбы.ИмяПользователя + " password= " + СтрокаСлужбы.ПарольПользователя;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(Команда,,, Истина);
Если Не ЗначениеЗаполнено(Результат) Тогда
Результат = "Не удалось получить результат обработки службы";
КонецЕсли;
Сообщить("Результат обновления службы """ + ИмяСлужбы + """: " + СокрЛП(Результат));
// установить описание службы можно только отдельным запуском sc
Команда = "sc description " + ТекстИмяСлужбы + " " + ПредставлениеСлужбы;
Результат = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(Команда,,, Истина);
//Если ЗапуститьСразу Тогда
// Команда = "net start " + ТекстИмяСлужбы;
// Результат = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(Команда);
// Сообщить(Результат);
//КонецЕсли;
КонецПроцедуры
Функция ПолноеИмяИсполняемогоФайла(СтрокаСлужбы, выхКаталогИсполняемыхФайлов = "")
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = Обработки.ирУправлениеСлужбамиСервера1С.Создать().СлужбыАгентовСерверов.Добавить();
#КонецЕсли
КраткоеИмяИсполняемогоФайла = мТипыСлужб[СтрокаСлужбы.ТипСлужбы].ИмяИсполняемогоФайла;
Если ЗначениеЗаполнено(СтрокаСлужбы.СборкаПлатформыНовая) Тогда
СборкаПлатформыНовая = СтрокаСлужбы.СборкаПлатформыНовая;
Иначе
СборкаПлатформыНовая = СтрокаСлужбы.СборкаПлатформыАктивная;
КонецЕсли;
ОтборВерсий = Новый Структура(СтрокаСлужбы.ТипСлужбы + ", КлючСборки", Истина, СборкаПлатформыНовая);
ПодходящиеВерсии = СборкиПлатформы.Выгрузить(ОтборВерсий);
ПодходящиеВерсии.Сортировать("x64 Убыв");
Если ПодходящиеВерсии.Количество() > 0 Тогда
выхКаталогИсполняемыхФайлов = ПодходящиеВерсии[0].Каталог;
Иначе
выхКаталогИсполняемыхФайлов = СборкаПлатформыНовая;
КонецЕсли;
ирОбщий.ДобавитьЕслиНужноПравыйСлешВФайловыйПутьЛкс(выхКаталогИсполняемыхФайлов);
СтрокаЗапускаНовая = """" + выхКаталогИсполняемыхФайлов + "bin\" + КраткоеИмяИсполняемогоФайла + """";
Возврат СтрокаЗапускаНовая;
КонецФункции
Процедура ОбновитьСтрокуЗапускаСлужбы(Знач СтрокаСлужбы) Экспорт
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = Обработки.ирУправлениеСлужбамиСервера1С.Создать().СлужбыАгентовСерверов.Добавить();
#КонецЕсли
КаталогИсполняемыхФайлов = Неопределено;
СтрокаЗапускаНовая = ПолноеИмяИсполняемогоФайла(СтрокаСлужбы, КаталогИсполняемыхФайлов);
Порт = ПортСтрокиСлужбы(СтрокаСлужбы);
ПортСлужбы = XMLСтрока(Порт);
Если СтрокаСлужбы.ТипСлужбы = мТипыСлужб.АгентСервера.ТипСлужбы Тогда
НачальныйПортРабочихПроцессов = СтрокаСлужбы.НачальныйПортРабочихПроцессов;
Если Ложь
Или Не ЗначениеЗаполнено(НачальныйПортРабочихПроцессов)
Или ирОбщий.СтрокиРавныЛкс("<Авто>", НачальныйПортРабочихПроцессов)
Тогда
НачальныйПортРабочихПроцессов = Порт + 20;
КонецЕсли;
КонечныйПортРабочихПроцессов = СтрокаСлужбы.КонечныйПортРабочихПроцессов;
Если Ложь
Или Не ЗначениеЗаполнено(КонечныйПортРабочихПроцессов)
Или ирОбщий.СтрокиРавныЛкс("<Авто>", КонечныйПортРабочихПроцессов)
Тогда
КонечныйПортРабочихПроцессов = Порт + 51;
КонецЕсли;
ПортКластера = XMLСтрока(Порт + 1);
КаталогКонфигурации = СтрокаСлужбы.КаталогКонфигурации;
Если Ложь
Или Не ЗначениеЗаполнено(КаталогКонфигурации)
Или ирОбщий.СтрокиРавныЛкс("<Авто>", КаталогКонфигурации)
Тогда
ФайлКаталогаВерсии = Новый Файл(КаталогИсполняемыхФайлов);
КаталогКонфигурации = ФайлКаталогаВерсии.Путь + "srvinfo" + XMLСтрока(ПортСлужбы);
КонецЕсли;
СоздатьКаталог(КаталогКонфигурации);
ДиапазонПортов = XMLСтрока(НачальныйПортРабочихПроцессов) + ":" + XMLСтрока(КонечныйПортРабочихПроцессов);
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -srvc -agent -regport " + ПортКластера + " -port " + ПортСлужбы + " -range " + ДиапазонПортов + " -d """ + КаталогКонфигурации + """";
Если СтрокаСлужбы.РежимОтладки = "tcp" Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -debug";
ИначеЕсли СтрокаСлужбы.РежимОтладки = "http" Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -debug -http";
Если ЗначениеЗаполнено(СтрокаСлужбы.СерверОтладкиАдрес) Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -debugServerAddr " + СтрокаСлужбы.СерверОтладкиАдрес;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаСлужбы.СерверОтладкиПорт) Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -debugServerPort " + XMLСтрока(СтрокаСлужбы.СерверОтладкиПорт);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаСлужбы.СерверОтладкиПароль) Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -debugServerPwd " + СтрокаСлужбы.СерверОтладкиПароль;
КонецЕсли;
КонецЕсли;
ИначеЕсли СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверАдминистрирования.ТипСлужбы Тогда
Если СтрокаСлужбы.РежимКластера Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " cluster";
КонецЕсли;
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " --service --port=" + ПортСлужбы + " " + СтрокаСлужбы.СтрокаСоединенияАгентаСервера;
ИначеЕсли СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверОтладки.ТипСлужбы Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " --service -p " + ПортСлужбы;
ИначеЕсли СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверХранилища.ТипСлужбы Тогда
СтрокаЗапускаНовая = СтрокаЗапускаНовая + " -srvc -port " + ПортСлужбы + " -d """ + СтрокаСлужбы.КаталогХранилища + """";
КонецЕсли;
СтрокаСлужбы.СтрокаЗапускаНовая = СтрокаЗапускаНовая;
КонецПроцедуры
Функция ПортСтрокиСлужбы(Знач СтрокаСлужбы) Экспорт
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = Обработки.ирУправлениеСлужбамиСервера1С.Создать().СлужбыАгентовСерверов.Добавить();
#КонецЕсли
Порт = СтрокаСлужбы.Порт;
Если Не ЗначениеЗаполнено(Порт) Тогда
Порт = мТипыСлужб[СтрокаСлужбы.ТипСлужбы].ПортПоУмолчанию;
КонецЕсли;
Возврат Порт;
КонецФункции
Процедура Заполнить() Экспорт
ирОбщий.ЗаполнитьДоступныеСборкиПлатформыЛкс(СборкиПлатформы, Компьютер);
СлужбыАгентовСерверов.Очистить();
СлужбыСерверовАдминистрирования.Очистить();
СлужбыСерверовОтладки.Очистить();
СлужбыХранилищКонфигураций.Очистить();
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс(Компьютер);
Если СлужбаWMI = Неопределено Тогда
Возврат;
КонецЕсли;
// СлужбыАгентовСерверов
АктуальныеСлужбы = СлужбаWMI.ExecQuery("SELECT
|*
|FROM Win32_Service
|WHERE PathName LIKE '%" + мТипыСлужб.АгентСервера.ИмяИсполняемогоФайла + "%'
|AND PathName LIKE '%-srvc -agent%'");
Для Каждого АктуальнаяСлужба Из АктуальныеСлужбы Цикл
СтрокаСлужбы = ДобавитьЗаполнитьСтрокуСлужбы(СлужбыАгентовСерверов, АктуальнаяСлужба);
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = СлужбыАгентовСерверов.Добавить();
#КонецЕсли
СтрокаСлужбы.ТипСлужбы = мТипыСлужб.АгентСервера.ТипСлужбы;
СтрокаЗапускаСлужбы = СокрЛП(АктуальнаяСлужба.PathName) + " ";
МаркерПорт = " -port ";
Если Найти(НРег(СтрокаЗапускаСлужбы), МаркерПорт) > 0 Тогда
СтрокаСлужбы.Порт = Число(ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), МаркерПорт, " ", Ложь));
КонецЕсли;
СтрокаДиапазона = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), "-range ", " ", Ложь);
Если ЗначениеЗаполнено(СтрокаДиапазона) Тогда
ФрагментыДиапазона = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СтрокаДиапазона, ":");
СтрокаСлужбы.НачальныйПортРабочихПроцессов = Число(ФрагментыДиапазона[0]);
СтрокаСлужбы.КонечныйПортРабочихПроцессов = Число(ФрагментыДиапазона[1]);
КонецЕсли;
СтрокаСлужбы.КаталогКонфигурации = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(СтрокаЗапускаСлужбы, "-d """, """"); // Регистрозависимость маркера не убрана!
Если Не ЗначениеЗаполнено(СтрокаСлужбы.КаталогКонфигурации) Тогда
СтрокаСлужбы.КаталогКонфигурации = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(СтрокаЗапускаСлужбы, " -d ", " ");
КонецЕсли;
СтрокаСлужбы.РежимОтладки = ирОбщий.РежимОтладкиИзКоманднойСтрокиЛкс(СтрокаЗапускаСлужбы);
СтрокаСлужбы.СерверОтладкиАдрес = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(Нрег(СтрокаЗапускаСлужбы), НРег("-debugServerAddr "), " ", Ложь);
СтрокаСлужбы.СерверОтладкиПорт = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(Нрег(СтрокаЗапускаСлужбы), НРег("-debugServerPort "), " ", Ложь);
СтрокаСлужбы.СерверОтладкиПароль = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(Нрег(СтрокаЗапускаСлужбы), НРег("-debugServerPwd "), " ", Ложь);
КонецЦикла;
СлужбыАгентовСерверов.Сортировать("Имя");
// СлужбыАдминистрированияСерверов
// "C:\Program Files\1cv8\current\bin\ras.exe" cluster --service --port=1545 localhost:2540
АктуальныеСлужбы = СлужбаWMI.ExecQuery("SELECT
|*
|FROM Win32_Service
|WHERE PathName LIKE '%" + мТипыСлужб.СерверАдминистрирования.ИмяИсполняемогоФайла + "%'");
Для Каждого АктуальнаяСлужба Из АктуальныеСлужбы Цикл
СтрокаСлужбы = ДобавитьЗаполнитьСтрокуСлужбы(СлужбыСерверовАдминистрирования, АктуальнаяСлужба);
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = СлужбыСерверовАдминистрирования.Добавить();
#КонецЕсли
СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверАдминистрирования.ТипСлужбы;
СтрокаЗапускаСлужбы = СокрЛП(АктуальнаяСлужба.PathName) + " ";
МаркерПорт = " --port=";
Если Найти(НРег(СтрокаЗапускаСлужбы), МаркерПорт) > 0 Тогда
СтрокаСлужбы.Порт = Число(ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), МаркерПорт, " ", Ложь));
КонецЕсли;
МаркерПорт = " -p="; // альтернативный
Если Найти(НРег(СтрокаЗапускаСлужбы), МаркерПорт) > 0 Тогда
СтрокаСлужбы.Порт = Число(ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), МаркерПорт, " ", Ложь));
КонецЕсли;
СтрокаСлужбы.РежимКластера = Найти(НРег(СтрокаЗапускаСлужбы), " cluster ") > 0;
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СтрокаЗапускаСлужбы, " ", Истина);
СтрокаСлужбы.СтрокаСоединенияАгентаСервера = Фрагменты[Фрагменты.ВГраница()];
КонецЦикла;
СлужбыАгентовСерверов.Сортировать("Имя");
// СлужбыСерверовОтладки
// "C:\Program Files\1cv8\current\bin\dbgs.exe --service -p 2610"
АктуальныеСлужбы = СлужбаWMI.ExecQuery("SELECT
|*
|FROM Win32_Service
|WHERE PathName LIKE '%" + мТипыСлужб.СерверОтладки.ИмяИсполняемогоФайла + "%'");
Для Каждого АктуальнаяСлужба Из АктуальныеСлужбы Цикл
СтрокаСлужбы = ДобавитьЗаполнитьСтрокуСлужбы(СлужбыСерверовОтладки, АктуальнаяСлужба);
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = СлужбыСерверовОтладки.Добавить();
#КонецЕсли
СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверОтладки.ТипСлужбы;
СтрокаЗапускаСлужбы = СокрЛП(АктуальнаяСлужба.PathName) + " ";
МаркерПорт = " -p ";
Если Найти(НРег(СтрокаЗапускаСлужбы), МаркерПорт) > 0 Тогда
СтрокаСлужбы.Порт = Число(ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), МаркерПорт, " ", Истина));
КонецЕсли;
КонецЦикла;
СлужбыАгентовСерверов.Сортировать("Имя");
// СлужбыХранилищКонфигураций
// "C:\Program Files\1cv8\current\bin\crserver.exe" -srvc -port 1542 -d e:\storage83\
АктуальныеСлужбы = СлужбаWMI.ExecQuery("SELECT
|*
|FROM Win32_Service
|WHERE PathName LIKE '%" + мТипыСлужб.СерверХранилища.ИмяИсполняемогоФайла + "%'");
Для Каждого АктуальнаяСлужба Из АктуальныеСлужбы Цикл
СтрокаСлужбы = ДобавитьЗаполнитьСтрокуСлужбы(СлужбыХранилищКонфигураций, АктуальнаяСлужба);
#Если Сервер И Не Сервер Тогда
СтрокаСлужбы = СлужбыХранилищКонфигураций.Добавить();
#КонецЕсли
СтрокаСлужбы.ТипСлужбы = мТипыСлужб.СерверХранилища.ТипСлужбы;
СтрокаЗапускаСлужбы = СокрЛП(АктуальнаяСлужба.PathName);
МаркерПорт = " -port ";
Если Найти(НРег(СтрокаЗапускаСлужбы), МаркерПорт) > 0 Тогда
СтрокаСлужбы.Порт = Число(ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(НРег(СтрокаЗапускаСлужбы), МаркерПорт, " ", Ложь));
КонецЕсли;
СтрокаСлужбы.КаталогХранилища = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(СтрокаЗапускаСлужбы, "-d """, """"); // Регистрозависимость маркера не убрана!
Если Не ЗначениеЗаполнено(СтрокаСлужбы.КаталогХранилища) Тогда
СтрокаСлужбы.КаталогХранилища = ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(СтрокаЗапускаСлужбы, " -d ", " ");
КонецЕсли;
КонецЦикла;
СлужбыАгентовСерверов.Сортировать("Имя");
КонецПроцедуры
Функция ДобавитьЗаполнитьСтрокуСлужбы(ТаблицаСлужб, Знач АктуальнаяСлужба)
#Если Сервер И Не Сервер Тогда
ТаблицаСлужб = ЭтотОбъект.СлужбыСерверовОтладки;
#КонецЕсли
СтрокаЗапускаСлужбы = АктуальнаяСлужба.PathName;
СтрокаСлужбы = ТаблицаСлужб.Добавить();
СтрокаСлужбы.Имя = АктуальнаяСлужба.Name;
СтрокаСлужбы.СтрокаЗапускаСлужбы = СтрокаЗапускаСлужбы;
СтрокаЗапускаСлужбы = СтрЗаменить(СтрокаЗапускаСлужбы + " ", " /", " -");
Если ЗначениеЗаполнено(АктуальнаяСлужба.ProcessId) Тогда
АктивныйПроцесс = ирОбщий.ПолучитьПроцессОСЛкс(АктуальнаяСлужба.ProcessId);
Если ТипЗнч(АктивныйПроцесс) <> Тип("Строка") Тогда
СтрокаСлужбы.СтрокаЗапускаАктивная = АктивныйПроцесс.CommandLine;
СтрокаСлужбы.ПараметрыИзменены = ЗначениеЗаполнено(СтрокаСлужбы.СтрокаЗапускаАктивная) И Не ирОбщий.СтрокиРавныЛкс(СтрокаСлужбы.СтрокаЗапускаАктивная, СтрокаСлужбы.СтрокаЗапускаСлужбы);
Если Не ЗначениеЗаполнено(СтрокаСлужбы.СтрокаЗапускаАктивная) Тогда
СтрокаСлужбы.СтрокаЗапускаАктивная = "<Для получения данных требуется запуск от имени администратора>";
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтрокаСлужбы.Представление = АктуальнаяСлужба.Caption;
СтрокаСлужбы.ИмяПользователя = АктуальнаяСлужба.StartName;
СтрокаСлужбы.ИдентификаторПроцесса = АктуальнаяСлужба.ProcessId;
СтрокаСлужбы.Выполняется = ирОбщий.СтрокиРавныЛкс(АктуальнаяСлужба.State, "Running");
СтрокаСлужбы.Автозапуск = ирОбщий.СтрокиРавныЛкс(АктуальнаяСлужба.StartMode, "Auto");
СтрокаСлужбы.СборкаПлатформыНовая = ПолучитьСборкуПлатформуИзКоманднойСтроки(СтрокаЗапускаСлужбы);
Если ЗначениеЗаполнено(СтрокаСлужбы.ИдентификаторПроцесса) Тогда
АктивныйПроцесс = ирОбщий.ПолучитьПроцессОСЛкс(АктуальнаяСлужба.ProcessId, , Компьютер);
СтрокаЗапускаПроцесса = АктивныйПроцесс.CommandLine;
Иначе
АктивныйПроцесс = Неопределено;
КонецЕсли;
Если АктивныйПроцесс <> Неопределено И ТипЗнч(СтрокаЗапускаПроцесса) = Тип("Строка") И ЗначениеЗаполнено(СтрокаЗапускаПроцесса) Тогда
СтрокаСлужбы.СборкаПлатформыАктивная = ПолучитьСборкуПлатформуИзКоманднойСтроки(СтрокаЗапускаПроцесса);
КонецЕсли;
Возврат СтрокаСлужбы;
КонецФункции
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Отказ = Ложь;
МассивИсключений = Новый Массив;
МассивИсключений.Добавить("");
МассивИсключений.Добавить("<Авто>");
Для Каждого ТипСлужбы Из мТипыСлужб Цикл
ТипСлужбы = ТипСлужбы.Значение;
ИмяТабличнойЧасти = ТипСлужбы.ИмяТабличнойЧасти;
ТаблицаСлужб = ЭтотОбъект[ИмяТабличнойЧасти];
Отказ = Не ирОбщий.ПроверитьУникальностьСтрокТЧПоКолонкеЛкс(ЭтотОбъект, ИмяТабличнойЧасти, "Имя",,, МассивИсключений) Или Отказ;
Отказ = Не ирОбщий.ПроверитьУникальностьСтрокТЧПоКолонкеЛкс(ЭтотОбъект, ИмяТабличнойЧасти, "Представление",,, МассивИсключений) Или Отказ;
Отказ = Не ирОбщий.ПроверитьУникальностьСтрокТЧПоКолонкеЛкс(ЭтотОбъект, ИмяТабличнойЧасти, "Порт", , Новый Структура("Автозапуск, Удалить", Истина, Ложь)) Или Отказ;
Если ТипСлужбы.ТипСлужбы = мТипыСлужб.СерверХранилища.ТипСлужбы Тогда
Отказ = Не ирОбщий.ПроверитьУникальностьСтрокТЧПоКолонкеЛкс(ЭтотОбъект, ИмяТабличнойЧасти, "КаталогХранилища", , Новый Структура("Автозапуск, Удалить", Истина, Ложь)) Или Отказ;
ИначеЕсли ТипСлужбы.ТипСлужбы = мТипыСлужб.АгентСервера.ТипСлужбы Тогда
Отказ = Не ирОбщий.ПроверитьУникальностьСтрокТЧПоКолонкеЛкс(ЭтотОбъект, ИмяТабличнойЧасти, "КаталогКонфигурации", , Новый Структура("Автозапуск, Удалить", Истина, Ложь)) Или Отказ;
КонецЕсли;
Для Индекс = 0 По ТаблицаСлужб.Количество() - 1 Цикл
СтрокаСлужбы = ТаблицаСлужб[Индекс];
Если Не СтрокаСлужбы.Удалить Тогда
МассивПутейКДанным = Новый Соответствие;
Если ТипСлужбы.ТипСлужбы = мТипыСлужб.СерверХранилища.ТипСлужбы Тогда
МассивПутейКДанным.Вставить(ИмяТабличнойЧасти + "[" + Индекс + "].КаталогХранилища");
ИначеЕсли ТипСлужбы.ТипСлужбы = мТипыСлужб.СерверАдминистрирования.ТипСлужбы Тогда
МассивПутейКДанным.Вставить(ИмяТабличнойЧасти + "[" + Индекс + "].СтрокаСоединенияАгентаСервера");
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаСлужбы.СборкаПлатформыАктивная) Тогда
МассивПутейКДанным.Вставить(ИмяТабличнойЧасти + "[" + Индекс + "].СборкаПлатформыНовая");
КонецЕсли;
МассивПутейКДанным.Вставить(ИмяТабличнойЧасти + "[" + Индекс + "].Порт");
ирОбщий.ПроверитьЗаполнениеРеквизитовОбъектаЛкс(ЭтотОбъект, МассивПутейКДанным, Отказ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьWMIОбъектСлужбы(ИмяСлужбы, Компьютер = Неопределено, ВызыватьИсключениеЕслиНеНайдена = Истина) Экспорт
СлужбаWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс(Компьютер);
Если СлужбаWMI = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ТекстЗапросаWQL = "Select * from Win32_Service Where Name = '" + ИмяСлужбы + "'";
ВыборкаСистемныхСлужб = СлужбаWMI.ExecQuery(ТекстЗапросаWQL);
Для Каждого лСистемнаяСлужба Из ВыборкаСистемныхСлужб Цикл
СистемнаяСлужба = лСистемнаяСлужба;
КонецЦикла;
Если СистемнаяСлужба = Неопределено Тогда
СистемнаяСлужба = "Системная служба с именем """ + ИмяСлужбы + """ не найдена на компьютере """ + Компьютер + """" ; // Сигнатура (начало строки) используется в Обработка.ПоддержаниеСервераПриложенийИис
Если ВызыватьИсключениеЕслиНеНайдена Тогда
ВызватьИсключение СистемнаяСлужба;
КонецЕсли;
КонецЕсли;
Возврат СистемнаяСлужба;
КонецФункции
Функция ПолучитьСборкуПлатформуИзКоманднойСтроки(Строка)
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = "";
ВычислительРегулярок = мПлатформа.RegExp;
ВычислительРегулярок.Pattern = """(.+\\\d+\.\d+\.\d+\.\d+\\)";
Вхождения = ВычислительРегулярок.Execute(Строка);
Если Вхождения.Count > 0 Тогда
Результат = Вхождения.Item(0).Submatches(0);
Иначе
ВычислительРегулярок = мПлатформа.RegExp;
ВычислительРегулярок.Pattern = """(.+\\)bin\\.*\.exe""";
Вхождения = ВычислительРегулярок.Execute(Строка);
Если Вхождения.Count > 0 Тогда
Результат = Вхождения.Item(0).Submatches(0);
КонецЕсли;
КонецЕсли;
Для Каждого СтрокаСборкаПлатформы Из СборкиПлатформы Цикл
Если ирОбщий.СтрокиРавныЛкс(СтрокаСборкаПлатформы.Каталог, Результат) Тогда
Результат = СтрокаСборкаПлатформы.КлючСборки;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПолучитьПолноеИмяФайлаСпискаСерверов1С() Экспорт
КаталогФайловыхКэшей = ирКэш.КаталогИзданияПлатформыВПрофилеЛкс();
ПолноеИмяФайлаСпискаСерверов = КаталогФайловыхКэшей + "\" + "appsrvrs.lst";
Возврат ПолноеИмяФайлаСпискаСерверов;
КонецФункции
Функция ПолучитьТаблицуСерверовИзСпискаПользователя(ТаблицаСерверов = Неопределено) Экспорт
ТаблицаСерверовИзФайла = Новый ТаблицаЗначений;
ТаблицаСерверовИзФайла.Колонки.Добавить("Протокол");
ТаблицаСерверовИзФайла.Колонки.Добавить("Компьютер");
ТаблицаСерверовИзФайла.Колонки.Добавить("НКомпьютер");
ТаблицаСерверовИзФайла.Колонки.Добавить("Порт");
ТаблицаСерверовИзФайла.Колонки.Добавить("Наименование");
//ТаблицаСерверовИзФайла.Колонки.Добавить("ИзданиеПлатформы");
ТаблицаСерверов.Колонки.Добавить("НКомпьютер");
Для Каждого СтрокаСервера Из ТаблицаСерверов Цикл
СтрокаСервера.НКомпьютер = НРег(СтрокаСервера.Компьютер);
КонецЦикла;
ПолноеИмяФайлаСпискаСерверов = ПолучитьПолноеИмяФайлаСпискаСерверов1С();
Файл = Новый Файл(ПолноеИмяФайлаСпискаСерверов);
Если Файл.Существует() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ПолноеИмяФайлаСпискаСерверов);
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
// {2,
// {"tcp","pcname",1540,""},
// {"tcp","pcname",1740,""}
// }
ДокументDOM = ирОбщий.ПолучитьДокументDOMИзСтрокиВнутрЛкс(ТекстФайла);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/elem/elem";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
ДочерниеУзлы = Узел.ДочерниеУзлы;
// Здесь есть пробельный узел, который сместит индексы н начиная с 2, если отключить игнорирование пробельных символов при построении документа DOM
Порт = Вычислить(ДочерниеУзлы[2].ТекстовоеСодержимое);
Компьютер = ирОбщий.ПолучитьПоследнийФрагментЛкс(Вычислить(ДочерниеУзлы[1].ТекстовоеСодержимое), "/"); // Имя компьютера может быть указано в виде "REMOTE/GOMER"
КлючПоиска = Новый Структура("НКомпьютер, Порт", НРег(Компьютер), Порт);
Если ТаблицаСерверовИзФайла.НайтиСтроки(КлючПоиска).Количество() > 0 Тогда
Продолжить;
КонецЕсли;
ОписаниеСервера = ТаблицаСерверовИзФайла.Добавить();
ЗаполнитьЗначенияСвойств(ОписаниеСервера, КлючПоиска);
ОписаниеСервера.Протокол = Вычислить(ДочерниеУзлы[0].ТекстовоеСодержимое);
ОписаниеСервера.Компьютер = Компьютер;
ОписаниеСервера.Наименование = Вычислить(ДочерниеУзлы[3].ТекстовоеСодержимое);
Если Не ЗначениеЗаполнено(ОписаниеСервера.Наименование) Тогда
ОписаниеСервера.Наименование = ОписаниеСервера.Компьютер + ":" + XMLСтрока(ОписаниеСервера.Порт);
КонецЕсли;
СтрокиСервера = ТаблицаСерверов.НайтиСтроки(Новый Структура("НКомпьютер, Порт", ОписаниеСервера.НКомпьютер, ОписаниеСервера.Порт));
КонецЦикла;
КонецЕсли;
Если ТаблицаСерверов <> Неопределено Тогда
Для Каждого СтрокаСервера Из ТаблицаСерверов Цикл
СтрокаСервераИзФайла = ТаблицаСерверовИзФайла.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСервераИзФайла, СтрокаСервера);
СтрокаСервераИзФайла.Протокол = "tcp";
КонецЦикла;
КонецЕсли;
Возврат ТаблицаСерверовИзФайла;
КонецФункции
Процедура ПоместитьТаблицуСерверовВСписокПользователя(ТаблицаСерверов, ТекущаяСтрокаТаблицыСерверов = Неопределено) Экспорт
#Если _ Тогда
ТаблицаСерверов = Новый ТаблицаЗначений;
ТаблицаСерверов.Колонки.Добавить("Протокол");
ТаблицаСерверов.Колонки.Добавить("Компьютер");
ТаблицаСерверов.Колонки.Добавить("Порт");
ТаблицаСерверов.Колонки.Добавить("Наименование");
#КонецЕсли
// {2,
// {"tcp","pyramid",1540,""},
// {"tcp","pyramid",1740,""}
// }
Текст = "";
Для Каждого СтрокаСервера Из ТаблицаСерверов Цикл
Если Текст <> "" Тогда
Текст = Текст + "," + Символы.ПС;
КонецЕсли;
Текст = Текст + "{"
+ """" + СтрокаСервера.Протокол + ""","
+ """" + СтрокаСервера.Компьютер + ""","
+ XMLСтрока(СтрокаСервера.Порт) + ","
+ """" + СтрокаСервера.Наименование + """"
+ "}";
КонецЦикла;
Текст = "{" + XMLСтрока(ТаблицаСерверов.Количество()) + "," + Символы.ПС + Текст + "}";
ПолноеИмяФайлаСпискаСерверов = ПолучитьПолноеИмяФайлаСпискаСерверов1С();
Файл = Новый Файл(ПолноеИмяФайлаСпискаСерверов);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(Текст);
ТекстовыйДокумент.Записать(ПолноеИмяФайлаСпискаСерверов);
Если ТекущаяСтрокаТаблицыСерверов <> Неопределено Тогда
УстановитьТекущийПутьВДеревеКонсолиСерверов(ТекущаяСтрокаТаблицыСерверов, ТаблицаСерверов);
КонецЕсли;
КонецПроцедуры
Процедура УстановитьТекущийПутьВДеревеКонсолиСерверов(ТекущаяСтрокаТаблицыСерверов, ТаблицаСерверов) Экспорт
МассивПути = ПолучитьМассивПутиКСсылкеВКонсолиСерверов(ТекущаяСтрокаТаблицыСерверов);
ПолноеИмяФайлаНастроекКонсолиСерверов = ирОбщий.КаталогПеремещаемыхДанныхПриложенийЛкс() + "\Microsoft\MMC\1CV8 Servers";
Файл = Новый Файл(ПолноеИмяФайлаНастроекКонсолиСерверов);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
ДокументDOM = ирОбщий.ПрочитатьФайлВДокументDOMЛкс(ПолноеИмяФайлаНастроекКонсолиСерверов);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/MMC_ConsoleFile/Views/View/BookMark[2]";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ);
ЭлементДом = РезультатXPath.ПолучитьСледующий();
КорневыеЭлементы = ЭлементДом.ПолучитьЭлементыПоИмени("DynamicPath");
Если КорневыеЭлементы.Количество() > 0 Тогда
КорневойЭлемент = КорневыеЭлементы[0];
Иначе
КорневойЭлемент = ДокументDOM.СоздатьЭлемент("DynamicPath");
ЭлементДом.ДобавитьДочерний(КорневойЭлемент);
КонецЕсли;
Пока КорневойЭлемент.ПервыйДочерний <> Неопределено Цикл
КорневойЭлемент.УдалитьДочерний(КорневойЭлемент.ПервыйДочерний);
КонецЦикла;
Для Каждого ЭлементПути Из МассивПути Цикл
ЭлементСегмент = ДокументDOM.СоздатьЭлемент("Segment");
ЭлементСегмент.УстановитьАтрибут("String", ЭлементПути);
КорневойЭлемент.ДобавитьДочерний(ЭлементСегмент);
КонецЦикла;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолноеИмяФайлаНастроекКонсолиСерверов);
ЗаписьДом = Новый ЗаписьDOM;
ЗаписьДом.Записать(ДокументDOM, ЗаписьXML);
КонецПроцедуры
Функция ПолучитьМассивПутиКСсылкеВКонсолиСерверов(СтрокаТаблицыСерверов)
//
//
//
//
//
МассивПути = Новый Массив;
ЭлементПути = СтрокаТаблицыСерверов.Компьютер;
Если ирОбщий.ЭтоИмяЛокальногоСервераЛкс(ЭлементПути) Тогда
ЭлементПути = "(*)" + ЭлементПути;
КонецЕсли;
МассивПути.Добавить(ЭлементПути);
Возврат МассивПути;
КонецФункции
Процедура ОткрытьКонсольСерверов1С(Знач ТаблицаСерверов = Неопределено, Знач ТекущаяСтрокаТаблицыСерверов = Неопределено) Экспорт
ОбработкаРегистрации = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирУправлениеCOMКлассами1С");
#Если Сервер И Не Сервер Тогда
ОбработкаРегистрации = Обработки.ирУправлениеCOMКлассами1С.Создать();
ТекущаяСтрокаТаблицыСерверов = Обработки.ирУправлениеСлужбамиСервера1С.Создать().СлужбыАгентовСерверов.Добавить();
#КонецЕсли
ОбработкаРегистрации.ЗаполнитьТипыCOMКлассов();
ирОбщий.ЗаполнитьДоступныеСборкиПлатформыЛкс(СборкиПлатформы, Компьютер, ОбработкаРегистрации.ТипыComКлассов);
ТипКласса = "ServerAdminScope";
Если ЗначениеЗаполнено(ТекущаяСтрокаТаблицыСерверов.СборкаПлатформыАктивная) Тогда
СборкаПлатформыАктивная = ТекущаяСтрокаТаблицыСерверов.СборкаПлатформыАктивная;
Иначе
СборкаПлатформыАктивная = ТекущаяСтрокаТаблицыСерверов.СборкаПлатформыНовая;
КонецЕсли;
СтрокаСборкиПлатформы = СборкиПлатформы.НайтиСтроки(Новый Структура("КлючСборки," + ТипКласса, СборкаПлатформыАктивная, Истина));
Если СтрокаСборкиПлатформы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СтрокаСборкиПлатформы = СтрокаСборкиПлатформы[0];
#Если Сервер И Не Сервер Тогда
СтрокаСборкиПлатформы = СборкиПлатформы[0];
#КонецЕсли
ПолноеИмяФайлаКонсоли = "";
КаталогПрограммныхФайлов = ирОбщий.КаталогПрограммныхФайловОСЛкс(СтрокаСборкиПлатформы.x64);
Если ирКэш.НомерИзданияПлатформыЛкс() = "81" Тогда
ПолноеИмяФайлаКонсоли = КаталогПрограммныхФайлов + "\1cv81\bin\1CV8 Servers.msc";
Файл = Новый Файл(ПолноеИмяФайлаКонсоли);
Если Не Файл.Существует() Тогда
ПолноеИмяФайлаКонсоли = "";
КонецЕсли;
ИначеЕсли ирКэш.НомерИзданияПлатформыЛкс() = "82" Тогда
ПолноеИмяФайлаКонсоли = КаталогПрограммныхФайлов + "\1cv82\common\";
Если СтрокаСборкиПлатформы.x64 Тогда
ПолноеИмяФайлаКонсоли = ПолноеИмяФайлаКонсоли + "1CV8 Servers (x86-64).msc";
Иначе
ПолноеИмяФайлаКонсоли = ПолноеИмяФайлаКонсоли + "1CV8 Servers.msc";
КонецЕсли;
Файл = Новый Файл(ПолноеИмяФайлаКонсоли);
Если Не Файл.Существует() Тогда
ПолноеИмяФайлаКонсоли = "";
КонецЕсли;
ИначеЕсли ирКэш.НомерИзданияПлатформыЛкс() = "83" Тогда
ПолноеИмяФайлаКонсоли = КаталогПрограммныхФайлов + "\1cv8\common\";
Если СтрокаСборкиПлатформы.x64 Тогда
ПолноеИмяФайлаКонсоли = ПолноеИмяФайлаКонсоли + "1CV8 Servers (x86-64).msc";
Иначе
ПолноеИмяФайлаКонсоли = ПолноеИмяФайлаКонсоли + "1CV8 Servers.msc";
КонецЕсли;
Файл = Новый Файл(ПолноеИмяФайлаКонсоли);
Если Не Файл.Существует() Тогда
ПолноеИмяФайлаКонсоли = "";
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ПолноеИмяФайлаКонсоли) Тогда
ТаблицаСерверов = ПолучитьТаблицуСерверовИзСпискаПользователя(ТаблицаСерверов);
ПоместитьТаблицуСерверовВСписокПользователя(ТаблицаСерверов, ТекущаяСтрокаТаблицыСерверов);
ОбработкаРегистрации = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирУправлениеCOMКлассами1С");
#Если Сервер И Не Сервер Тогда
ОбработкаРегистрации = Обработки.ирУправлениеCOMКлассами1С.Создать();
#КонецЕсли
ОбработкаРегистрации.ЗаполнитьТипыCOMКлассов();
СтрокаТипаКласса = ОбработкаРегистрации.ТипыComКлассов.Найти(ТипКласса, "Имя");
ОбработкаРегистрации.СборкиПлатформы.Загрузить(СборкиПлатформы.Выгрузить());
ОбработкаРегистрации.ЗарегистрироватьCOMКлассСборкиПлатформы(СтрокаТипаКласса, СтрокаСборкиПлатформы.x64, СтрокаСборкиПлатформы.СборкаПлатформы);
ЗапуститьПриложение("""" + ПолноеИмяФайлаКонсоли + """");
Иначе
Если СтрокаСборкиПлатформы.x64 Тогда
ПредставлениеРазрядности = "64";
Иначе
ПредставлениеРазрядности = "32";
КонецЕсли;
Сообщить("Файл консоли серверов 1С " + ирКэш.НомерИзданияПлатформыЛкс() + " " + ПредставлениеРазрядности + "б не найден по пути """ + ПолноеИмяФайлаКонсоли + """");
КонецЕсли;
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = ирОбщий.ВосстановитьЗначениеЛкс("ирПолноеИмяФайлаОсновногоМодуля");
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
мПлатформа = ирКэш.Получить();
ТаблицаТиповСлужб = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("ПараметрыТиповСлужб"),,,, Истина);
мТипыСлужб = Новый Структура;
Для Каждого СтрокаТаблицы Из ТаблицаТиповСлужб Цикл
мТипыСлужб.Вставить(СтрокаТаблицы.ТипСлужбы, СтрокаТаблицы);
КонецЦикла;
ЭтотОбъект.Компьютер = ИмяКомпьютера();