Непонятная блокировка ввода после выполнения команды ЗапомнитьДляСравнения ИР адаптера

tormozit Открыто

Выделил в модуле маленький фрагмент. Вызывал команду ЗапомнитьДляСравнения .
Выделил второй фрагмент. Вызывал команду ЗапомнитьДляСравнения.
Открылось окно приложения ИР и в нем сравнение фрагментов. Первые 2 секунды клики не доходят в это окно и появляется уведомление Турбконфа о блокировке ввода.
Насколько я понял из лога, ожидание возникает в Турбоконф.ЖдатьСменуАктивногоОкна().
[13.11.25 18:30:21:899] --Время ожидания смены активного окна = 2007ms. Result: False
Ссылка скрыта

//&ЗапроситьИнформациюОДокументе
Процедура ЗапомнитьДляСравнения()
	ПодключениеИР = ПодключениеИР(,, Ложь);
	Если ПодключениеИР = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Текст = ВыделенныйТекст;
	Если Не ЗначениеЗаполнено(Текст) Тогда
		Текст = ТекстМодуля;
	КонецЕсли;
	ПолеТекстаПрограммы = ПолеТекстаПрограммыИР(ПодключениеИР, ТекстМодуля, ПозицияВТексте, ВыделенныйТекст,,,,,,,,,,,,, Истина);
	Если ПолеТекстаПрограммы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ЗапомнитьТекстДляСравнения(ПодключениеИР, ПолеТекстаПрограммы, Текст);
КонецПроцедуры

Процедура ЗапомнитьТекстДляСравнения(Знач ПодключениеИР, Знач ПолеТекстаПрограммы, Знач Текст) Экспорт
	МассивСравнения = ТурбоКонф.ВосстановитьЗначениеСеанса("МассивСравнения"); //Массив
	Попытка 
		МассивСравнения.Количество();
	Исключение
		МассивСравнения = Неопределено;
	КонецПопытки;
	Сообщение = "";
	МассивСравнения = ПолеТекстаПрограммы.ЗапомнитьДляСравнения(Ложь, Текст, МассивСравнения, Сообщение);
	ТурбоКонф.СохранитьЗначениеСеанса("МассивСравнения", МассивСравнения);
	Если ЗначениеЗаполнено(Сообщение) Тогда
		ПоказатьВсплывающееУведомление(Сообщение);
	Иначе
		ВосстановитьОкноПриложения(ПодключениеИР);
	КонецЕсли;
КонецПроцедуры

Процедура ВосстановитьОкноПриложения(ПодключениеИР)
	// ПодключениеИР нельзя из кэша брать, т.к. там активное окно конфигуратора заново получается
	СтароеАктивноеОкно = ТурбоКонф.ПолучитьАктивноеОкно();
	ПодключениеИР.Visible = Истина; 
	МодулиИР = МодулиИР(ПодключениеИР);
	ИдентификаторПроцессаИР = МодулиИР.ирКэш.ИдентификаторПроцессаОСЛкс();
	// В 8.3.9- заголовок окна будет с добавкой слева
	ФиктивноеОкно = 1;
	Если Не ЗначениеЗаполнено(Конфигуратор) Тогда
		ОкноКонфигуратора = ФиктивноеОкно;
	Иначе
		ОкноКонфигуратора = Конфигуратор.ГлавноеОкно;
	КонецЕсли;
	//Если ЗначениеЗаполнено(ЗаголовокПриложенияИР) Тогда
	//	ШаблонЗаголовка = МодулиИР.ирОбщий.ТекстДляРегВыраженияЛкс(ЗаголовокПриложенияИР);
	//КонецЕсли;
	ШаблонЗаголовка = "";
	ТурбоКонф.НачатьВызовВнешнегоОкнаАсинх(ШаблонЗаголовка, 2000, ОкноКонфигуратора, РежимОткрытияВнешнегоОкна.ГлавноеОкно, Истина, ИдентификаторПроцессаИР);
	ЗавершитьВызовВнешнегоОкнаАсинх(ФиктивноеОкно, ИдентификаторПроцессаИР);
	
	// Подождем получения фокуса окном приложения ИР, что иногда не сразу происходит https://turboconf.ru/Tasks/8912
	ЖдатьПотерюАктивностиОкна(СтароеАктивноеОкно);
КонецПроцедуры

// Ненадежно. Вместо этого метода лучше вызывать ТипТекущегоЭлементаИнтерфейса(),
//
// Параметры:
//  СтароеАктивноеОкно	 - Число - 
//  ЧислоСекунд			 - Число - 
// 
// Возвращаемое значение:
//  Булево - Истина если окно потеряло фокус
//
Функция ЖдатьПотерюАктивностиОкна(Знач СтароеАктивноеОкно = Неопределено, Знач ЧислоСекунд = 2, Знач НадежныйРежим = Ложь) Экспорт
	Если СтароеАктивноеОкно = Неопределено Тогда
		СтароеАктивноеОкно = ТурбоКонф.ПолучитьАктивноеОкно();
	КонецЕсли;
	Если ТурбоКонф.ПолучитьВерсиюAPI() < 6 Или НадежныйРежим Тогда
		МоментНачала = ТекущаяДата();
		Пока Истина
			И ТурбоКонф.ПолучитьАктивноеОкно() = СтароеАктивноеОкно 
			И ТекущаяДата() <= МоментНачала + ЧислоСекунд - 1 // Не больше ЧислоСекунд секунд ждем
		Цикл
			ТурбоКонф.Ждать(100);
		КонецЦикла;
		Результат = ТурбоКонф.ПолучитьАктивноеОкно() <> СтароеАктивноеОкно;
	Иначе 
		Результат = ТурбоКонф.ЖдатьСменуАктивногоОкна(СтароеАктивноеОкно, ЧислоСекунд * 1000, Ложь); // Не надеждно https://turboconf.ru/Tasks/9997
		//Сообщить("Резу="+ Результат);
		//Сообщить("СтароеАктивноеОкно="+ СтароеАктивноеОкно);
	КонецЕсли;
	Возврат Результат;
КонецФункции

Комментарии

tormozit
#1, 13 ноября 2025 19:33

Сначала показалось что в версии 6.5.9420.31777 проблема не воспроизводится. Но после тщательной проверки и там воспроизвелось. Тогда возможно проблема в скрипте.


tormozit
#2, 13 ноября 2025 19:38

Проблема возникает только если окно ИР было скрыто до вызова команды.


tormozit
#3, ред. 13 ноября 2025 19:46

Обошел проблему отказом от ожидания активации окна (ЖдатьПотерюАктивностиОкна) там, где это допустимо. Но в скрипте не удалось найти причину проблемы.


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера