Поиск ИД запущенного процесса

09.12.24

База данных - Администрирование СУБД

Много вариантов определения номера собственного процесса самого 1С8. В ходе поиска, опираясь на общедоступную информацию, дополнил алгоритм, но с учетом определения ИД запущенного приложения.

Удивительно то, что по умолчанию разработчики в компонентах не дополняют свойство номера используемого процесса, хотя это было-бы полезно. Поэтому как видим на рисунке вопрос о номере двусторонний. Ни одно из приложений не знает под каким ИД оно находится, приходится изощряться применяя сторонние языки программирования. 

Итак, приступим. Пример использования.
Если указать команду:

Excel=Новый COMОбъект("Excel.Application");

То сможем узнать его номер процесса. По этому номеру, например, можно процесс выгрузить, если он по какой-то причине остался.

Подготовим инструменты функций для поставленной задачи (3 функции)

Функция №1 получения таблицы значений всех запущенных процессов, чтобы отслеживать указанный процесс в параметре можно указать любой из них, например приложение Excel

//Функция получения таблицы значений всех запущенных процессов
//Параметры
//ПоФильтруПриложения - Строка -Указать имя приложения. Например "EXCEL.EXE"
//-Если не указано тогда по всем процессам
//Возвращаемое значение
//ТаблицаЗначений с именами колонок
//	-Приложение - Строка
//	-ИД - Число
//	-РодительскийИД - Число
Функция ТабЗнач_ПолучитьВсеПроцессы(Знач ПоФильтруПриложения="") Экспорт
	ПоФильтруПриложения=НРег(ПоФильтруПриложения);
	ТабЗн=Новый ТаблицаЗначений;
	ТабЗн.Колонки.Добавить("Приложение");
	ТабЗн.Колонки.Добавить("ИД");
	ТабЗн.Колонки.Добавить("РодительскийИД");
	
	Локатор=Новый COMОбъект("wbemscripting.swbemlocator");
	Сервис=Локатор.ConnectServer(".", "\root\cimv2");
	ComputerSystems = Сервис.ExecQuery("Select * from Win32_Process");
	
	Для Каждого ComputerSystem Из ComputerSystems Цикл
		ИмяПриложения=ComputerSystem.Name;
		Если ПоФильтруПриложения="" ИЛИ НРег(ИмяПриложения)=ПоФильтруПриложения Тогда
			СтрТаб=ТабЗн.Добавить();
			СтрТаб.Приложение=ИмяПриложения;
			СтрТаб.ИД=ComputerSystem.ProcessID;
			СтрТаб.РодительскийИД=ComputerSystem.ParentProcessID;
		КонецЕсли;
	КонецЦикла;
	Возврат ТабЗн	
КонецФункции


Функция №2 по объединению таблиц

//Объединяет две таблицы в одну (Необходимо чтобы имена колонок обеих таблиц были идентичными)
//Параметры
//Таблица1 - ТаблицаЗначений - Таблица значения (Будет скопирована для пополнения)
//Таблица2 - ТаблицаЗначений - Таблица значений как добавляемая
//Возвращаемое значение
//Таблица значений - Новая (Объединённая)
Функция ТабЗнач_ОбъединитьТаблицы(Таблица1, Таблица2) Экспорт
	Таблица=Таблица1.Скопировать();
	Для Каждого СтрТаб Из Таблица2 Цикл
		ЗаполнитьЗначенияСвойств(Таблица.Добавить(), СтрТаб);
	КонецЦикла;
	Возврат Таблица
КонецФункции


Функция №3 для работы с таблицами значений. Необходима для отслеживания изменений до и после загрузки стороннего приложения

//Вывести массив строк из обеих таблиц непохожие друг-на-друга. Таблицы должны быть идентичные по итменам колонок
//Параметры
//Таблица1 - ТаблицаЗначений - Таблица значений в произвольном порядке, но с идентичными именами колонок
//Таблица2 - ТаблицаЗначений - Таблица значений в произвольном порядке, но с идентичными именами колонок
//Возвращаемое значение
//МассивСтрок - массив строк объединённой таблицы, имеющие различия
Функция МассивСтрок_ПолучитьМассивОтличающихсяСтрок(Таблица1, Таблица2) Экспорт
	СистемнаяКолонка="_ГруппаКолонка";
	мКолонки=Таблица1.Колонки; //Получить массив имён колонок
	СтрКолонки="";
	Для Каждого ИмяК Из мКолонки Цикл
		СтрКолонки=СтрКолонки+ИмяК.Имя+",";
	КонецЦикла;
	СтрКолонки=Лев(СтрКолонки, СтрДлина(СтрКолонки)-1);
	
	Таблица3=ТабЗнач_ОбъединитьТаблицы(Таблица1, Таблица2);
	Таблица3.Колонки.Добавить(СистемнаяКолонка);
	Таблица3.ЗаполнитьЗначения(1,СистемнаяКолонка);
	Таблица3.Свернуть(СтрКолонки,СистемнаяКолонка);
	мСтр=Таблица3.НайтиСтроки(Новый Структура(СистемнаяКолонка, 1));
	Возврат мСтр
КонецФункции


Результирующая функция. Теперь как это совместить для определения ИД процесса

//Подключает компоненту методом  - Новый COMОбъект(ИмяКомпоненты)
//Параметры
//ИмяКомпоненты - Строка - Имя компоненты. Например: "Excel.Application"
//ИмяПроцесса - Строка - Имя, например: "EXCEL.EXE", так как оно называется в окне Диспетчера задач, по колонке [Имя образа]
//Возвращаемое значение
//Структура - с именами ключей:
//	-Приложение - COM-Объект
//	-ИД- Число/Неопределено
//	-РодительскийИД- Число/Неопределено
Функция ПодключитьКомпоненту(ИмяКомпоненты, ИмяПроцесса) Экспорт
	Стрк=Новый Структура;
	Стрк.Вставить("Приложение", Неопределено);	
	Стрк.Вставить("ИД", Неопределено);
	Стрк.Вставить("РодительскийИД", Неопределено);
	
	ТЗ1=ТабЗнач_ПолучитьВсеПроцессы(ИмяПроцесса);
	Попытка
		COM=Новый COMОбъект(ИмяКомпоненты);
		Стрк.Приложение=COM;
		
		ТЗ2=ТабЗнач_ПолучитьВсеПроцессы(ИмяПроцесса);
		мСтр=МассивСтрок_ПолучитьМассивОтличающихсяСтрок(ТЗ1, ТЗ2);
		Если мСтр.Количество()=1 Тогда
			Стрк.ИД=мСтр[0].ИД;
			Стрк.РодительскийИД=мСтр[0].РодительскийИД;
		КонецЕсли
		
	Исключение
		Сообщить("Не удалось загрузить компоненту: "+ИмяКомпоненты);
		Сообщить(ОписаниеОшибки());
	КонецПопытки;	
	Возврат Стрк	
КонецФункции


Теперь у нас есть всё необходимое. Для получения приложения с его ИД, пишем команду:

Стрк=ПодключитьКомпоненту("Excel.Application", "EXCEL.EXE");
Excel=Стрк.Приложение;
НомерПроцесса=Стрк.ИД;




Послесловие
ДЛЯ ЛЕНИВЫХ
Эта функция "ВСЁ В ОДНОМ" без прочих подготовок.

//Подключает компоненту методом  - Новый COMОбъект(ИмяКомпоненты)
//Параметры
//ИмяКомпоненты - Строка - Имя компоненты. Например: "Excel.Application"
//ИмяПроцесса - Строка - Имя, например: "EXCEL.EXE", так как оно называется в окне Диспетчера задач, по колонке [Имя образа]
//_ПолучитьТаблицуПроцессов - Булево - Не использовать. Это для внутреннего использования
//Возвращаемое значение
//Структура - с именами ключей:
//	-Приложение - COM-Объект/Неопределено
//	-ИД - Число/Неопределено
//	-РодительскийИД - Число/Неопределено
Функция ПодключитьКомпоненту(ИмяКомпоненты, ИмяПроцесса, _ПолучитьТаблицуПроцессов=Ложь) Экспорт
	
	Если _ПолучитьТаблицуПроцессов Тогда
		ПоФильтруПриложения2=НРег(ИмяПроцесса);
		ТабЗн=Новый ТаблицаЗначений;
		ТабЗн.Колонки.Добавить("Приложение");
		ТабЗн.Колонки.Добавить("ИД");
		ТабЗн.Колонки.Добавить("РодительскийИД");
		
		Локатор=Новый COMОбъект("wbemscripting.swbemlocator");
		Сервис=Локатор.ConnectServer(".", "\root\cimv2");
		ComputerSystems = Сервис.ExecQuery("Select * from Win32_Process");
		
		Для Каждого ComputerSystem Из ComputerSystems Цикл
			ИмяПриложения=ComputerSystem.Name;
			Если ИмяПроцесса="" ИЛИ НРег(ИмяПриложения)=ПоФильтруПриложения2 Тогда
				СтрТаб=ТабЗн.Добавить();
				СтрТаб.Приложение=ИмяПриложения;
				СтрТаб.ИД=ComputerSystem.ProcessID;
				СтрТаб.РодительскийИД=ComputerSystem.ParentProcessID;
			КонецЕсли;
		КонецЦикла;
		Возврат ТабЗн
	КонецЕсли;
	
	Стрк=Новый Структура;
	Стрк.Вставить("Приложение", Неопределено);	
	Стрк.Вставить("ИД", Неопределено);
	Стрк.Вставить("РодительскийИД", Неопределено);
	
	ТЗ1=ПодключитьКомпоненту(ИмяКомпоненты, ИмяПроцесса, Истина);
	Попытка
		COM=Новый COMОбъект(ИмяКомпоненты);
	Исключение
		Сообщить("Не удалось загрузить компоненту: "+ИмяКомпоненты);
		Сообщить(ОписаниеОшибки());
		Возврат Стрк
	КонецПопытки;
	
	Стрк.Приложение=COM;
	
	ТЗ2=ПодключитьКомпоненту(ИмяКомпоненты, ИмяПроцесса, Истина);
	
	//=Получить отличающиеся строки
	СистемнаяКолонка="_ГруппаКолонка";
	мКолонки=ТЗ1.Колонки; //Получить массив имён колонок
	СтрКолонки="";
	Для Каждого ИмяК Из мКолонки Цикл
		СтрКолонки=СтрКолонки+ИмяК.Имя+",";
	КонецЦикла;
	СтрКолонки=Лев(СтрКолонки, СтрДлина(СтрКолонки)-1);
	
	//=Объединить таблицы
	Таблица3=ТЗ1.Скопировать();
	Для Каждого СтрТаб Из ТЗ2 Цикл
		ЗаполнитьЗначенияСвойств(Таблица3.Добавить(), СтрТаб);
	КонецЦикла;
	Таблица3.Колонки.Добавить(СистемнаяКолонка);
	Таблица3.ЗаполнитьЗначения(1,СистемнаяКолонка);
	Таблица3.Свернуть(СтрКолонки,СистемнаяКолонка);
	мСтр=Таблица3.НайтиСтроки(Новый Структура(СистемнаяКолонка, 1));
	
	Если мСтр.Количество()=1 Тогда
		Стрк.ИД=мСтр[0].ИД;
		Стрк.РодительскийИД=мСтр[0].РодительскийИД;
	КонецЕсли;	
	
	Возврат Стрк	
КонецФункции

Вопрос для всех.
Интересно узнать как всё это провернуть более простыми решениями для определения ИД запущенного процесса?

PID ИД Процесс Идентификатор Эксель Excel Убить Зависает Отслеживание Выгрузить GUID

См. также

HighLoad оптимизация Администрирование СУБД Программист Платформа 1С v8.3 Бесплатно (free)

В рамках мастер-класса мы запустим нагрузочный тест на 3К пользователей и посмотрим, как будет вести себя PostgreSQL при такой нагрузке.

11.12.2024    762    Tantor    1    

5

Администрирование СУБД Системный администратор Программист

В крупных компаниях, где много типовых и сильно доработанных баз с режимом работы 24/7, переход с MS SQL на PostgreSQL затягивается. Получается гетерогенная структура – когда прод уже на PostgreSQL, а разработка и тестирование – пока на MS SQL. О том, какие варианты помогут постепенно перевести прод с несколькими базами MS SQL на PostgreSQL, не сломав среду тестирования и разработки, пойдет речь в статье.

21.11.2024    3289    a.doroshkevich    7    

15

HighLoad оптимизация Администрирование СУБД Системный администратор Программист Платформа 1С v8.3 Россия Бесплатно (free)

Мы исследуем проблему долгого выполнения запросов PostgreSQL при использовании конструкции VALUES: когда она возникает, как на нее можно повлиять, а главное, почему ее продуманная отработка важна для более быстрого функционирования решений на базе 1С

12.11.2024    1171    Tantor    20    

16

HighLoad оптимизация Администрирование СУБД Механизмы платформы 1С Программист Платформа 1С v8.3 ИТ-компания Россия Бесплатно (free)

В данной статье мы рассмотрим, как работает механизм временных таблиц на postgres на платформе 8.3.23 и что изменилось в нем при добавлении новых возможностей в платформе 8.3.25. А также на примере покажу, как понимание работы платформы позволяет оптимизировать СУБД для работы с 1С.

29.10.2024    3926    Tantor    38    

36

Администрирование СУБД Системный администратор Программист Бесплатно (free)

CDC - очень мощный механизм, который можно использовать во многих сценариях, возможность развернуть его в Docker показывает простоту и лёгкость данной технологии.

08.10.2024    1018    AlexSvoykin    1    

7

Администрирование СУБД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ и решение ошибок СУБД. Во время реиндексации базы Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Не удалось найти объект "ИмяБазы.dbo._RefSInf21806", так как он не существует, или отсутствуют разрешения. Во время проверки целостности Ошибка СУБД: Microsoft SQL Server Native Client 11.0: Недопустимое имя объекта "dbo._RefSInf21806".

19.09.2024    5007    Xershi    10    

18

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    3204    1CUnlimited    9    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 823 09.12.24 08:29 Сейчас в теме
Операционная система
Не имеет значения

Это неправда
4. artly2000 2 09.12.24 13:22 Сейчас в теме
2. ixijixi 1935 09.12.24 08:51 Сейчас в теме
Что такое в коде
ПоТаблицамЗначений.СкопироватьТаблицу(Таблица1);
SemandCheb; +1 Ответить
3. SemandCheb 09.12.24 10:57 Сейчас в теме
(2) На сервере можно было так сделать:
Таблица = Таблица1.Скопировать();

Наверное на клиенте выполняет код,

Хотя добавляет таблицу значений, тогда код должен выполняться на сервере
6. artly2000 2 09.12.24 13:24 Сейчас в теме
(3) Это уже частности. По умолчанию: Толстый клиент
5. artly2000 2 09.12.24 13:23 Сейчас в теме
(2) Дополнено комментарием
Оставьте свое сообщение