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

12.04.23

Разработка - Работа с интерфейсом

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Открывашка ячеек таблиц:
.cfe 6,75Kb
17
17
1 SM
Скачать Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

Лицензия - BSD (бесплатно для коммерческого использования)

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

См. также

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    17634    24    6    

38

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    5384    smielka    37    

95

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    12423    788    elcoan    47    

110

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    10638    158    acces969    31    

120

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    4589    kalyaka    6    

32

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

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

6000 руб.

18.01.2022    9368    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 95 28.10.18 09:45 Сейчас в теме
А почему не сделать серверный вызов и получить путь к данным элемента формы?
2. json 3336 28.10.18 10:37 Сейчас в теме
(1) из клиентского кода, расположенного вне самой формы, нельзя обратиться к контексту этой формы на сервере.
Другими словами, чтобы выполнить то, что вы предлагаете, серверный код должен располагаться в модуле самой формы
TreeDogNight; triviumfan; +2 Ответить
3. MVK80 28.10.18 11:35 Сейчас в теме
ТекущаяФорма = ТекущееОкно.ПолучитьСодержимое();
ПолучитьСодержимое() - не нашел в синтаксис-помощнике (платформы 8.3.13 и 8.3.14). Это тоже что-то недокументированное для поддержки старых версий (раньше было, сейчас нет)?
4. tormozit 7194 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 135 29.10.18 10:52 Сейчас в теме
Вместо
Попытка
			ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;

можно сделать без попытки:
	    ИмяПоляДляЗонда = ПроверяемоеИмя;
		СтароеЗначение = "" + Новый УникальныйИдентификатор;
		Зонд = Новый Структура(ИмяПоляДляЗонда, СтароеЗначение);
		ЗаполнитьЗначенияСвойств(Зонд, ДанныеСтроки);
		НовоеЗначение = Зонд[ИмяПоляДляЗонда];
		Если НовоеЗначение <> СтароеЗначение Тогда
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;
		КонецЕсли;
Показать
tormozit; +1 Ответить
8. tormozit 7194 29.10.18 21:56 Сейчас в теме
(7) Согласен, что без попытки будет красивее. Также голый вариант без попытки упрощает отладку в случае использования фичи "Остановка по ошибке". Но в представленном мной коде в целом есть и другая попытка, где такой прием не поможет. Поэтому остается только увеличение красоты. Однако на другой чаше весов лежит лаконичность, т.к. публикация не про правильный код, а про удобную возможность для пользователя. Как мне кажется они в данном случае чащи весов почти уравновешены.
9. Cyberhawk 135 30.10.18 08:51 Сейчас в теме
(8) Не спорю: с попыткой код более краток и, наверное, даже более понятен разработчику (особенно не умудренному опытом).
А какой попытки нельзя избежать - там, где вызывается метод УникальныйИдентификатор? А зачем оно надо?
10. tormozit 7194 30.10.18 09:00 Сейчас в теме
(9) Вызов метода УникальныйИдентификатор в попытке нужен, чтобы проверить, что значение является ссылкой.
12. Cyberhawk 135 31.10.18 13:02 Сейчас в теме
(10) А что плохого будет, если это не проверять?
33. Патриот 453 18.10.21 19:20 Сейчас в теме
(10) конечно уже пару лет прошло, но вдруг пригодится в этой или других наработках)
	ТипЗначения = Тип(Значение);
	//Два способа проверить, что значения является ссылкой:
	
	//1. сделать через перебор вида
	Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения);
	//только вначале надо сделать проверку на неопределно, т.к. есть косяк вида
	//Справочники.ТипВсеСсылки().СодержитТип(тип("неопределено")) = истина
	
	//2. также можно завязаться на
	Метаданные.НайтиПоТипу(ТипЗначения);
Показать
34. tormozit 7194 18.10.21 23:08 Сейчас в теме
(33) Нужны не все типы ссылок, а только тех, которые имеют объекты. Поэтому твои способы не подойдут.
35. Патриот 453 19.10.21 07:08 Сейчас в теме
(34) определив, что значение является ссылкой, можно без попытки выполнить твой код, получения уникального идентификатора.
Но очевидно, перед этим надо исключить перечисления, у которых нет объекта
твой код

Попытка
Пустышка = ЗначениеПоля.УникальныйИдентификатор();
Исключение
Возврат Неопределено;
КонецПопытки;


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

Показать
36. tormozit 7194 19.10.21 08:53 Сейчас в теме
(35) Ну и зачем этим заниматься? Зачем писать в 10 раз больше кода, который к тому же работает в 10 раз дольше?
37. Патриот 453 19.10.21 09:58 Сейчас в теме
(36) я не призывал исправлять данный код. Я увидел твой коммент
 Согласен, что без попытки будет красивее. Также голый вариант без попытки упрощает отладку в случае использования фичи "Остановка по ошибке". Но в представленном мной коде в целом есть и другая попытка, где такой прием не поможет.
что нельзя избавиться здесь от попытки и написал, как это можно сделать, вдруг оно пригодится.
38. tormozit 7194 19.10.21 10:35 Сейчас в теме
(37) Естественно я имел ввиду обращение к другому свойству другой переменной. По сути я писал про общий случай - далеко не всегда оправдано избавляться от попытки.
11. asg.aleks 68 31.10.18 12:22 Сейчас в теме
(7)
ДанныеСтроки - это всегда ДанныеФормыЭлементКоллекции, значит можно еще проще:

		Если ДанныеСтроки.Свойство(ПроверяемоеИмя) Тогда
			ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
			ПутьКДанным = ПроверяемоеИмя;
			Прервать;
		КонецЕсли; 
TreeDogNight; SlavaKron; tormozit; +3 Ответить
13. tormozit 7194 31.10.18 13:18 Сейчас в теме
(11) Откроется значение не ссылочного типа в маленьком окошке по центру экрана с блокированием других окон.
14. asg.aleks 68 31.10.18 14:49 Сейчас в теме
(13)
Это, наверное, все же к (12)... Или я чего-то не понял.
15. tormozit 7194 31.10.18 14:50 Сейчас в теме
(14) Да. Но исправить уже не могу.
16. Cyberhawk 135 31.10.18 15:14 Сейчас в теме
(13) Ну. "Открывашка ячеек таблиц" вроде это и должна делать, не?
17. tormozit 7194 31.10.18 15:28 Сейчас в теме
(16) Лично меня открытие других типов раздражает, т.к. пользы от этого я не вижу. Есть идеи для более точного названия в 3-4 слова?
18. Cyberhawk 135 31.10.18 15:59 Сейчас в теме
(17)
1. Польза для пустых ячеек видится: при открытии ячейки показывать, Нулл это или Неопределено или ПустаяСсылка (и какого типа)
2. "Открывашка ссылок в таблицах форм"?
19. tormozit 7194 31.10.18 17:08 Сейчас в теме
(18) Управляемые формы не поддерживают значение Null. Это не инструмент разработчика, а фича для обычного пользователя. Поэтому Неопределено/ПустаяСсылка ему не интересны и будут только раздражать.
21. Cyberhawk 135 31.10.18 17:21 Сейчас в теме
(19) Мне кажется, что от того, что ничего вообще не будет происходить при нажатии на горячую клавишу, раздражения будет больше
23. tormozit 7194 31.10.18 18:04 Сейчас в теме
(21) Я пробовал. Мне так не показалось. Ты пробовал?
24. Cyberhawk 135 31.10.18 18:21 Сейчас в теме
(23) Нет, поставил мысленный эксперимент. Ведь раз пользователь нажимает что-то, то он ожидает, что это к чему-то приведет. Кому понравится, когда на осознанное нажатие горячей клавиши от программы нет в ответ никакой реакции?
Также отсутствие реакции на горячую клавишу может вызывать раздражение (из-за непонимания) в тех ячейках, где вместо ссылки выведена строка (например, представление ссылки как обход ограничений прав). Если бы твоя открывашка открывала любые значения, пользователь бы сразу понял, что там в ячейке "сидит" строка, а не ссылка. А так он остается один на один с проблемой.
25. tormozit 7194 31.10.18 19:52 Сейчас в теме
(24) Думаю ты преувеличиваешь проблему. Коллеги пользуются этой фичей и все не жаловались на такое.
20. tormozit 7194 31.10.18 17:10 Сейчас в теме
(18)
"Открывашка ссылок в таблицах форм"
в таблица могут отображаться в каждой строке свой объект (строка связана с ссылкой), который тоже может открываться, но это расширение не делает.
22. Cyberhawk 135 31.10.18 17:22 Сейчас в теме
(20) Ну тогда "Открывашка ссылок в ячейках таблиц" или "Открывашка ссылок в ячейках таблиц форм"
26. saandreev 01.11.18 12:04 Сейчас в теме
Есть такой способ (чисто платформенный) - становимся в ячейку, нажимаем ctrl+F (в некоторых случаях alt+F) и ctrl+shift+f4. И не нужны никакие доработки и расширения.
Риник; teploukhov; +2 Ответить
27. tormozit 7194 01.11.18 12:18 Сейчас в теме
(26) Способ через диалог поиска годный. Но поиск может быть выключен и сочетание не везде одинаковое, поэтому требуется 2-3 нажатия сочетаний клавиш, что уже не так удобно.
TreeDogNight; +1 Ответить
28. saandreev 01.11.18 12:40 Сейчас в теме
(27) согласен, тут по потребностям, мне не так часто требуется открывать что-то из ячеек таблицы, поэтому платформенные сочетания меня полностью устраивают
29. TreeDogNight 22 24.10.19 07:11 Сейчас в теме
Очень полезная штуковина! А есть какие-нибудь варианты, чтобы нечто подобное реализовать в обычных формах?
30. tormozit 7194 24.10.19 07:15 Сейчас в теме
(29) Универсально - нет. Придется искать способ добавлять кнопку в каждую форму.
TreeDogNight; +1 Ответить
31. TreeDogNight 22 24.10.19 07:32 Сейчас в теме
(30) Это очень прискорбно...
39. tormozit 7194 16.04.23 17:46 Сейчас в теме
(31) С использованием подсистемы "Инструменты разработчика Tormozit" это стало частично возможно
https://www.hostedredmine.com/issues/956695
https://www.hostedredmine.com/issues/956961
32. Evil Beaver 8171 08.10.21 11:18 Сейчас в теме
Оставьте свое сообщение