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

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

См. также

Информационная безопасность Администрирование СУБД Системный администратор Бесплатно (free)

Рассказываем о безопасной и удобной организации доступа к кластеру 1С для всей ИТ-команды с помощью централизованного приложения управления. Автор показывает, как настроить разграничение прав, избежать типичных уязвимостей и эффективно управлять сеансами, не рискуя целостностью системы. Особое внимание уделено работе с объектной моделью 1С, прерыванию тяжелых запросов и диагностике проблем через технологический журнал.

вчера в 13:35    348    evvakra    1    

4

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

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

22.07.2025    2909    Tantor    9    

10

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

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

22.07.2025    1221    Golovanoff    7    

15

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

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

21.07.2025    1175    FSerg    2    

7

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

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

10.07.2025    1239    leongl    0    

10

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

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

27.05.2025    1989    it-expertise    0    

12

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

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

19.05.2025    4835    Kostin1978    6    

4

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

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

28.04.2025    3043    Tantor    8    

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

Это неправда
4. artly2000 4 09.12.24 13:22 Сейчас в теме
2. ixijixi 2037 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());
Оставьте свое сообщение