Прошу распространить работу флага ЗаменятьРодителяПриВставке элемента списка Т9 на всех родителей слова

tormozit Закрыто Средний

Сейчас флаг ЗаменятьРодителяПриВставке элемента списка Т9 применяется только к прямому родителю, но в адаптере появились случаи где нужно заменять всех родителей (переносить текущее выражение внутрь конструкции.
Поэтому прошу распространить работу флага ЗаменятьРодителяПриВставке на всех родителей слова, чтобы можно было целиком выражение заменять.

Чтобы не усложнять анализ, можно не ходить дальше символа ")", но при этом хотелось бы учесть символы "[]". Как вариант, я могу бы передавать позицию начала выражения в событии ПриВыбореЗначенияТ9.

В примере ниже это будет "тз.Колонки."

Комментарии

tormozit
#1, 17 января 2025 08:01

Сейчас после вставки получаю такое

А хотелось бы


tormozit
#2, 25 января 2025 09:37

Напоминаю


tormozit
#3, 07 февраля 2025 09:40

Напоминаю


tormozit
#4, 14 февраля 2025 08:00

Напоминаю


tormozit
#5, 25 февраля 2025 08:11

Напоминаю


tormozit
#6, 02 марта 2025 09:19

Напоминаю


tormozit
#7, ред. 02 марта 2025 10:43

Пришлось решать нерекомендуемым тобой путем - удалять такой фрагмент в обработчике ПриВыбореЗначенияТ9

Процедура ПриВыбореЗначенияТ9(Параметры, ШаблонДляВставки, ФорматироватьТекст, Отказ, СтандартнаяОбработка)
    Если Ф Тогда
		  ТурбоКонф.ВыделитьТекст(ПозицияВТексте - СтрДлина(ПолеТекстаПрограммы.мРодительскийКонтекст + "."), ПозицияВТексте);
		  ТурбоКонф.Клавиша(Клавиши.Delete);
	КонецЕсли
КонецПроцедуры


tormozit
#8, 02 марта 2025 23:35

Исправление включено в адаптере 1.97 + ИР 7.68


tormozit
#9, ред. 08 марта 2025 12:48

(7) tormozit, работает не надежно. Иногда Турбоконф все равно вставляет в позицию где была каретка до моего удаления фрагмента текста, а не в текущую позицию каретки. Может быть есть способ как то заставить Турбоконф перечитать позицию каретки в этой ситуации?


bolsun
#10, 08 марта 2025 14:51

(9) tormozit, ты учел, что на куче версий платформы ВыделитьТекст() не поддерживается?
как в этом случае предполагается заменять родителя?


tormozit
#11, 08 марта 2025 15:04

(10) bolsun, Забыл про это. Теперь окружил (7) условием Если Не ТурбоКонф.РежимСовместимости()


bolsun
#12, 08 марта 2025 15:11

(11) tormozit, получается что у этих пользователей этот функционал работать не будет, тогда лучше совсем не показывать элементы которые требуют замены всего родителя.


tormozit
#13, 08 марта 2025 15:15

(12) bolsun, напомни с какой версии платформы РежимСовместимости() дает Ложь?


bolsun
#14, 08 марта 2025 15:25

(13) tormozit, точно по номеру версии не определить, т.к. в разных мажорных релизах могут быть версии как с поддержкой TextPattern так и без.

Также может поддерживаться TextPattern, но метод SelectText - нет.

ТК определяет режим на основе поддержки TextPattern и исключает релизы 19 и 20


bolsun
#15, 08 марта 2025 16:20

Попробуй на этой версии, используй Параметры.УдалятьТекст = Ложь; в обработчике. В этом случае ТК не будет удалять ни родителя, ни набранный текст. Но возможны какие-то еще побочки из-за вмешательства во вставку, нужно проверять.

6.3.9198.32497
https://disk.yandex.ru/d/XRPUNWQtrbwBUw


tormozit
#16, ред. 08 марта 2025 18:02

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

  1. Тут вставляется всегда в старое положение каретки 0I8EobpkxA.mp4
  2. Тут вставляется в новое положение каретки 1Vu6sCuSI2.mp4

В обоих случаях код в отладчике идет одинаково.
ФорматироватьТекст = Истина.
Шаблон =

Для Каждого <?> Из СтандартныеРеквизиты Цикл
   
КонецЦикла;


tormozit
#17, ред. 08 марта 2025 18:06

(16) tormozit, если скопировать модуль целиком, то проблема сохраняется в копии модуля. Но если копирую только метод, то проблема исчезает в копии.


tormozit
#18, ред. 08 марта 2025 18:09

Прикрепил проблемный модуль. Надо встать в конец строки 11912, нажать ENTER, ввести "СтандартныеРеквизиты." и вставить "<Обойти элементы>" из списка Т9
Ссылка скрыта


tormozit
#19, 09 марта 2025 08:16

(15) bolsun, по всякому пробовал, но этот параметр не влияет на поведение вставки.
(9) tormozit, методом тыка нашел решение задачи "как то заставить Турбоконф перечитать позицию каретки" - вызвал ТурбоКонф.ИдентифицироватьТекущийДокумент():

Процедура ПриВыбореЗначенияТ9(Параметры, ШаблонДляВставки, ФорматироватьТекст, Отказ, СтандартнаяОбработка)
...
	Если ... Тогда
		ПозицияВТексте = ПолеТекстаПрограммы.мПозицияВТексте - 1;
		ТурбоКонф.ВыделитьТекст(ПозицияВТексте - СтрДлина(ПолеТекстаПрограммы.мРодительскийКонтекст + "."), ПозицияВТексте);
		ТурбоКонф.Клавиша(Клавиши.Delete);
		ТурбоКонф.ИдентифицироватьТекущийДокумент(); // https://turboconf.ru/Tasks/10006
	КонецЕсли;
КонецПроцедуры


tormozit
#20, 09 марта 2025 09:37

(19) tormozit, замерил. ТурбоКонф.ИдентифицироватьТекущийДокумент() выполняется 40-50мс. Это достаточно долго. Хотелось бы решение до 5мс.


bolsun
#21, 09 марта 2025 11:40

(18) tormozit, у меня вставляется правильно всегда.
Пришли скрипт, где ты устанавливаешь новый флаг и лог после неправильной вставки.


tormozit
#22, 09 марта 2025 11:46

(21) bolsun, перезапустил Турбоконф с открытым проблемным модулем. Сначала проблема не воспроизводилась. Но после переоткрытия окна модуля воспроизвелась.

Ссылка скрыта
RDT.os


bolsun
#23, ред. 09 марта 2025 11:50

(22) tormozit, установку флага Параметры.УдалятьТекст = Ложь в скрипте не наблюдаю.


tormozit
#24, 09 марта 2025 11:50

(23) bolsun, она не работает. Выше писал.


bolsun
#25, 09 марта 2025 11:51

(24) tormozit, мне нужен лог после вставки с установленным флагом Параметры.УдалятьТекст = Ложь.


tormozit
#26, ред. 09 марта 2025 11:54

Вот лог с Параметры.УдалятьТекст = Ложь. Ровно такое же поведение
Ссылка скрыта


tormozit
#27, ред. 09 марта 2025 11:56

А вот лог корректной работы с долгим Турбоконф.ИдентифицироватьТекущийДокумент()
Ссылка скрыта


bolsun
#28, 09 марта 2025 12:02

(27) tormozit, выделение и удаление текста происходит не моментально. Если не влезать в процесс вставки, то ТК тщательно контролирует весь процесс, проверяет, что предыдущее действие выполнилось и т.д.
Скорее всего текст не успевает удалиться к моменту начала вставки и происходит вставка в неправильную позицию, возможно поможет небольшая задержка 20мс.


tormozit
#29, ред. 09 марта 2025 12:05

(28) bolsun, Вставил задержку 5мс. Да, проблема теперь не возникает. Значит не логика работы Турбоконф.ИдентифицироватьТекущийДокумент(), а его длительность оказывала лечебное воздействие.


tormozit
#30, 09 марта 2025 12:06

Свойство УдалятьТекст похоже тогда не нужно.


bolsun
#31, ред. 09 марта 2025 12:08

(30) tormozit, УдалятьТекст = Ложь нужно использовать, т.к. если будет набрано какое-то слово например СтандартныеРеквизиты.об - вставка выполнится в неправильную позицию.


tormozit
#32, 09 марта 2025 12:16

(31) bolsun, проверил. Подтверждаю. Оставил установку УдалятьТекст = Ложь в обработчике.


bolsun
#33, 09 марта 2025 12:39

(29) tormozit, это все равно может быть ненадежно. На других машинах, 5 мс может быть недостаточно.
Попробовал сам удалять, но диапазон выделяется без учета набранного дочернего слова

ТурбоКонф.ВыделитьТекст(ПозицияВТексте - СтрДлина(ПолеТекстаПрограммы.мРодительскийКонтекст + "."), ПозицияВТексте);

Я так понимаю - это не учитывается в этих расчетах?


tormozit
#34, 09 марта 2025 12:44

(33) bolsun, исправь на
ТурбоКонф.ВыделитьТекст(ПозицияВТексте - СтрДлина(ПолеТекстаПрограммы.мКонтекст), ПозицияВТексте)


bolsun
#35, 09 марта 2025 13:06

(34) tormozit, ПозицияВТексте ты как получаешь? У меня она не всегда правильная приходит


tormozit
#36, 09 марта 2025 13:08

(35) bolsun,
ПозицияВТексте = ПолеТекстаПрограммы.мПозицияВТексте - 1;
Проверить твой тест не могу, т.к. не понял как повторять.


bolsun
#37, 09 марта 2025 13:09

(36) tormozit, это я понял, тогда ПолеТекстаПрограммы.мПозицияВТексте - ты откуда берешь?


bolsun
#38, 09 марта 2025 13:10

Здесь?

Процедура ПриПолученииДанныхТ9(Параметры)
...
ПозицияВТексте = Параметры.Позиция;


bolsun
#39, 09 марта 2025 13:17

Это неправильно, т.к. с момента вызова подсказки пользователь может дальше продолжать набирать слово.
Буду передавать актуальную позицию в Параметрах обработчика.


bolsun
#40, 09 марта 2025 13:23

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


bolsun
#41, ред. 09 марта 2025 13:32

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

В Параметрах обработчика ПриВыбореЗначенияТ9 добавлены свойства:

Параметры.Позиция - текущая позиция каретки
Параметры.УдалитьТекстС - начало удаляемого фрагмента, по умолчанию 0
Параметры.УдалитьТекстПо - конец удаляемого фрагмента, по умолчанию 0


tormozit
#42, 09 марта 2025 15:17

Еще было бы неплохо добавить параметр с текстом "от начала слова до каретки", т.к. мне чтобы его получить нужно делать тяжелый запрос всего текста модуля.


bolsun
#43, 09 марта 2025 16:48

(42) tormozit, https://disk.yandex.ru/d/XRPUNWQtrbwBUw

В Параметрах обработчика ПриВыбореЗначенияТ9 добавлены свойства:

СтрокаСлева, ТекущаяСтрока, Фильтр


tormozit
#44, 09 марта 2025 17:25

(43) bolsun, Проверил. Работает.
tormozit изменил статус на Закрыто


tormozit
#45, ред. 09 марта 2025 17:34

Только показалось что наличие параметра УдалятьТекст одновременно с УдалитьТекстС и т.д. создает небольшую путаницу, т.к. второй параметр применяется только когда первый Ложь. Может переименовать УдалятьТекст->СтандартноеУдалениеТекста?


bolsun
#46, 09 марта 2025 17:56

(45) tormozit, думаю УдалятьТекст вообще не нужен теперь, если используется УдалитьТекстС, то он автоматически отключается.


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