Прошу добавить событие "Перед монопольным обновлением БД"

tormozit Закрыто Высокий

Такое событие будет полезно в ИР адаптере для отображения уведомления пользователю с подсказкой закрыть COM приложение. А то сейчас в файловой базе ему надо помнить про команду "ИР Закрыть служебное приложение".

Событие должно срабатывать при появлении следующего окна

Проверять наличие окна можно каждые 1000мс. Такой оперативности обнаружения будет достаточно.

Комментарии

bolsun
#1, 28 октября 2023 00:09

Можно навесить триггер на него. Как сделано в Закрывашке.
Сделать скрипт
//@trigger 1
//@filter ^Конфигуратор$
В нем проверить на нужный текст и вызвать событие.


bolsun
#2, 28 октября 2023 00:14

Это не отменяет полезность события, например ПриПоявленииОкна или что-то такое. Но на первое время может хватить.


tormozit
#3, 28 ноября 2023 14:24

Еще для ИР адаптера будет очень полезно сделать автоматическое нажатие кнопки "Обновить динамически". Поэтому событие ПриПоявленииОкна нужно.
tormozit изменил статус на Открыто


tormozit
#4, ред. 30 ноября 2023 18:54

Более внимательно собрал статистику. Эта доработка бы заметно сэкономила число механических операций за мой средний рабочий день, т.к. обновление БД я делаю часто и каждый раз приходится целиться к кнопку "Обновить динамически".


bolsun
#5, 30 ноября 2023 23:21

(4) tormozit, напомни, почему нельзя Закрывашку использовать для этого?


bolsun
#6, 30 ноября 2023 23:25

Если она в этой фигне умеет нажимать ОК, то и там нажмет кнопку.


bolsun
#7, 30 ноября 2023 23:27

И текст окон она понимает и гибко настроить можно, только на нужное окно.


tormozit
#8, ред. 30 ноября 2023 23:30

Мне нужен обработчик внутри скрипта "ИР адаптер", в котором я буду учитывать условия перед отправкой нажатия кнопки в появившемся диалоге.
Закрывашка работает только как отдельный скрипт. Поэтому не могу сделать в своем скрипте то же самое.
Но действительно функционал Закрывашки очень похож на то, что нужно.


bolsun
#9, ред. 30 ноября 2023 23:33

ПриПоявленииОкна = добавлению в скрипт

//@trigger 1
//@filter ^Конфигуратор$

Можно сделать отдельный скрипт, который будет срабатывать при появлении окна "Конфигуратор".


bolsun
#10, 30 ноября 2023 23:35

Можно это попробовать привязать к команде, а не целому модулю через аннотации, но самый простой вариант конечно - @trigger


bolsun
#11, ред. 30 ноября 2023 23:37

		Элементы = ТК.НайтиЭлементыПоТипу("панель");

		Для каждого Элемент Из Элементы Цикл
			
			Если ПустаяСтрока(Элемент) Тогда
				Продолжить;
			КонецЕсли;

			Если СтрНачинаетсяС(Элемент, "Редактируемая конфигурация") Тогда			
				
				ПроверитьПредупреждениеИЗакрыть(ПредупреждениеРедактируемаяКонфигурацияОтличается);

				Возврат;
				
							
			КонецЕсли;

		КонецЦикла;

так можно текст найти нужный


bolsun
#12, 30 ноября 2023 23:37

Из отдельного скрипта можно загрузить основной скрипт и вызывать его методы если нужно


bolsun
#13, ред. 30 ноября 2023 23:40

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


bolsun
#14, 30 ноября 2023 23:52

Но в целом, если мы дергаем скрипты даже при вызове подсказки, то навесить на появление окна, то не так критично.


tormozit
#15, ред. 01 декабря 2023 00:36

Так и не понял, можно в моем скрипте "ИР адаптер" это (обработать появление заданного окна) как то сделать или нет. Если можно, прошу показать пример. Если нет, прошу добавить такую возможность.


bolsun
#16, 01 декабря 2023 00:40

(15) tormozit, можно. Если рядом положить отдельный скрипт, у которого в шапке должны быть директивы

//@trigger 1
//@filter ^Конфигуратор$

В скрипте код проверки

	Элементы = ТК.НайтиЭлементыПоТипу("панель");

	Для каждого Элемент Из Элементы Цикл
		
		Если ПустаяСтрока(Элемент) Тогда
			Продолжить;
		КонецЕсли;

		Если СтрНачинаетсяС(Элемент, "Ошибка исключительной блокировки базы") Тогда			
			
			 // Решаем нужно ли закрывать, если нужно то жмем Enter на "Обновить динамически"

			Возврат;
			
						
		КонецЕсли;

	КонецЦикла;


bolsun
#17, 01 декабря 2023 00:42

Если прям в одном файле, то тоже можно,
Добавить
//@trigger 1
//@filter ^Конфигуратор$

В теле скрипта, добавить проверку заголовка на "Конфигуратор", т.к. не ясно вызывался скрипт по тригеру или принудительно и код выше.


tormozit
#18, ред. 01 декабря 2023 07:38

Предложенный способ работает.
Но хотелось бы более четкий признак того, что скрипт вызван из-за открытия окна. Иначе любая команда, вызванная при открытом окне, будет повторно пытаться обработать событие открытия окна. Иными словами хотелось бы нормальное событие "ПриОткрытииОкна".


bolsun
#19, 01 декабря 2023 16:40

Добавлено в тестовой 6.0.8735.33292
bolsun изменил статус на Закрыто


tormozit
#20, 02 декабря 2023 09:37

Примерно каждый 5-й раз триггер не срабатывает. Вот лог с последней версии Турбоконф до добавления события ПриОткрытииОкна. Окно появилось, но событие не вызывалось. Возможно это происходит когда окно сразу теряет фокус. Непонятно почему это происходит и как побеждать.
Ссылка скрыта

tormozit изменил статус на Открыто


tormozit
#21, 02 декабря 2023 09:57

Новый обработчик ПриОткрытииОкна(Параметры) проверил. Работает, но с той же проблемой.


tormozit
#22, 02 декабря 2023 10:01

Снял аналогичный лог на новой версии Турбоконф
Ссылка скрыта


tormozit
#23, ред. 02 декабря 2023 11:20

Похоже после нажатия "Да" в этом окне окно "Конфигуратор" часто не обнаруживается, т.к. открывается без захвата фокуса.

Но и в других ситуациях такое иногда происходит.


bolsun
#24, ред. 02 декабря 2023 13:32

(23) tormozit, почему оно теряет фокус? у меня вроде такого не было никогда с закрывашкой


bolsun
#25, ред. 02 декабря 2023 13:44

Ты убрал из шапки скрипта //@trigger и т.д.? Нужно убрать.
Как бы скрипт вызывается по триггеру перед обработчиком и фокус уходит в клиентское окно.


tormozit
#26, ред. 02 декабря 2023 14:02

  1. Триггер хотелось бы оставить как фильтр для вызова события ПриОткрытииОкна, чтобы мой скрипт не вызывался при открытии каждого типа окна.
  2. Без обработчика ПриОткрытииОкна на старом Турбоконфе есть такая же проблема. Поэтому маловероятно что сочетание триггера и нового события является причиной проблемы.


bolsun
#27, 02 декабря 2023 14:05

Триггер и обработчик не будут вместе работать корректно.
В логе видно, что триггер сработал на окно корректно, а обработчик уже нет. Т.к. фокус ушел.


tormozit
#28, ред. 02 декабря 2023 14:13

Смотри первый лог в сообщении #20. Там нет события ПриОткрытииОкна. А фокус все равно ушел. Значит кто то его уводит и без нового события. Хотелось бы понять почему уходит фокус.


bolsun
#29, 02 декабря 2023 14:12

(28) tormozit, я вижу, что там сработал скрипт.


bolsun
#30, 02 декабря 2023 14:14

Появилось окно и скрипт был вызван. Забирает клиентское окно скорее всего. Значит в обработчике в параметрах нужно передать тебе указатель на окно, чтобы ты вернул фокус вручную.


bolsun
#31, ред. 02 декабря 2023 14:20

(29) tormozit, сделай чистый скрипт, с одним обрабочиком (без ИР и COM). Проверь несколько раз, если фокус уйдет, то проблема не в клиентском.
Но мне бы давно уже сообщили о такой проблеме, пользователи Закрывашки. И у меня ни разу такого не было.

Только отключи RDT перед этим //@script_disabled 1


bolsun
#32, 02 декабря 2023 18:56

(31), @tormozit, пробовал чистый тест выше?


tormozit
#33, 02 декабря 2023 19:05

Пока нет


tormozit
#34, ред. 02 декабря 2023 21:32

Уже несколько раз заметил, что скрипт выполнил все задуманные строки. но кнопка "Обновить динамически" не нажалась. При этом был слышен системный звук ОС, который обычно играет при попытке кликнуть туда, где запрещено. Фокус находился в ожидаемом состоянии (в окне "Конфигуратор").

Возможно виновато отставание получения окном фокуса ввода от генерации события. Попробовал вставить Ждать(100), но это не помогло.
Тогда возможно нужно какое то улучшение в методе Турбоконфа КликнутьПоЭлементу().


Ссылка скрыта

Процедура ПриОткрытииОкна(Параметры)
	ЗаголовокОкна = Параметры.Заголовок;
	Если ЗаголовокОкна = "Конфигуратор" Тогда
		ПарольИлиСтрокаСоединения = ВосстановитьЗначениеБазы("ПарольИлиСтрокаСоединения", Истина);
		Если Ложь
			Или ПодключениеИРИзКэша() = Неопределено 
			Или ЛиСтрокаСоединения(ПарольИлиСтрокаСоединения)
		Тогда 
			Возврат;
		КонецЕсли;
		ЕстьПанельБлокировкиБазы = Ложь;
		Элементы = ТурбоКонф.НайтиЭлементыПоТипу("панель");
		Для каждого Элемент Из Элементы Цикл
			ЕстьПанельБлокировкиБазы = СтрНачинаетсяС(Элемент, "Ошибка исключительной блокировки");
		КонецЦикла;
		Если Не ЕстьПанельБлокировкиБазы Тогда
			Возврат;
		КонецЕсли;                                 
		ТекстОбновитьДинамически = "Обновить динамически";
		ЕстьКнопкаОбновитьДинамически = ТурбоКонф.НайтиЭлементПоИмени(ТекстОбновитьДинамически, "кнопка");
		Если ЕстьКнопкаОбновитьДинамически Тогда 
			ТурбоКонф.КликнутьПоЭлементу(ТекстОбновитьДинамически, "кнопка", 0, Ложь);
			ТурбоКонф.ПоказатьВсплывающееУведомление(НазваниеСкрипта(), "Конфигурация БД обновлена динамически из-за подключенного приложения ИР", 3000);
		Иначе 
			ТурбоКонф.ПоказатьВсплывающееУведомление(НазваниеСкрипта(), "Приложение ИР блокирует обновление базы. Кликни, чтобы закрыть приложение.", 4000, ЭтотОбъект, "ЗакрытьСлужебноеПриложение");
		КонецЕсли;
	КонецЕсли;
	Если Истина
		И ЗаголовокОкна = "Глобальный поиск по текстам" 
		И ВосстановитьЗначениеБазы("РазрешенИР") = Истина
		И ТурбоКонф.НайтиЭлементПоИмени("Заменить все", "кнопка")
	Тогда
		ТурбоКонф.ПоказатьВсплывающееУведомление(НазваниеСкрипта(), "После выполнения глобальной замены рекомендуется выполнить команду ИР.ОбновитьКэшМодулей", 4000);
		Возврат;
	КонецЕсли;
КонецПроцедуры


bolsun
#35, 02 декабря 2023 21:48

(34) tormozit, почему не использовать клавиатуру для нажатия?


bolsun
#36, 02 декабря 2023 21:54

(34) tormozit, https://disk.yandex.ru/d/XKCz9ijzgtoO1w
Эту версию еще попробуй через клик, я в АПИ другую реализацию прокинул.


tormozit
#37, 02 декабря 2023 22:08

(35) bolsun, клавиатура в данном случае менее надежна, т.к. клавиши Влево/Вправо циклически перемещают фокус между кнопками.


tormozit
#38, 02 декабря 2023 22:09

Проверил на версии 6.0.8736.42963
Проблема осталась.
Ссылка скрыта


bolsun
#39, 02 декабря 2023 22:15

(38) tormozit, не понимаю что происходит в этом логе, окно появилось, обработчик был вызван, затем много раз было нажатие Вправо. Много там всего происходит.
Можно новый чистый лог, сразу после появления окна?


bolsun
#40, ред. 02 декабря 2023 22:20

100 мс ожидания кстати может быть мало при появлении окна, попробуй 200мс


tormozit
#41, ред. 02 декабря 2023 22:23

Поставил 200мс. Проблема осталась.
Ссылка скрыта

Процедура ПриОткрытииОкна(Параметры)
	ЗаголовокОкна = Параметры.Заголовок;
	Если ЗаголовокОкна = "Конфигуратор" Тогда
		ПарольИлиСтрокаСоединения = ВосстановитьЗначениеБазы("ПарольИлиСтрокаСоединения", Истина);
		Если Ложь
			Или ПодключениеИРИзКэша() = Неопределено 
			Или ЛиСтрокаСоединения(ПарольИлиСтрокаСоединения)
		Тогда 
			Возврат;
		КонецЕсли;
		ЕстьПанельБлокировкиБазы = Ложь;
		Элементы = ТурбоКонф.НайтиЭлементыПоТипу("панель");
		Для каждого Элемент Из Элементы Цикл
			ЕстьПанельБлокировкиБазы = СтрНачинаетсяС(Элемент, "Ошибка исключительной блокировки");
		КонецЦикла;
		Если Не ЕстьПанельБлокировкиБазы Тогда
			Возврат;
		КонецЕсли;                                  
		ТекстОбновитьДинамически = "Обновить динамически";
		ЕстьКнопкаОбновитьДинамически = ТурбоКонф.НайтиЭлементПоИмени(ТекстОбновитьДинамически, "кнопка");
		Если ЕстьКнопкаОбновитьДинамически Тогда 
			ТурбоКонф.Ждать(200); // https://turboconf.ru/Tasks/8611 #34
			ТурбоКонф.КликнутьПоЭлементу(ТекстОбновитьДинамически, "кнопка", 0, Ложь);
			ТурбоКонф.ПоказатьВсплывающееУведомление(НазваниеСкрипта(), "Конфигурация БД обновлена динамически из-за подключенного приложения ИР", 3000);
		Иначе 
			ТурбоКонф.ПоказатьВсплывающееУведомление(НазваниеСкрипта(), "Приложение ИР блокирует обновление базы. Кликни, чтобы закрыть приложение.", 4000, ЭтотОбъект, "ЗакрытьПриложениеИР");
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры


tormozit
#42, ред. 02 декабря 2023 22:24

(36) bolsun, новый подход дает 0% срабатываний. Поэтому прошу вернуть старый. Там значительно чаще срабатывало.


bolsun
#43, 02 декабря 2023 22:27

(42) tormozit, скинь скрипт текущий


tormozit
#44, 02 декабря 2023 22:27

RDT.os


bolsun
#45, 02 декабря 2023 22:50

Окно кстати похоже багнутое, т.к. в нем не работает Esc, кнопка закрытия и вообще оно странное.


bolsun
#46, 02 декабря 2023 22:54

Клики оно тоже странно обрабатывает.

Вместо клика, это работает хорошо, можно даже без ожидания.

	ТурбоКонф.Клавиша(Keys.Right);
	ТурбоКонф.Клавиша(Keys.Enter);


tormozit
#47, ред. 02 декабря 2023 23:05

это работает хорошо

Скорее это работает хорошо в текущей версии платформы. В следующей переставят кнопки местами и будет нехорошо.


bolsun
#48, ред. 02 декабря 2023 23:31

(47) tormozit, могут много что поменять (название кнопки, окна и т.д.) что же теперь делать.
Ладно, вот другой метод для установки фокуса.

API 6

  • Добавлен метод УстановитьФокусНаЭлемент(ИмяЭлемента, ТипЭлемента)
    Устанавливает фокус на элемент, если он поддерживает эту функцию.

https://disk.yandex.ru/d/XKCz9ijzgtoO1w

	ТекстОбновитьДинамически = "Обновить динамически";
	ЕстьКнопкаОбновитьДинамически = ТурбоКонф.НайтиЭлементПоИмени(ТекстОбновитьДинамически, "кнопка");
	Если ЕстьКнопкаОбновитьДинамически Тогда 

		УспехУстановкиФокуса = Ложь;

		Попытка
			УспехУстановкиФокуса = ТурбоКонф.УстановитьФокусНаЭлемент(ТекстОбновитьДинамически, "кнопка");
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;

		Сообщить("УспехУстановкиФокуса="+Строка(УспехУстановкиФокуса));

		Если Не УспехУстановкиФокуса Тогда
			ТурбоКонф.Клавиша(Keys.Right);			
		КонецЕсли;

		ТурбоКонф.Клавиша(Keys.Enter);

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


bolsun
#49, 02 декабря 2023 23:32

@tormozit, этот метод устанавливает фокус не мышью и не клавой, а через методы UIAutomation. На кнопках, чекбоксах, элементах меню можно использовать.


tormozit
#50, 02 декабря 2023 23:48

С новым методом УстановитьФокусНаЭлемент() и затем отправкой нажатия клавиши ENTER работает стабильно. И этот новый метод думаю еще много где можно будет применить для повышения надежности.
tormozit изменил статус на Закрыто


tormozit
#51, ред. 03 декабря 2023 00:10

Прошу вернуть начальное поведение метода КликнутьПоЭлементу(). В новой версии он

  1. Стал заметно реже выполнять клик
  2. Превратился в процедуру, а раньше был функцией! Поэтому возникают ошибки в коде, который использовал его как функцию.

Не удалось выполнить скрипт ИРАдаптер->ПерейтиКОпределению
ScriptEngine.Machine.RuntimeException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 558 / Использование процедуры, как функции}
Если ТурбоКонф.КликнутьПоЭлементу(СтруктураСсылки.УсловиеОстанова + " Условие", Неопределено, 0, Ложь) Тогда // Было 1000мс. Исправлено

в ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, Int32 methodIndex, IValue[] arguments)
в ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters)

tormozit изменил статус на Открыто


bolsun
#52, 03 декабря 2023 14:40

(51) tormozit, https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#53, 03 декабря 2023 14:50

Поведение КликнутьПоЭлементу() восстановилось. Но пропал добавленный вчера метод УстановитьФокусНаЭлемент()


bolsun
#54, 03 декабря 2023 15:11

(53) tormozit, https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#55, 03 декабря 2023 15:13

Теперь обе проблемы устранены.
tormozit изменил статус на Закрыто


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