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

29.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)

Сегодня мы проведем обзор изменений, касающихся работы с высоконагруженными системами 1С. Новый релиз предлагает не просто несколько точечных исправлений, а целый арсенал специализированных функций, призванных существенно ускорить выполнение типичных для 1С операций, снизить нагрузку на инфраструктуру и упростить администрирование. Спектр улучшений распространился на многие ключевые узлы производительности от оптимизации работы с временными таблицами и сложными запросами RLS (row-level security) до ускорения критически важных процессов наподобие «Закрытия месяца». Обо всем этом и пойдет речь в статье.

вчера в 13:30    776    Tantor    2    

6

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

Расскажем об опыте внедрения технологии CoW (Copy-On-Write). Вы узнаете, как CoW помогает экономить терабайты дискового пространства с минимальными накладными расходами, а также как интегрировать ее в рабочие процессы разработки и тестирования. Автор кратко объяснит суть CoW, поделится выбором файловой системы (xfs или btrfs?), расскажет, как его команда управляет подтомами прямо из 1С и почему они выбрали MS SQL для Linux. Отдельно он разберет влияние CoW на CI-процессы: как это помогает анализировать длительные регрессы и ускоряет развертывание баз.

вчера в 12:10    315    Golovanoff    3    

5

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

В современных Windows 10 и 11 можно использовать WSL (Windows Subsystem for Linux) для запуска Linux окружения. Возникает соблазнительная мысль: может, PostgreSQL и сервер 1С запустить в WSL. Или даже хуже: в Docker на WSL. Знал бы, что будет сложно - даже не начинал :) Сложность кроется в том, что WSL это не полноценные виртуалки, а легковестные контейнеры Hyper-V с особенностями сети и GUI. Из плюсов, наверно, только размер и скорость запуска.

21.07.2025    657    FSerg    2    

4

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

В статье подробно разберем, как в компании организован процесс миграции на PostgreSQL, начиная с подготовки команды, предварительного анализа 1С-систем (с использованием специальных чек-листов и инструментов для аудита) и заканчивая тонкой настройкой PostgreSQL. Расскажем о системе автоматизированного тестирования, которая позволяет сравнивать производительность на MS SQL и PostgreSQL без трудоемких ручных проверок. Особое внимание уделим проблемам, которые возникли при миграции систем объемом 20+ ТБ, и способам их решения. А также поразмышляем о том, что нужно было бы сделать по-другому, если бы этот проект пришлось начинать заново.

10.07.2025    917    leongl    0    

8

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

В финальной статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на осенней конференции INFOSTART TECH EVENT 2024, рассказываем, чем может быть полезна информация, полученная из дампа.

27.05.2025    1812    it-expertise    0    

12

Администрирование СУБД Системный администратор 1С v8.3 Бесплатно (free)

Клиент-серверная архитектура 1С Предприятия 8.3 подразумевает работу в связке с так называемой системой управления базами данных (СУБД). Одной из самых распространённых и популярных до сих пор остается MS SQL Server.

19.05.2025    3564    Kostin1978    6    

4

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

Рассмотрим, почему при обновлении итогов регистров накопления СУБД может выбирать неоптимальный план запроса, и как это исправить.

28.04.2025    2880    Tantor    7    

26

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

Во второй статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на конференции INFOSTART TECH EVENT 2024, рассмотрим, какую информацию содержат файлы дампа, чем она полезна и как ее анализировать.

14.04.2025    1707    it-expertise    7    

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

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

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

Хотя добавляет таблицу значений, тогда код должен выполняться на сервере
6. artly2000 4 09.12.24 13:24 Сейчас в теме
(3) Это уже частности. По умолчанию: Толстый клиент
5. artly2000 4 09.12.24 13:23 Сейчас в теме
(2) Дополнено комментарием
7. user1857699 22.05.25 01:21 Сейчас в теме
// Объявление внешней функции в глобальном модуле
ВнешняяФункция("GetCurrentProcessId", "kernel32.dll", "GetCurrentProcessId")
Функция ПолучитьТекущийPID() Экспорт
Возврат GetCurrentProcessId();
КонецФункции

// Пример использования
Сообщить("PID текущего процесса: " + ПолучитьТекущийPID());
Оставьте свое сообщение