IE2017

Убить процесс конкретного окна 1С

Администрирование - Сервисные утилиты

Иногда невозможно закрыть окно 1С программно из самой 1С (например, имеются модальные окна типа вопрос и предупреждение). В таких случаях применяется внешняя программа, убивающая процесс по имени создавшего его файла. Но в таком случае будут завершены все процессы (закрыты окна), созданные этим файлом (например, все запущенные базы и конфигураторы). Настоящая программа "убивает" процесс избирательно, по заголовку окна принадлежащего этому процессу

Принцип работы:
- ищутся все процессы, созданные приложением, содержащим в имени 1CV (т.е. любые версии 1С)
- ищутся все окна найденных процессов и считываются их заголовки
- если заголовок окна совпадает с единственной строчкой ini-файла (Kill1CProcWnd.ini), то убивается этот конкретный процесс
- сама программа закрывается в любом случае (после "убиения", или если условия не совпали)

Скачать файлы

Наименование Файл Версия Размер
-
.1225601054 196,60Kb
25.09.09
637
.1225601054 196,60Kb 637 Скачать бесплатно
-
.1234526068 196,63Kb
25.09.09
162
.1234526068 196,63Kb 162 Скачать бесплатно

См. также

Комментарии
0. Аркадий Кучер (Abadonna) 3683 01.01.70 03:00 Сейчас в теме
Иногда невозможно закрыть окно 1С программно из самой 1С (например, имеются модальные окна типа вопрос и предупреждение). В таких случаях применяется внешняя программа, убивающая процесс по имени создавшего его файла. Но в таком случае будут завершены все процессы (закрыты окна), созданные этим файлом (например, все запущенные базы и конфигураторы). Настоящая программа "убивает" процесс избирательно, по заголовку окна принадлежащего этому процессу

Перейти к публикации

1. Оракул Айметдинов (jhfrek) 164 02.11.08 22:07 Сейчас в теме
2. Аркадий Кучер (Abadonna) 3683 03.11.08 04:50 Сейчас в теме
Пример применения для 7.7 с использованием Formex.dll:
Прелесть метода ОбработкаОжидания объекта "Сервис" этой библиотеки заключается в том, что он отрабатывает всегда, независимо от наличия в системе модальных окон.
В ГМ или ДопГМ добавляем строчку:
Код
Сервис.ОбработкаОжидания("глУбить1С",60000);// например, 1 минута
Показать полностью

Прописываем процедуру:
Код
Процедура глПроверитьУбить1С() 
   Если ФС.СуществуетФайл(КаталогИБ()+"kill.out") =1 Тогда // например, просто проверим наличие такого файла  
      //так не сработает при наличии модального окна
      //ЗавершитьРаботуСистемы(0);       
      ЗапуститьПриложение(КаталогИБ()+"Kill1CProcWnd.exe");  // так сработает ;)         
   КонецЕсли;
КонецПроцедуры
Показать полностью

3. Аркадий Кучер (Abadonna) 3683 03.11.08 07:17 Сейчас в теме
+(2) Сорри, опечатка после копирования... ;)
[code]Процедура глУбить1С()[/b] должно быть
4. Аркадий Кучер (Abadonna) 3683 05.11.08 09:49 Сейчас в теме
Проверил под 8-кой. В отличие от 77 там ПодключитьОбработчикОжидания отрабатывает при наличии окон типа Вопрос и Предупреждение. Не отрабатывает только, если открыт диалог выбора файла.
Примерный код для "изнутри" в 8-ке
Код
Процедура глУбить1С() Экспорт
   Каталог="c:\V8_Бухгалтерия1_6_8_3"; // для файловой системы можно получить тек. каталог базы через   СтрокаСоединенияИнформационнойБазы();
   Файл = Новый Файл(Каталог+"\kill.out");
   Если Файл.Существует()=Истина Тогда
      ЗапуститьПриложение("Kill1CProcWnd.exe",Каталог,Истина);
   КонецЕсли;   
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
        //...........................................
        ПодключитьОбработчикОжидания("глУбить1С",60,Ложь);
КонецПроцедуры
Показать полностью

5. BabySG (BabySG) 05.11.08 17:59 Сейчас в теме
Эээээ.... Такие зависшие окна, типа предупреждения, появляются от неграмотной разработки. Там даже есть параметр специальный для автозакрытия.
Действительно для 8.х, но, полагаю, и в 77 тоже самое.
6. - - (Rebelx) 937 05.11.08 18:01 Сейчас в теме
а это не спортивно использовать?

TASKKILL [/S <система> [/U <пользователь> [/P [<пароль>]]]]
{ [/FI <фильтр>] [/PID <процесс> | /IM <образ>] } [/F] [/T]

Описание:
Эта команда позволяет завершить один или несколько процессов.
Процесс может быть завершен по имени образа или по идентификатору процесса.

Список параметров:
/S <система> Подключаемый удаленный компьютер.

/U [<домен>\]<пользователь> Пользовательский контекст, в котором
должна выполняться эта команда.

/P <пароль> Пароль для этого пользовательского контекста.
Запрашивает пароль, если он не задан.

/F Принудительное завершение процесса


/FI <фильтр> Отображение задач, отвечающих
указанному в фильтре критерию.

/PID <процесс> Идентификатор процесса, который требуется
завершить.

/IM <образ> Имя образа процесса, который требуется
завершить. Для указания всех процессов
можно использовать символ шаблона '*'.

/T Завершение указанного процесса
и всех его дочерних процессов.

/? Вывод справки по использованию.

Фильтры:
Имя фильтра Допустимые операторы Допустимые значения
----------- -------------------- -------------------
STATUS eq, ne RUNNING | NOT RESPONDING
IMAGENAME eq, ne Имя образа
PID eq, ne, gt, lt, ge, le Значение PID
SESSION eq, ne, gt, lt, ge, le Номер сессии
CPUTIME eq, ne, gt, lt, ge, le Время CPU в формате
hh:mm:ss.
hh - часы,
mm - минуты, ss - секунды
MEMUSAGE eq, ne, gt, lt, ge, le Использование памяти в КБ
USERNAME eq, ne Имя пользователя в формате
[<домен>\]<пользователь>
MODULES eq, ne Имя DLL
SERVICES eq, ne Имя службы
[b] WINDOWTITLE eq, ne Заголовок окна[b]

Примечание: Символ '*' для параметра /IM применим только совместно с фильтрами.

Примечание: Завершение удаленных процессов всегда будет принудительным,
независимо от того, был ли использован параметр /F или нет.

Примеры:
TASKKILL /S <система> /F /IM notepad.exe /T
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM notepad.exe /IM mspaint.exe
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
TASKKILL /S <система> /U <домен>\<пользователь> /FI "USERNAME ne NT*" /IM *
TASKKILL /S <система> /U <пользователь> /P <пароль> /FI "IMAGENAME eq note*"
7. Аркадий Кучер (Abadonna) 3683 05.11.08 18:02 Сейчас в теме
()>типа предупреждения, появляются от неграмотной разработки.
Немного неправильно полагаешь ;) Любой док в 77 просто обязан спросить Сохранить?Закрыть?
Плюс, например, брошенное "на произвол судьбы" окно авторизации доступа. Плюс всякие предупреждения от разработчиков (самой 1С), не перелопачивать же весь код за ними.
8. Аркадий Кучер (Abadonna) 3683 05.11.08 18:10 Сейчас в теме
(6)>Процесс может быть завершен по имени образа или по идентификатору процесса.
Позволь узнать а откуда ты PID возмешь? И вас ис дас Имя образа процесса?
Если ты внимательно читал, то "notepad.exe " не катит, если я хочу закрыть именно этот блокнот, а не ваще все блокноты. И чем спортивно писать корявые скрипты, когда эта прога все спокйно делает сама: ищет и PIDы, и хэндлы завершения процесса, и все окна данного процесса.
9. - - (Rebelx) 937 05.11.08 18:15 Сейчас в теме
(8) это все не обязательно, если ты внимательно читал :)
попробуй закрыть блокнот например так:
taskkill /fi "windowtitle eq 1.txt - Блокнот"
10. Аркадий Кучер (Abadonna) 3683 05.11.08 18:17 Сейчас в теме
(9) Тогда скажи в чем разница написать строчку в ini-файл с заголовком окна, или написать строчку такого скрипта?
11. Аркадий Кучер (Abadonna) 3683 05.11.08 18:24 Сейчас в теме
(9) Ну вот, проверил. "Спокойный" блокнот мочит, а вот блокнос с вопросом "Текст...измененен.. сохранить?" при отработке твоего скрипта вызывает еще одно такое же окно c тем же вопросом. Если бы стояла задача просто замочить окно, то фигли париться? Послал SendMessage(hwnd, WM_CLOSE,0,0) - и всех дел
12. - - (Rebelx) 937 05.11.08 18:27 Сейчас в теме
(10) разница в необходимости дополнительных компонентов для работы системы
(11) тогда попробуй закрыть блокнот так:
[b]taskkill /f /fi "windowtitle eq 1.txt - Блокнот"
13. Аркадий Кучер (Abadonna) 3683 05.11.08 18:38 Сейчас в теме
(12) По последнему варианту - согласен, мочит.
Ну а насчет "дополнительных компоненов" - несогласен. Мало ли каких прог в Винде работает?
Эта пить-есть не просит, и в памяти какие-то миллисекунды торчит
14. Аркадий Кучер (Abadonna) 3683 05.11.08 18:43 Сейчас в теме
+(13) Кстати, 7.7 с торчащим предупреждение не мочит.
Заголовок окна - 1С:Предприятие - БД: C:\УпрОтладка\ , торчит Предупреждение
taskkill /f /fi "windowtitle eq 1С:Предприятие - БД: C:\УпрОтладка\" - правильно написал?
не мочит
15. - - (Rebelx) 937 05.11.08 18:44 Сейчас в теме
(13) дополнительные компоненты - зло, когда можно без них обойтись.
их использование показывает, что разработчик такого ПО не умеет читать инструкции, и считает себя самым умным.
а один самый умный тут уже есть, зачем нам два?
16. Аркадий Кучер (Abadonna) 3683 05.11.08 18:45 Сейчас в теме
17. Аркадий Кучер (Abadonna) 3683 05.11.08 18:47 Сейчас в теме
(15)>а один самый умный тут уже есть, зачем нам два?
Кстати, любителей "простых решений" ту еще больше :)))
18. - - (Rebelx) 937 05.11.08 18:54 Сейчас в теме
так попробуй
taskkill /f /fi "windowtitle eq 1С:Предприятие - БД: C:\УпрОтладка\ "
19. Аркадий Кучер (Abadonna) 3683 05.11.08 18:54 Сейчас в теме
+(14) Оно вообще не убивает окно с таким титлом. Либо я неправильно написал скрипт, хотя точно по аналогии, либо....
20. Аркадий Кучер (Abadonna) 3683 05.11.08 18:59 Сейчас в теме
(18)Угум, и тут согласен. Только одно непонятно: я заголовок брал со spyxx мелксофтовского, а он возвращает титлы с пробелами (там пробела в конце не было). При этом моя с ini-строчкой без пробела на конце (trim) убивает, у тут как угадать сколько пробелов в конце добавить?
21. - - (Rebelx) 937 05.11.08 19:03 Сейчас в теме
(20) не нравится ему последний символ "\". если в командной строке после него ставить пробел или второй такой-же - нормально работает. наверно он рассматривает этот символ как подстановочный. вот только доки найти не могу
22. Аркадий Кучер (Abadonna) 3683 05.11.08 19:06 Сейчас в теме
(21)>не нравится ему последний символ "\"
Ну вот ;) Бум считать, что моя для не особо продвинутых, которым не надо заморачиваться какие символы не нравятся команде taskkill ;)
23. Аркадий Кучер (Abadonna) 3683 05.11.08 19:10 Сейчас в теме
+(22) Кстати, когда писал гарббер статус-строки для конфигуратора и 1С, товарисч Чебурашка мне ТАКИЕ титлы подкитывал, с ТАКОЙ тучей знаков препинания и черт еще чем, что, думаю,
у taskkill точно бы крышак съехал :))))
24. Аркадий Кучер (Abadonna) 3683 05.11.08 19:23 Сейчас в теме
+(23) Я ж любопытный! ;)
Попробовал такой титл 1С:Предприятие - БД: C:\УпрОтладка\*-
Ни с пробелом на конце, ни с пробелом после обратного флеша не отрабатывает taskkill
А уж чаво могут люди в ЗаголовоСистемы навтыкать - я себе очень хорошо представляю.
25. - - (Rebelx) 937 05.11.08 19:26 Сейчас в теме
(22) ну вот, после серии опытов было выяснено - можно taskill ставить просто дополнительный пробел (или несколько) в фильтре (в конце), и все работает.
26. Аркадий Кучер (Abadonna) 3683 05.11.08 19:27 Сейчас в теме
(24) ты, видать, не успел прочесть ;)
27. - - (Rebelx) 937 05.11.08 19:29 Сейчас в теме
28. Сhe Burashka (CheBurator) 05.11.08 19:31 Сейчас в теме
а убивается по точному заголовку или по вхождению сигнальной строки в заголовок?
29. Аркадий Кучер (Abadonna) 3683 05.11.08 19:32 Сейчас в теме
Моя убивает по точному, но можно приделать и по вхождению (целую строчку в код дописать:))
А вот как taskkill - не знаю... Видишь, какие-то нюансы там получаются... То ему то не нравится, то это...
30. Аркадий Кучер (Abadonna) 3683 05.11.08 19:42 Сейчас в теме
+(29) По вхождению - все-таки плохо.
Например, у меня открыты базы с заголовоками: Моя база и Моя База *
Предположим, я эту зведочку использую, чтобы отличить рабочую от отладочной.
По вхождению - замочатся обе, а мне этого как раз не надо в данный момент
31. pov-ilja (WolfhounD) 27.12.08 12:17 Сейчас в теме
Извини, а исходники exe не мог бы выложить?
32. Константин (Fisherru) 78 10.02.09 16:07 Сейчас в теме
(29) Не очень хорошо по точному.
Не то чтобы плохо, но у меня не катит :-(
Я в заголовок системы ещё год базы запихиваю и путь

СтарыйЗаголовок = ЗаголовокСистемы();
ЗаголовокСистемы(СтарыйЗаголовок+Строка(Константа.ГодБазы)+" < "+СокрЛП(КаталогИБ())+" > ");

так как базы время от времени обрезаются, а рабочая конфа всегда одна,
(30) а по расположению базы отличаю : рабочая - живая.
Так и не сумел поймать комбинацию, чтоб такой наворот эта программа кончала.
(30) Кстати, группе админов я такое ожидание просто не включаю ;-)
В общем бился я бился, так и не сумел точно изобразить заголовок окна,
после 5-го эксперимента... :-(
Можно мне вариант по вхождению?
Очень надо...
И, ещё, когда мы использовали команду
ЗавершитьРаботуСистемы() на SQL-ной базе, как-то раз случилось, что какой-то процесс подвис на серваке и никто не мог войти в базу. Наши админы намаялись исправляя ситуацию. С тех пор боимся пользовать подобное выгоняние.
А вот Kill1CProcWnd.exe корректно отработает? не будет проблем с SQL-лем?
33. Аркадий Кучер (Abadonna) 3683 13.02.09 14:56 Сейчас в теме
По просьбе добавил версию 1.2 - "убиение" по вхождению строки из ini-файла в заголовок окна. Для запуска по вхождению запускать программу с ключом
/in. При запуске без ключа - будет работать только по полному совпадению
34. Константин (Fisherru) 78 13.02.09 15:07 Сейчас в теме
35. Сергей Мурзинов (Sergey_Murzinov) 30.09.11 03:04 Сейчас в теме
Помогает спасать некоторых бухгалтеров (перед окончанием дня ставят отчеты)
Оставьте свое сообщение