Работаю с Универсальными Инструментами v24.1.4, вариант расширение, обработка "Групповая обработка справочников и документов".
Там вывод прогресса обработки сделан через функцию глобального контекста "Состояние()" (да, для каждого объекта свой серверный вызов; предполагаю, потому, что либо подсистема БСП "длительные операции" еще не полностью перетащена в расширение, либо у разработчика еще не дошли руки переделать через нее).
Эта функция выводит информацию во всплывающее окно с прогресс-баром (см. вл.). У этого окна в правом верхнем углу есть крестик, при нажатии на который ничего не происходит.
Судя по коду обработки ("Обработка.УИ_ГрупповаяОбработкаСправочниковИДокументов.Форма.ПроизвольныйАлгоритм.ОбработатьИндикатор()"), предполагается вместо этого нажимать Ctrl-Break (перед началом каждой итерации вызывается "ОбработатьПрерываниеПользователя()"). Но у меня при этом ничего не происходит, даже если я нажму на окно прогресса или основное окно приложения (которое на время обработки блокируется), чтобы убедиться, что у них есть фокус.
(Update: выяснил, почему: из-за того, что основное окно клиента заблокировано, по щелчке мышью на него оно не получает фокус; окно прогресса не заблокировано, но оно Ctrl-Break, видимо, не обрабатывает. Окно клиента получит фокус, и Ctrl-Break сработает, если переключиться на него через переключение задач (Alt-Tab или щелкнуть на нужный пункт в панели задач). Но ответ на вопрос темы по-прежнему интересен.)
Можно ли как-то задать обработчик нажатия на крестик в окне прогресса, выводимом функцией "Состояние()", либо определить постфактум, что он был нажат?
Да, предпочтительно переделать обработку через "длительные операции"; но пока что интересует, предоставляет ли платформа возможность реализовать это текущими средствами. Предполагаю, что если бы это было невозможно, разработчики платформы не стали бы у окна прогресса добавлять кликабельный крестик.
В СП, раздел "Процедуры и функции интерактивной работы" (где находятся "Состояние" и "ОбработкаПрерыванияПользователя") не увидел ничего релевантного; гугление по ключевым словам в заголовке тоже ничего не нашло.
На сколько я знаю, нельзя. Это системное окошко. Ну если я правильно понял, о чем речь. Крестик там чтобы закрыть это окно быстрее, чем оно закроется само.
Ctrl+Break работает только когда ты вываливаешься в клиентский контекст и не кешируется в буфере клавиатуры. Поэтому единственная возможность прервать что-то этими - нажать их много-много раз, чтобы один раз попал на момент вызова функции прерывания.
На сколько я знаю, нельзя. Это системное окошко. Ну если я правильно понял, о чем речь. Крестик там чтобы закрыть это окно быстрее, чем оно закроется само.
Ctrl+Break работает только когда ты вываливаешься в клиентский контекст и не кешируется в буфере клавиатуры. Поэтому единственная возможность прервать что-то этими - нажать их много-много раз, чтобы один раз попал на момент вызова функции прерывания.
Ctrl+Break работает только когда ты вываливаешься в клиентский контекст и не кешируется в буфере клавиатуры.
Я уже выяснил, почему у меня не работало Ctrl-Break (см. "Update:" выше, заблокированное окно клиента не получало фокуса обычным способом). После этого даже однократное нажатие работает.
Крестик там чтобы закрыть это окно быстрее, чем оно закроется само.
Вот мне и показалось странным, что при нажатии ничего не происходит! Я бы понял, если бы оно закрылось, а при следующем вызове "Состояние()" вывелось снова!
Сейчас проверил, не выводится ли оно снова слишком быстро и я просто не успеваю этого заметить. Нет, не выводится. Поменял код, чтобы "Состояние()" вызывалось только при нескольких первых итерациях. Нажал на крестик, хоть раз, хоть много раз быстро-быстро -- не пропадает.