Открывашка ячеек таблиц

Программирование - Работа с интерфейсом

открыть ссылку из таблицы

45
Глобальное сочетание клавиш для открытия объекта по ссылке из текущей ячейки любой таблицы в большинстве управляемых форм

Данное расширение конфигурации предназначено для режима совместимости платформы 8.3.8 и выше.

Оно содержит невидимую общую команду с сочетанием клавиш ALT+Q. Эта команда позволяет открыть форму объекта по ссылке из текущей ячейки любой таблицы в почти любой управляемой форме.

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

  1. Команда не будет работать в формах, открытых в режиме блокирования владельца.
  2. Возможно в будущем эта особенность поведения платформы будет устранена.

Так как на клиенте снаружи из управляемой формы невозможно универсально получить путь к данным поля формы и в частности поля таблицы формы, то в этой команде подразумевается, что имя поля таблицы имеет структуру <ИмяТаблицы><ИмяКолонкиДанных>. Поэтому команда не будет работать в тех таблицах, где не соблюдается этот принцип.

Как подключить расширение конфигурации?

  1. В режиме предприятия откройте "Все функции/Стандартные/Управление расширениями конфигурации"
  2. Нажмите "Добавить" и выберите скаченный файл расширения (*.cfe)
  3. Нажмите "Перезапустить"
  4. Теперь все новые сеансы в этой базе будут использовать это расширение.

Так как расширение состоит только из одной команды, то его легко сделать самостоятельно используя код модуля команды

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ПараметрКоманды = ПолучитьСсылкуТекущейЯчейки();
	Если Не ЗначениеЗаполнено(ПараметрКоманды) Тогда
		Возврат;
	КонецЕсли; 
	ПоказатьЗначение(, ПараметрКоманды);
	
КонецПроцедуры

&НаКлиенте 
Функция ПолучитьСсылкуТекущейЯчейки()
	
	ТекущееОкно = АктивноеОкно();
	Если ТипЗнч(ТекущееОкно) = Тип("ОкноКлиентскогоПриложения") Тогда
		ТекущаяФорма = ТекущееОкно.ПолучитьСодержимое();
		Если ТипЗнч(ТекущаяФорма) = Тип("УправляемаяФорма") Тогда
			Если ТипЗнч(ТекущаяФорма.ТекущийЭлемент) = Тип("ТаблицаФормы") Тогда
				ДанныеСтроки = ТекущаяФорма.ТекущийЭлемент.ТекущиеДанные;
				ТекущееПоле = ТекущаяФорма.ТекущийЭлемент.ТекущийЭлемент;
				ЗначениеПоля = Неопределено;
				ПолноеИмяПоля = ТекущееПоле.Имя;
				ПутьКДанным = НайтиПутьКДаннымПоля(ДанныеСтроки, ПолноеИмяПоля, ЗначениеПоля);
				ДлинаИмениДочернегоРеквизита = 0;
				Пока Не ЗначениеЗаполнено(ПутьКДанным) И ДлинаИмениДочернегоРеквизита < СтрДлина(ПолноеИмяПоля) Цикл 
					ДлинаИмениДочернегоРеквизита = ДлинаИмениДочернегоРеквизита + 1;
					Если "_" <> Сред(ПолноеИмяПоля, СтрДлина(ПолноеИмяПоля) - ДлинаИмениДочернегоРеквизита + 1, 1) Тогда
						Продолжить;
					КонецЕсли; 
					ИмяРеквизита = Лев(ПолноеИмяПоля, СтрДлина(ПолноеИмяПоля) - ДлинаИмениДочернегоРеквизита - 1);
					ИмяДочернегоРеквизита = Прав(ПолноеИмяПоля, ДлинаИмениДочернегоРеквизита);
					ПутьКДанным = НайтиПутьКДаннымПоля(ДанныеСтроки, ИмяРеквизита, ЗначениеПоля);
					Если ЗначениеЗаполнено(ПутьКДанным) Тогда
						Попытка
							ЗначениеПоля = ЗначениеПоля[ИмяДочернегоРеквизита];
						Исключение
							ПутьКДанным = Неопределено;
						КонецПопытки;
					КонецЕсли; 
				КонецЦикла;  
				Если Не ЗначениеЗаполнено(ПутьКДанным) Тогда
					Возврат Неопределено;
				КонецЕсли;
				Попытка
					Пустышка = ЗначениеПоля.УникальныйИдентификатор();
				Исключение
					Возврат Неопределено;
				КонецПопытки;
				Возврат ЗначениеПоля;
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли;
	Возврат Неопределено;
	
КонецФункции

&НаКлиенте
Функция НайтиПутьКДаннымПоля(Знач ДанныеСтроки, Знач ПолноеИмяПоля, ЗначениеПоля)
	
	ДлинаСтроки = СтрДлина(ПолноеИмяПоля);
	ПутьКДанным = "";
	Пока ДлинаСтроки > 0 Цикл
		ПроверяемоеИмя = Прав(ПолноеИмяПоля, ДлинаСтроки);
		ДлинаСтроки = ДлинаСтроки - 1;
		Попытка
			ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;
		Исключение
			Продолжить;
		КонецПопытки;
	КонецЦикла;
	Возврат ПутьКДанным;
	
КонецФункции

 

45

Скачать файлы

Наименование Файл Версия Размер
Открывашка ячеек таблиц:
.cfe 5,75Kb
27.10.18
8
.cfe 1.00 5,75Kb 8 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. yelloo 4 28.10.18 09:45 Сейчас в теме
А почему не сделать серверный вызов и получить путь к данным элемента формы?
2. yurii_host 1853 28.10.18 10:37 Сейчас в теме
(1) из клиентского кода, расположенного вне самой формы, нельзя обратиться к контексту этой формы на сервере.
Другими словами, чтобы выполнить то, что вы предлагаете, серверный код должен располагаться в модуле самой формы
3. MVK80 28.10.18 11:35 Сейчас в теме
ТекущаяФорма = ТекущееОкно.ПолучитьСодержимое();
ПолучитьСодержимое() - не нашел в синтаксис-помощнике (платформы 8.3.13 и 8.3.14). Это тоже что-то недокументированное для поддержки старых версий (раньше было, сейчас нет)?
4. tormozit 4906 28.10.18 11:41 Сейчас в теме
(3) Да. В одной из последних версий платформы этот метод заменили на свойство Содержимое. Кстати где ты взял 8.3.14? Ее еще не публиковали.
5. MVK80 28.10.18 12:00 Сейчас в теме
(4), работаю во франче, а они походу первые должны тестировать новые версии платформ и выявлять баги,
Так что я лично ничего не качал, у нас установили её :).
6. nvv1970 28.10.18 18:14 Сейчас в теме
(5) вероятно какой-то очень особенный франч, на котором тренируются ))
Наверно проект на тестовой платформе ведете?
7. Cyberhawk 108 29.10.18 10:52 Сейчас в теме
Вместо
Попытка
			ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;

можно сделать без попытки:
	    ИмяПоляДляЗонда = ПроверяемоеИмя;
		СтароеЗначение = "" + Новый УникальныйИдентификатор;
		Зонд = Новый Структура(ИмяПоляДляЗонда, СтароеЗначение);
		ЗаполнитьЗначенияСвойств(Зонд, ДанныеСтроки);
		НовоеЗначение = Зонд[ИмяПоляДляЗонда];
		Если НовоеЗначение <> СтароеЗначение Тогда
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;
		КонецЕсли;
Показать
tormozit; +1 Ответить
8. tormozit 4906 29.10.18 21:56 Сейчас в теме
(7) Согласен, что без попытки будет красивее. Также голый вариант без попытки упрощает отладку в случае использования фичи "Остановка по ошибке". Но в представленном мной коде в целом есть и другая попытка, где такой прием не поможет. Поэтому остается только увеличение красоты. Однако на другой чаше весов лежит лаконичность, т.к. публикация не про правильный код, а про удобную возможность для пользователя. Как мне кажется они в данном случае чащи весов почти уравновешены.
9. Cyberhawk 108 30.10.18 08:51 Сейчас в теме
(8) Не спорю: с попыткой код более краток и, наверное, даже более понятен разработчику (особенно не умудренному опытом).
А какой попытки нельзя избежать - там, где вызывается метод УникальныйИдентификатор? А зачем оно надо?
10. tormozit 4906 30.10.18 09:00 Сейчас в теме
(9) Вызов метода УникальныйИдентификатор в попытке нужен, чтобы проверить, что значение является ссылкой.
12. Cyberhawk 108 31.10.18 13:02 Сейчас в теме
(10) А что плохого будет, если это не проверять?
11. asg.aleks 46 31.10.18 12:22 Сейчас в теме
(7)
ДанныеСтроки - это всегда ДанныеФормыЭлементКоллекции, значит можно еще проще:

		Если ДанныеСтроки.Свойство(ПроверяемоеИмя) Тогда
			ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;
		КонецЕсли; 
SlavaKron; tormozit; +2 Ответить
13. tormozit 4906 31.10.18 13:18 Сейчас в теме
(11) Откроется значение не ссылочного типа в маленьком окошке по центру экрана с блокированием других окон.
14. asg.aleks 46 31.10.18 14:49 Сейчас в теме
(13)
Это, наверное, все же к (12)... Или я чего-то не понял.
15. tormozit 4906 31.10.18 14:50 Сейчас в теме
(14) Да. Но исправить уже не могу.
16. Cyberhawk 108 31.10.18 15:14 Сейчас в теме
(13) Ну. "Открывашка ячеек таблиц" вроде это и должна делать, не?
17. tormozit 4906 31.10.18 15:28 Сейчас в теме
(16) Лично меня открытие других типов раздражает, т.к. пользы от этого я не вижу. Есть идеи для более точного названия в 3-4 слова?
18. Cyberhawk 108 31.10.18 15:59 Сейчас в теме
(17)
1. Польза для пустых ячеек видится: при открытии ячейки показывать, Нулл это или Неопределено или ПустаяСсылка (и какого типа)
2. "Открывашка ссылок в таблицах форм"?
19. tormozit 4906 31.10.18 17:08 Сейчас в теме
(18) Управляемые формы не поддерживают значение Null. Это не инструмент разработчика, а фича для обычного пользователя. Поэтому Неопределено/ПустаяСсылка ему не интересны и будут только раздражать.
21. Cyberhawk 108 31.10.18 17:21 Сейчас в теме
(19) Мне кажется, что от того, что ничего вообще не будет происходить при нажатии на горячую клавишу, раздражения будет больше
23. tormozit 4906 31.10.18 18:04 Сейчас в теме
(21) Я пробовал. Мне так не показалось. Ты пробовал?
24. Cyberhawk 108 31.10.18 18:21 Сейчас в теме
(23) Нет, поставил мысленный эксперимент. Ведь раз пользователь нажимает что-то, то он ожидает, что это к чему-то приведет. Кому понравится, когда на осознанное нажатие горячей клавиши от программы нет в ответ никакой реакции?
Также отсутствие реакции на горячую клавишу может вызывать раздражение (из-за непонимания) в тех ячейках, где вместо ссылки выведена строка (например, представление ссылки как обход ограничений прав). Если бы твоя открывашка открывала любые значения, пользователь бы сразу понял, что там в ячейке "сидит" строка, а не ссылка. А так он остается один на один с проблемой.
25. tormozit 4906 31.10.18 19:52 Сейчас в теме
(24) Думаю ты преувеличиваешь проблему. Коллеги пользуются этой фичей и все не жаловались на такое.
20. tormozit 4906 31.10.18 17:10 Сейчас в теме
(18)
"Открывашка ссылок в таблицах форм"
в таблица могут отображаться в каждой строке свой объект (строка связана с ссылкой), который тоже может открываться, но это расширение не делает.
22. Cyberhawk 108 31.10.18 17:22 Сейчас в теме
(20) Ну тогда "Открывашка ссылок в ячейках таблиц" или "Открывашка ссылок в ячейках таблиц форм"
26. lskondrashov 01.11.18 12:04 Сейчас в теме
Есть такой способ (чисто платформенный) - становимся в ячейку, нажимаем ctrl+F (в некоторых случаях alt+F) и ctrl+shift+f4. И не нужны никакие доработки и расширения.
teploukhov; +1 Ответить
27. tormozit 4906 01.11.18 12:18 Сейчас в теме
(26) Способ через диалог поиска годный. Но поиск может быть выключен и сочетание не везде одинаковое, поэтому требуется 2-3 нажатия сочетаний клавиш, что уже не так удобно.
28. lskondrashov 01.11.18 12:40 Сейчас в теме
(27) согласен, тут по потребностям, мне не так часто требуется открывать что-то из ячеек таблицы, поэтому платформенные сочетания меня полностью устраивают
Оставьте свое сообщение