Предлагаю добавить режим "Избранное" в навигатор по метаданным

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

Предлагаю добавить режим "Избранное" в навигатор по метаданным.
Этот режим переключается кнопкой в форме навигатора и повторными вызовами команды "Навигатор по метаданным". Т.е. после открытия навигатора еще раз жмем то же сочетание клавиш и включает новый режим. Еще раз жмем - снова возвращается полный режим.

В режиме "Избранное"

  1. Отображаются только ранее добавленные пользователем объекты
  2. Сортировка по алфавиту по полному имени объекта
  3. Ориентируемся на небольшой список - до 30 элементов
  4. Работает фильтр и отображение аналогично полному режиму навигатора
  5. Отображается кликабельная пометка в виде звезды (при клике звезда гаснет и при следующем обновлении списка элемент из избранного удалится)

В полном режиме навигатора

  1. Отображается кликабельная пометка в виде звезды аналогично режиму "Избранное"

В API

  1. Добавляем метод ДобавитьОбъектМетаданныхВИзбранное(ПолноеИмяОбъекта).

Добавить команду для добавления объекта метаданных в избранное. Смотри пример в ИР адаптере "Копировать ссылку"

Функция СсылкаНаОбъектМДВДеревеКонфигурации(Знач ПодключениеИР, Знач ТолькоВерхнийУровень = Ложь, выхИмяРасширения = "") Экспорт
	МодулиИР = МодулиИР(ПодключениеИР);
	ОткрытьКонтекстноеМеню();
	Попытка
		ТипАктивногоЭлемента = ТурбоКонф.ПолучитьТипАктивногоЭлемента();
	Исключение
		// < 6.3.9145.3319
		ТипАктивногоЭлемента = Неопределено;
	КонецПопытки;
	Сообщить("ТипАктивногоЭлемента=" + ТипАктивногоЭлемента);
	Если Ложь
		Или ТипАктивногоЭлемента = ТипЭлемента.ЭлементМеню // Не работает
		Или ТурбоКонф.НайтиЭлементПоИмени("Свойства", "элемент меню")
		Или ТурбоКонф.НайтиЭлементПоИмени("Добавить", "элемент меню")
		//Или ПолучитьТипТекущегоЭлемента() = ТипЭлемента.ЭлементМеню // турбоконф не видит активность контекстного меню
	Тогда
		Если КликнутьПоЭлементу("Справочная информация", "элемент меню") Тогда
			// Частично дублируем логику см. ИмяМодуляДокумента Мультиметка250108_112016
			Заголовок = МодулиИР.ирОбщий.ПервыйФрагментЛкс(ТурбоКонф.ПолучитьЗаголовокКонфигуратора(Конфигуратор.ГлавноеОкно), "- Конфигуратор -", Ложь);
			ЗакрытьДочернееОкноКонфигуратора();
			ВернутьсяИзПереходаКонфигуратора();
			Если ПустаяСтрока(Заголовок) Тогда
				ПоказатьВсплывающееУведомление("Разверните дочерние окна конфигуратора для ускорения получения ссылки на объект метаданных");
				ТурбоКонф.Ждать(50);
			Иначе
				ЧастиДвоеточия = СтрРазделитьЛкс(Заголовок, ":", Истина);
				ИмяКорневогоТипа = ИдентификаторИзПредставленияЛкс(СтрокаБезПоследнегоФрагментаЛкс(ЧастиДвоеточия[0], " "));
				Если ИмяКорневогоТипа = "Конфигурация" Тогда
					ПолноеИмяОбъекта = "ОбщаяФорма." + ЧастиДвоеточия[1];
				Иначе
					ИмяОбъекта = ПоследнийФрагментЛкс(ЧастиДвоеточия[0], " ");
					ПолноеИмяОбъекта = ИмяКорневогоТипа + "." + ИмяОбъекта;  
					Если Истина
						И ЧастиДвоеточия.Количество() > 1 
						И ЧастиДвоеточия[1] <> "Справочная информация"
					Тогда
						ПолноеИмяОбъекта = ПолноеИмяОбъекта + ".Форма." + ИдентификаторИзПредставленияЛкс(ЧастиДвоеточия[1]);
					КонецЕсли;
				КонецЕсли;
				Возврат ПолноеИмяОбъекта;
			КонецЕсли;
		Иначе
			ЗакрытьДочернееОкноКонфигуратора();
		КонецЕсли;
	КонецЕсли;
	Фрагменты = ПутьВДеревеТабличногоПоля(ПодключениеИР);
	Если Ложь
		Или Фрагменты.Количество() < 2 
		Или Найти(Фрагменты[0], " ") > 0 // неполное дерево
	Тогда 
		АктивироватьСтрокуДерева(Фрагменты);
		Возврат "";
	КонецЕсли;
	Если Фрагменты[1] = "Общие" Тогда
		Фрагменты.Удалить(1);
	КонецЕсли;
	ПозицияФрагмента = Фрагменты.Найти("Табличные части");
	Если ПозицияФрагмента <> Неопределено Тогда
		Если Фрагменты.Количество() > ПозицияФрагмента + 2 Тогда
			Фрагменты.Вставить(ПозицияФрагмента + 2, "Реквизиты");
		КонецЕсли;
	КонецЕсли;
	ПозицияФрагмента = Фрагменты.Найти("Перерасчеты");
	Если ПозицияФрагмента <> Неопределено Тогда
		Если Фрагменты.Количество() > ПозицияФрагмента + 2 Тогда
			Фрагменты.Вставить(ПозицияФрагмента + 2, "Измерения");
		КонецЕсли;
	КонецЕсли;
	Для Счетчик = 1 По Цел(Фрагменты.Количество() / 2) Цикл
		ИндексФрагмента = 2*(Счетчик - 1) + 1;
		ИмяМножественное = ИдентификаторИзПредставленияЛкс(Фрагменты[ИндексФрагмента],,, "");
		ЕдинственноеИмя = МодулиИР.ирОбщий.ЕдинственноеИмяМДЛкс(ИмяМножественное);
		Если ЕдинственноеИмя = Неопределено Тогда
			ПоказатьВсплывающееУведомление("Неизвестный тип метаданных """ + ИмяМножественное + """");
			Возврат "";
		КонецЕсли;
		Фрагменты[ИндексФрагмента] = ЕдинственноеИмя;
	КонецЦикла;
	ИмяКонфигурации = Фрагменты[0];
	Фрагменты.Удалить(0); // Имя конфигурации/расширения
	СсылкаВосстановления = СтрСоединить(Фрагменты, ".");
	Пока ТолькоВерхнийУровень И Фрагменты.Количество() > 2 Цикл
		Фрагменты.Удалить(Фрагменты.ВГраница());
	КонецЦикла;
	Ссылка = СтрСоединить(Фрагменты, ".");
	ИмяОсновнойКонфигурации = ИмяОсновнойКонфигурации(ПодключениеИР);
	Если ИмяОсновнойКонфигурации <> ИмяКонфигурации Тогда
		выхИмяРасширения = ИмяКонфигурации;
		СсылкаВосстановления = ИмяКонфигурации + " " + СсылкаВосстановления;
		Ссылка = ИмяКонфигурации + " " + Ссылка;
	КонецЕсли;
	ТурбоКонф.Перейти(СсылкаВосстановления);
	Возврат Ссылка;
КонецФункции

Комментарии

nytlenc
#1, 15 января 2025 08:32

В полном режиме навигатора
Отображается кликабельная пометка в виде звезды аналогично режиму "Избранное"

Вопрос, не будут-ли лишняя картинка мозолить остальным глаза? Надо над этим моментом хорошо подумать. Возможно, если и добавлять пометку в виде звезды, то стоит подумать где... Например, в конце строки.

Если честно, как-то не очень выглядит, и лично мне, например мешает, если попробовать представить себе как это будет выглядеть визуально (см. картинку). Да и в целом функционал на самом деле сомнительный. Всегда можно почистить навигатор и оставить в списке то что нужно если это требуется, и докинуть новых объектов.
А тот кто имеет "избранные" метаданные и так их помнит и быстро найдет нажатием Ctrl + J и набрав например "общ наз выз сер"


tormozit
#2, ред. 15 января 2025 08:47

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


tormozit
#3, ред. 15 января 2025 08:59

(1) nytlenc,

А тот кто имеет "избранные" метаданные и так их помнит и быстро найдет нажатием Ctrl + J и набрав например "общ наз выз сер"

Серьезно считаешь, что каждый раз набирать текст для часто используемых метаданных так же удобно как найти глазами и кликнуть на строке в небольшом списке?
Мне кажется очевидным, что это менее удобно.


tormozit
#4, 15 января 2025 09:02

Похожий интерфейс сделан в программе ClipAngel (менеджере истории буфера обмена) https://sourceforge.net/projects/clip-angel/ . Картинка выше из него.


nytlenc
#5, 15 января 2025 09:10

(2) tormozit, ну в принципе блеклый вариант звезды наверное наименее "раздражает" глаз. Вынужден согласиться.


bolsun
#6, ред. 15 января 2025 14:05

Если будет какой-то специальный режим для отображения избранного, то и звезд не нужно и так понятно, что это избранное. Добавлять удалять можно по правой кнопке в меню, два клика получится, зато нет избыточной информации в списке.


tormozit
#7, ред. 15 января 2025 14:14

(6) bolsun,

избыточной информации в списке

Она может быть и полезной. Например в полном режиме видя включенную пометку "Звезда", можно быстрее находить объект, если изначально не был уверен что он есть в избранном но вероятность этого оценивал как большую.

Добавлять удалять можно по правой кнопке в меню, два клика получится

Для добавления может и будет нормально (так же я сделал в инструменте "Интерфейсная панель"), но для удаления, которое в случае избранного часто бывает порциями, это будет не достаточно удобно. Либо в режиме "Избранное" нужно множественное выделение , чтобы удалять сразу несколько элементов. Еще переключатель с картинкой "Звезда" в полном режиме позволяет сразу понимать, добавился ли элемент в избранное, т.к. изменение его состояния сразу видно в списке. Если же выполнять команду контекстного меню, то можно вслепую надобавлять много объектов и только потом увидеть, что по какой то причине они все же не добавились.


bolsun
#8, 15 января 2025 14:56

(7) tormozit, слишком пестро получается с этими звездочками они еще скачут туда-сюда, если разные конфигурации и длина имени.
Вот рандомно вывел их


bolsun
#9, 15 января 2025 14:57


bolsun
#10, 15 января 2025 14:58

Можно выделять избранное цветом (темно синий например)


bolsun
#11, 15 января 2025 15:00

(10) bolsun, но это тоже так себе, т.к. могут использоваться разные темы оформления списка


bolsun
#12, 15 января 2025 15:01

либо не выводить пустую звезду, может не будет тогда так отвлекать.


bolsun
#13, 15 января 2025 15:04

да, так выглядит поспокойнее


tormozit
#14, 15 января 2025 15:07

Попробуй разместить звезду в самом конце строки


bolsun
#15, 15 января 2025 15:10

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


tormozit
#16, 15 января 2025 15:18

(15) Понял. Ну тогда сойдет и (13)


bolsun
#17, 15 января 2025 16:52

Добавил Избранное в первом приближении.

6.3.9146.33843
https://disk.yandex.ru/d/ay0Wg6IBTsxSxg


tormozit
#18, ред. 15 января 2025 19:52

То, что сделано, вроде работает. Но добавлять в избранное я обычно хочу из дерева метаданных. Тут есть 2 подхода

  1. При вызове команды "Навигатор" подхватывать имя объекта (кажется я уже несколько раз такое предлагал) и дальше пользователь из ограниченного списка заново ищет нужный объект и добавляет в избранное.
  2. Получать полное имя объекта метаданных (в исходном сообщении привел код) и добавлять объект сразу в Избранное с отображением подтверждающего уведомления. В частности я такую побочную опцию хочу добавить в свою команду Копировать ссылку, которая показывает уведомление и там я могу быть добавить гиперссылку для добавления в избранное. Но для этого еще нужен соответствующий метод в АПИ.


bolsun
#19, 15 января 2025 22:37

(18) tormozit, как ты определяешь к основной конфигурации или какому расширению принадлежит объект?


tormozit
#20, ред. 15 января 2025 22:45

(19) bolsun, по имени корня дерева. Но правда восстановление позиции у меня сейчас идет всегда в дереве основной конфигурации. Не помню, работало ли это корректно ранее.


bolsun
#21, 15 января 2025 22:44

(20) tormozit, и назад возвращаешь фокус?


bolsun
#22, 15 января 2025 22:45

Да, проблема в восстановлении позиции.


tormozit
#23, ред. 15 января 2025 22:52

Ну дорогой способ активировать окно расширения есть - по имени расширения найти его строку и открыть его через окно "Расширения конфигурации".


bolsun
#24, 15 января 2025 23:05

Можешь напомнить, почему не подходит способ получить полное имя объекта в дереве переходя по родителям?
У делал такой прототип в свое время.


bolsun
#25, ред. 15 января 2025 23:12

Еще нашел простой способ получить полное имя объекта.

  1. Вызываем пункт контекстного меню "Поиск ссылок в объекте"
  2. В окне служебных сообщений видим его имя.
    Работает вроде быстро. Какие могут быть проблемы с использованием?
    Я вижу только засорение окна сообщений.


bolsun
#26, 15 января 2025 23:13

После этого по всем кэшам проверяем есть ли совпадения более одного раза и тогда уточняем, к какой конфигурации принадлежит объект.


bolsun
#27, ред. 15 января 2025 23:24

Проверил, работает быстро даже на ERP (что логично, т.к. ищется не по всем объектам его вхождение ,а наоборот), версии 8.3.8 -8.3.27 поддерживаются.


tormozit
#28, ред. 15 января 2025 23:33

(25) bolsun, Пробовал его. Он может быть долгим для больших объектов типа форм с настройками по умолчанию. Поэтому придется в окне настроек поиска ставить флажки так

Но считать текущие состояния флажков мы не можем, чтобы понять в каких строках надо жать клавишу Space.


tormozit
#29, ред. 15 января 2025 23:30

Все же самый быстрый по пику способ получать полное имя - открывать окно "Справочная информация". Он для части типов объектов не работает, но зато максимальная длительность у него низкая и мусора не остается. А для остальных объектов уже можно применять более грязные способы.


bolsun
#30, 15 января 2025 23:39

(29) tormozit, определять состояние флажков можем, т.к. TogglePattern поддерживается.


bolsun
#31, 15 января 2025 23:42

Для общих модулей нет справочной информации, но уверен они часто будут добавляться в Избранное, поэтому этот способ может помочь.
Преимущества - быстро, не меняется активный элемент.
Минусы - одна лишняя строчка в окне сообщений.


bolsun
#32, ред. 15 января 2025 23:43

Проверяем, есть ли Справочная информация - если есть получаем из ее окна, если нет, вызываем этот метод.
Получаем значение текущего флажка, снимаем если нужно и ставим последний.


tormozit
#33, 15 января 2025 23:45

(32) bolsun, Да похоже это будет оптимальный способ.


tormozit
#34, 15 января 2025 23:47

Ну и хорошо бы его сразу в АПИ прокинуть, чтобы мне не дублировать это все в скрипте.


tormozit
#35, ред. 15 января 2025 23:51

Кстати кажется, что окно с флажками появляется только у тех объектов, у которых есть справочная информация. Поэтому очень вероятно, что тебе даже не придется с ним взаимодействовать.


bolsun
#36, 15 января 2025 23:51

(35) tormozit, похоже на то


tormozit
#37, ред. 16 января 2025 00:08

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


tormozit
#38, 16 января 2025 00:12

(36) bolsun, Все таки у макетов это окно появляется, а справочной информации у них нет. Макеты могут быть тяжелыми. Например в схеме компоновки может быть много разных ссылок на другие объекты метаданных. Сходу даже не знаю какой из флажков оптимальнее выбрать.


tormozit
#39, 16 декабря 2025 09:40

Метод ДобавитьОбъектМетаданныхВИзбранное() хотелось бы.


tormozit
#40, 24 января 2026 18:21

По большому счету не пользуюсь этой функцией в текущем виде, т.к. неудобно добавлять объекты в избранное.
Вот я пишу код целый день в каком то модуле и понимаю, что еще неделю там буду править. Поэтому хочу добавить объект метаданных в избранное. Что для этого нужно сделать?
В текущей реализации я нашел только один путь - открыть навигатор и ввести/вставить туда имя текущего объекта метаданных и после его вывода в отфильтрованном списке навести указатель и в контекстном меню кликнуть "Добавить в избранное". Слишком неудобно.

Может есть более удобный путь?


tormozit
#41, ред. 24 января 2026 18:27

Поэтому пожелание (18) актуально. Нужно хотя бы п.2 (39)


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