gifts2017

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

Опубликовал Аркадий Кучер (Abadonna) в раздел Администрирование - Сервисные утилиты

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

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

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

Наименование Файл Версия Размер
- 632
.1225601054 196,60Kb
25.09.09
632
.1225601054 196,60Kb Бесплатно
- 156
.1234526068 196,63Kb
25.09.09
156
.1234526068 196,63Kb Бесплатно

См. также

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

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

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

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

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

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

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