Выполняю ЗапуститьПриложение() с параметром ожидания завершение приложения, ну фокус улетает конечно.. :(
Можно как то избежать потери фокуса без использования скриптов?
без скриптов не знаю, со скриптами можно ЗапуститьПриложение() дождаться закрытия писать срипт по поиску открытого окна 1С например по заголовку и активизировать его. Делал такое ещё на 7.7.
А если воспользоваться
КомандаСистемы (System)
Синтаксис:
КомандаСистемы(<СтрокаКоманды>, <ТекущийКаталог>)
Параметры:
<СтрокаКоманды> (обязательный)
Тип: Строка. Команда системы.
<ТекущийКаталог> (необязательный)
Тип: Строка. Устанавливает текущий каталог на время выполнения команды.
Описание:
Вызывает на исполнение команду операционной системы, как если бы она была введена в командной строке.
Доступность:
Тонкий клиент, толстый клиент.
Примечание:
После загрузки Windows-приложения управление возвращается в 1С:Предприятие и исполнение модуля продолжается.
Попробуйте метод Exec, пример:
мShell=Новый COMОбъект("WScript.Shell");
Процесс=мShell.Exec(ИмяИПутьКИсполняемуФайлу);
OutStream=Процесс.StdOut;
Пока НЕ OutStream.AtEndOfStream Цикл
Ответ=ОКР(Число(OutStream.ReadLine())/1000);
КонецЦикла;
(12) Всё это у меня работало, как однажды стало запускаться не из под меня, а из-под USR1CV8. Тема старая, но сломал башку, пока это обнаружил.
Решилось функцией "ЗапуститьПриложение()". Единственно что плохо - это не возвращает параметры процесса.
Приложил картинку с настройкой(см ниже)
Вот если там стоит рекомендованный USR1CV8, тогда Shell будет под ним.И доступа к ресурсам может не быть
WshShell = Новый COMОбъект("WScript.Shell");
Процесс = WshShell.Exec(СтрокаКоманды);
Если от текущего, как на картинке, то значит будет от того, кто зашел на сервер. И доступы все реально проверяемые.
Пока что решил проблему через подключение однократное обработчика ожидания из модуля приложения.
А в обработчике шлю клавиши ALT + TAB.
Работает, но как-то с задержкой. Хотя лучше, чем ничего.
WSHShell = СоздатьОбъект("WScript.Shell");
l = СоздатьОбъект("wbemscripting.swbemlocator");
oExec = WshShell.Exec("rundll32 kernel32,SleepEx");
s = l.connectserver();
ProcessID = s.get("win32_process.Handle="+oExec.ProcessID).ParentProcessID;
скопипастил отсюда: http://infostart.ru/public/142715/ Т.е. ID процесса есть, теперь нужно вернуть ему фокус
Синтаксис:
AppActivate(<Title>)
Назначение: активизирует указанное окно какого-либо приложения. Возвращает True в случае успеха и False в случае неудачи.
Параметры:
<Title> - заголовок окна приложения или идентификатор процесса.
(16) там нюанс в том, что пока ты в исполнении кода, фокус может и не вернуться, как-то так.
ведь если я ставлю сендкейс Алт+таб после вызова метода запуститьПриложение, то фокус возвращается в соседнее с 1с окно, т.к. наверное 1с еще в статусе занято, но попробовать можно, по идее.
(17) Для 8.1 идея такая: Из формы открываем маленькое модальное окошечко - "ланчер" при открытии "ланчера" выполняем запуск приложения, потом возвращаем фокус - ЭтаФорма.Активизировать(); далее закрываем "ланчер" и возвращаем из "ланчера" управление в родительскую форму.
Для тех , кто работал с большими локалками и временем, должен меня понять, что я не могу сделать деньги из плохо написанной модной системы , но мне тревожно , что еще скрипты выполняют :)
в свое время я выделяла 1с компьютер и ночью решала все проблемы. Это кризис для денежных вариантов схем бизнеса - нет компьютеров больше на складе. я не работаю в больших сетях. я только учусь учить.
Хреново ты решила. Активизировать форму не обязательно и можно дожидаться завершения приложения. Нужно в bat файле ключ /b ставить, тогда фокус теряться не будет
я фигею с людей, которые пишут в темах двухлетней давности, где эти темы только находят. natarezn так вообще 7 сообщений, явно пытается startmoney накрутить.