Динамическая кнопка VS Комбинация клавиш

14.10.22

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

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

Действия в рамках программы 1С могут выполняться по нажатию на кнопку или нажатием горячей комбинации клавиш на клавиатуре.

Будут рассказывать на примере расширения Поддержка пользователей [Alt+S] (подключаемое расширение)

 

Создаем "Своё" расширение

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

 

Комбинация клавиш

 

 

  • В коде модуля команды работаем с методом АктивноеОкно(), где в зависимости от формы получаем координаты объекта: Ссылка или НавигационнаяСсылка. Далее уже работаем с этим полученным материалом (в данном примере Поддержка пользователей [Alt+S] (подключаемое расширение) (infostart.ru) открывается форма журнала обращений, привязанная к объекту, из которого произошел вызов, а например в публикации Доп. панель Alt+Z (infostart.ru) открывает панель с обработками объекта).

 

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	пАктивноеОкно = АктивноеОкно();
	Если пАктивноеОкно = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	флЕстьОшибки = Ложь; 
	
	Форма = Неопределено;
	Источник = Неопределено;
	НавигационнаяСсылка = Неопределено;
	
	Попытка
		Форма = пАктивноеОкно.Содержимое[0];  
	Исключение
		флЕстьОшибки = Истина;
	КонецПопытки;   
	
	Попытка
		пИмяФормы = пАктивноеОкно.Содержимое[0].ИмяФормы; 
		Если Найти(пИмяФормы, "Форма.ФормаДокумента") > 0 Тогда
			Источник = Форма.Объект.Ссылка;
		ИначеЕсли Найти(пИмяФормы, "Форма.ФормаЭлемента") > 0 Тогда
			Если Найти(пИмяФормы, "Справочник.ФизическиеЛица") > 0 Тогда 
				Источник = Форма.ФизическоеЛицо.Ссылка;
			ИначеЕсли Найти(пИмяФормы, "Справочник.Сотрудники") > 0 Тогда
				Источник = Форма.Сотрудник.Ссылка;
			Иначе
				Источник = Форма.Объект.Ссылка;	
			КонецЕсли;
		ИначеЕсли Найти(пИмяФормы, "Форма.ФормаОтчета") > 0 Тогда
			НавигационнаяСсылка = Форма.НавигационнаяСсылка;      
		Иначе
			Попытка
				Если ТипЗнч(Форма.ТекущийЭлемент) = Тип("ТаблицаФормы") Тогда
					Источник = Форма.ТекущийЭлемент;
				КонецЕсли;		
			Исключение
			КонецПопытки;	
		КонецЕсли;	
	Исключение
	КонецПопытки;
	
	Если флЕстьОшибки Тогда
		ПоказатьПредупреждение(Неопределено, "Не удается открыть Поддержку пользователей (Alt+S) для текущего объекта", 5, "ВНИМАНИЕ");
	Иначе
		suplite_Клиент.ОткрытьЖурналОбращений(Форма, Источник, НавигационнаяСсылка);     
	КонецЕсли;
	
КонецПроцедуры

Примечание: В формах объектов ссылка указана в основном объекте формы, в динамических списках объектов ссылка равна значению ТекущегоЭлемента. Отчеты, обработки, регистры это не ссылочные типы, поэтому чтобы как-то их поймать работаем с их навигационной ссылкой, методами: ПолучитьНавигационнуюСсылку(), ПолучитьПредставленияНавигационныхСсылок().

 

Динамическая кнопка

  • Перехватываем в расширение события ПриСозданииНаСервере() из общих модулей, входящих во все типовые решения 1С: здесь перехвачены УправлениеСвойствами, ВерсионированиеОбъектов - добавляем туда вызов своего метода, который будет создавать кнопку на форме. Перехватывать можно любые модули: ПодключаемыеКоманды.ПриСозданииНаСервере(), ИнтеграцияС1СДокументооборот.ПриСозданииНаСервере(), СобытияФорм.ПриСозданииНаСервере(), ВерсионированиеОбъектов.ПриСозданииНаСервере(),  УправлениеСвойствами.ПриСозданииНаСервере() и т.д. Конкретно в расширении на котором строю пример были перехвачены те модули, т.к. они встречались в формах (когда я его делал, а это было давно, например, вызова ПодключаемыеКоманды.ПриСозданииНаСервере() в типовых формах еще не было)

 

 

Код вывода кнопки в командную панель формы suplite_Сервер.ПриСозданииНаСервере(Форма)

Процедура ПриСозданииНаСервере(Форма) Экспорт
	
	Попытка
		Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда
			
			Если РольДоступна("ПолныеПрава") 
				ИЛИ РольДоступна("suplite_Чтение")
				ИЛИ РольДоступна("suplite_ДобавлениеИзменение")
				ИЛИ РольДоступна("suplite_Администрирование") Тогда
				
				Если Форма.Элементы.Найти("suplite_Открыть") = Неопределено Тогда
					
					ЭлементРодитель = Форма.Элементы.ФормаКоманднаяПанель;
					
					Если СтрЧислоВхождений(Форма.ИмяФормы, "ФормаСписка") <> 0 И //Для Списков
						Форма.Элементы.Найти("ГруппаГлобальныеКоманды") <> Неопределено Тогда							
						ЭлементРодитель = Форма.Элементы.ГруппаГлобальныеКоманды;
					ИначеЕсли СтрЧислоВхождений(Форма.ИмяФормы, "ФормаОтчета") <> 0 И //Для отчетов
						Форма.Элементы.Найти("ОсновнаяКоманднаяПанель") <> Неопределено Тогда							
						ЭлементРодитель = Форма.Элементы.ОсновнаяКоманднаяПанель;
					КонецЕсли;
					
					// Создадим команду
					Команда	= Форма.Команды.Добавить("suplite_Открыть");
					Команда.Действие	= "Подключаемый_ВыполнитьКоманду";
					
					// Создадим кнопку и привяжем к ней команду
					Кнопка = Форма.Элементы.Добавить("suplite_Открыть", Тип("КнопкаФормы"), ЭлементРодитель);
					Кнопка.Заголовок	= "Поддержка пользователей [Alt+S]";
					Кнопка.ИмяКоманды	= "suplite_Открыть";
					Кнопка.Картинка = БиблиотекаКартинок.suplite_Картинка;
					
				КонецЕсли;    
			КонецЕсли;  
		КонецЕсли; 
		
	Исключение
	КонецПопытки; 	
	
КонецПроцедуры
  • Чтобы кнопка работала, в модуле формы должна быть процедура Подключаемый_ВыполнитьКоманду(), её вставляют почти во все типовые формы объектов и списков. Её также нужно перехватить в расширение из ОбщийМодуль.ПодключаемыеКомандыКлиент и по имени динамической кнопки (тут "suplite_Открыть") назначить своё действие.

 

 

Что в результате имеем

И нажатием комбинации клавиш Alt+S на клавиатуре, и нажатием на кнопку командной панели формы выполняется одно и то же действие. Здесь Поддержка пользователей [Alt+S] (подключаемое расширение) (infostart.ru) создается обращение в поддержку, а здесь Доп. панель Alt+Z (infostart.ru) открывается панелька с дополнительными командами.

 

 

Плюсы и минусы

Свойство Динамическая кнопка Комбинация клавиш
Возможность вызова Вызов доступен в формах документов и справочников, где прописаны глобальные обработчики при создании формы и подключаемые процедуры, которые можно переопределить. Вызов доступен во всех формах без исключения (документы, справочники, регистры, отчеты, обработки, формы списков и т.д.)
Удобство вызова Привычный вид для пользователей - Кнопка в командной панели формы Не видна, необходимо помнить комбинацию
Реализация вызова Требуется перехват событий и переопределение обработчиков Просто, минимум кода, отслеживать уникальность комбинации клавиш 

 

P.S. Мне как-то больше легли на душу комбинации, но бухгалтерия - всё больше голосует за кнопки.

Есть, кстати, такая песенка «Бухгалтер» у группы "Комбинация", рассказывающая злободневную историю о маленьком человеке — простом бухгалтере.

Почему-то вспомнилось. Всем добра.

 
 Другие публикации автора

 

См. также.

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

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

2400 руб.

29.06.2020    17331    23    4    

37

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

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

27.12.2023    11923    780    elcoan    47    

109

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

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

2 стартмани

10.04.2023    10389    158    acces969    31    

120

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16986    152    sapervodichka    112    

133

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

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

1 стартмани

05.07.2022    4326    kalyaka    4    

31

ServiceDesk, HelpDesk Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Расширение, подключаемое к базе 1С для решения задач поддержки пользователей. Позволяет быстро (по кнопке или комбинации клавиш Alt+S), не выходя из программы 1С из любой формы, создать обращение к консультантам и программистам со скринами, файлами, в привязке к проблемному объекту (документу, справочнику, отчету, обработке и т.п.). Вести переписку по обращениям, отслеживать их выполнение с трудозатратами и уведомлять участников через механизмы: Telegram, Обсуждения 1С и Электронную почту. Код открыт и расширение может развиваться и быть доработано под индивидуальные потребности.

9 стартмани

25.03.2022    15935    147    sapervodichka    34    

150
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ybatiaev 58 08.08.22 22:55 Сейчас в теме
Добрый день! Идея хорошая.
На мой взгляд, правда, направление более правильное - голосовое управление. На инфостарте уже было решение 1С+python. Один минус - потоковый стрим на клиентсерверной части не поддерживался при терминальном доступе.
Вот это бы конкретно развить )))
KRIHA; sapervodichka; NiGMa; +3 Ответить
2. quazare 3706 09.08.22 04:47 Сейчас в теме
продолжаешь развивать тему комбинаций клавиш? идея хорошая!
3. sapervodichka 6842 09.08.22 09:10 Сейчас в теме
(2) угумс, всё новое забытое старое
Прикрепленные файлы:
Lemmonbri; +1 Ответить
4. vld1973 86 09.08.22 09:53 Сейчас в теме
Спасибо за интересную идею. Плюсую.
5. Segate 234 09.08.22 10:06 Сейчас в теме
А зачем это в управлениях свойствами?
Раз уж мы используем БСП - используйте подключаемые команды, как положено
8. sapervodichka 6842 09.08.22 12:19 Сейчас в теме
(5) В разных конфах в модулях форм внутри события ПриСозданииНаСервере полно разных вызовов [ОбщийМодуль].ПриСозданииНаСервере(...) которые можно перехватить, тут УправлениеСвойствами.ПриСозданииНаСервере перехвачем с расчетом на конфу ЗУП был.
ПодключаемыеКоманды.ПриСозданииНаСервере()
ИнтеграцияС1СДокументооборот.ПриСозданииНаСервере()
СобытияФорм.ПриСозданииНаСервере()
ВерсионированиеОбъектов.ПриСозданииНаСервере()
УправлениеСвойствами.ПриСозданииНаСервере()
и т.д.

где-то есть где-то нет того или иного вызова, поэтому можно перехватить несколько модулей, в самом выводе кнопки проверяется ее наличие на форме, если уже выведена, то повторно не выводится
adhocprog; +1 Ответить
16. PLAstic 295 09.08.22 17:49 Сейчас в теме
(8) Омагад... А подключить нужные объекты к подсистеме подключаемых команд никак было? И тогда бы завязался на неё только. Всё равно у тебя есть расширение и внести нужные модификации было несложно. А так наколхозил в типовых подсистемах БСП. Ну как бы да, задачу решил, но какой ценой? У программиста должны быть принципы.
18. sapervodichka 6842 09.08.22 18:15 Сейчас в теме
(16) у меня большое количество баз, а решение должно быть универсальным, автономным, простым, не требующим доработок под любое типовое решение 1С. Сами подключаемые обработки о которых ты пишешь, можно использовать для заполнения по остаткам на складе, например, документа Перемещения. Я и их часто делаю, но тут не про них.
6. PLAstic 295 09.08.22 10:09 Сейчас в теме
А чем это лучше обычных подключаемых команд? В итоге ты и подключаешься к его событиям.
*пока читал, выше написали то же самое
9. sapervodichka 6842 09.08.22 12:22 Сейчас в теме
(6) ПодключаемыеКоманды подразумевают создание внешней обработки заполнения, а тут как бы в расширении не одна обработка а заложены целые подсистемы (наборы обработок, какие-то документы, справочники регистры и т.д.) цеплять их на внешнюю обработку мне было не удобно
adhocprog; +1 1 Ответить
15. PLAstic 295 09.08.22 17:46 Сейчас в теме
(9) Велкам, делай любую архитектуру в расширении, но подключить к формам объектов ты мог это и нормальным образом, предусмотренным подсистемой. И в пользу внешней обработки говорит в т.ч. и модифицируемость кода на бою, что недостижимо даже с расширением (динамить базу всё равно придётся).
17. sapervodichka 6842 09.08.22 18:12 Сейчас в теме
(15) тут как бы публикация про сравнение кнопки и комбинации, а не про конкретное расширение.

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

В чем профит твоего напора на решение не понимаю.
У меня у самого десятки разных баз (а реально сотни), и то решение скачали десятки людей.
Всем зашло - это нормально один раз поставить расширение.
Внешняя обработка в довесок к расширению - не пришей собаке хвост.
suepifanov; +1 Ответить
21. dhurricane 10.08.22 12:49 Сейчас в теме
(17) На всякий случай переформулирую исходный вопрос, как я его понял. Почему Вы не добавили свой вид подключаемых команд? "Целые подсистемы" же здесь не преграда.
23. sapervodichka 6842 10.08.22 13:25 Сейчас в теме
(21) Ден, пожалуйста, напиши в чем профит от этого варианта по сравнению с текущим (это быстрее, это удобнее, это морально правильнее, зачем мне это переделать)?
Сразу поблагодарю (читал твои комменты ранее) ты по крайней мере примеры скидываешь, может твой вариант и лучше будет. Просто обдумывать за кого-то его идею я не стану, нет времени, работа сам понимаешь. Если напишут пример и он будет лучше, то я только за.
24. dhurricane 10.08.22 14:07 Сейчас в теме
(23) Это морально правильнее. :-) Ну на мой вкус. Не могу объяснить, нет объективных аргументов.
25. PLAstic 295 10.08.22 16:58 Сейчас в теме
(24) У меня есть. Это ТСО, включающее в себя лёгкость модификации и обслуживания. Приходит новый человек, который знает БСП. Он знает про подсистему подключаемых команд и мог бы легко выполнить задачу по модификации этой добавленной функциональности, но лезет разбираться в код и видит, что нет такой подключаемой команды, но есть какое-то уникальное решение с 10ю вызовами при открытии формы, из которых отрабатывает только первый, а остальные проверяют наличие результата.
Это выливается в кучу времени на изучение уникальных механизмов вместо известных большинству БСПшных. Это вопросы "а зачем было сделано так?" и т.п.
В результате работодателю это обойдётся дороже, чем если бы было реализовано с использованием типовых методов.
26. PLAstic 295 10.08.22 17:01 Сейчас в теме
(24) И добавлю в финале мой любимый вопрос: что ты положишь в копилку своего опыта?
В данном случае автор пилит какой-то свой механизм и благодаря тому, что ему разрешают это делать, он это делает. Но вот пришла смена конторы и в новой ему говорят "не, коллега, мы тут колхоз не приветствуем, садись и делай по-нормальному". А у него нет опыта в копилке, нет знаний механизмов БСП, нет в принципе привычки грызть вопрос "а как можно было бы правильнее сделать".

зыЖ Допускаю, что опыт/знания есть, но видимо нет принципов, о которых я писал ранее. Отсутствие принципов допускает написание кода любого уровня корректности.
27. sapervodichka 6842 10.08.22 20:57 Сейчас в теме
(26) зачем слова, скидывай свой код сюда
28. sapervodichka 6842 10.08.22 23:49 Сейчас в теме
(27) можно с легкостью переделать на 1 перехват
ПодключаемыеКоманды.ПриСозданииНаСервере()

Вместо 2 перехватов

ВерсионированиеОбъектов.ПриСозданииНаСервере()
УправлениеСвойствами.ПриСозданииНаСервере()

- когда я то расширение делал, вызова ПодключаемыеКоманды.ПриСозданииНаСервере() не было в формах, а в разных формах было то ВерсионированиеОбъектов то УправлениеСвойствами.

Вообщем, Леонид, проблемы тут нет, и надумывать её не нужно.
Там лишь 1 процедура вызывается. А у программистов есть мозг.

Давай расходиться, либо присылай свой код и обработку, я посмотрю.

Если он лучше и удобнее, то я возьму на вооружение и буду тебе благодарен.
В любом случае спасибо за критику.
Прикрепленные файлы:
fatman78; PLAstic; +2 Ответить
29. PLAstic 295 11.08.22 10:07 Сейчас в теме
(27) Да я и не сходился. Если есть такой монстр и он работает, то тут речь можно вести только об оптимизации, чтобы прям красиво было. Это как 5 и 5+ в школе. У меня нет каких-то интеллектуальных доработок на эту тему. Недавно сделал вызов клиентского метода (открытие формы) через подключаемые команды, но и там всё по инструкции, ничего интересного.
Вангую, скоро ты увидишь массу моего кода, но это в личку. :)
7. user654641_yaga_m 13 09.08.22 11:04 Сейчас в теме
10. bulpi 215 09.08.22 14:16 Сейчас в теме
Плюсанул, но есть замечание :
код процедуры ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
написан отвратительно. Зачем там столько Попытка - Исключение ?
Я бы постыдился такое выкладывать.
zhuntovda; +1 Ответить
14. sapervodichka 6842 09.08.22 14:59 Сейчас в теме
(10) Я не могу всё предупредить по разным формам в 1С (они далеко не все стандартные), где-то есть вероятность ошибки. Чтобы в рабочей базе ошибка не помешала пользователю дальше продолжить работать на некоторых моментах поставил попытка исключение. На практике исключения не возникали, но сам оператор оставил (я перестраховщик).
11. Eralashka 09.08.22 14:31 Сейчас в теме
Найти(пИмяФормы, "Справочник.Сотрудники") > 0
какой то убогий код немного

Попробуй покурить Метаданные.Содержит()
PLAstic; zhuntovda; +2 1 Ответить
13. sapervodichka 6842 09.08.22 14:54 Сейчас в теме
(11) я не курю (>_<) напиши какой параметр передать туда?
19. sapervodichka 6842 09.08.22 18:19 Сейчас в теме
(13) всем кто лайкает предложение использовать Метаданные.Содержит() для начала напишите, что туда передать )))
20. dhurricane 10.08.22 12:45 Сейчас в теме
(19) Может речь была впринципе об использовании метаданных?
МетаданныеФормы = Метаданные.НайтиПоПолномуИмени(пИмяФормы);
ЭтоСправочникСотрудников = (МетаданныеФормы.Родитель() = Метеданные.Справочники.Сотрудники);
22. sapervodichka 6842 10.08.22 13:18 Сейчас в теме
(20) пусть использую, что хотят, дальше все равно проверять имя формы и основной объект в форме сотрудника (он там в отличие от стандартного называется Сотрудник, вместо Объект) (тебе в любом случае спасибо)
34. fatman78 17 13.12.22 20:53 Сейчас в теме
(22)Согласен с Дмитрием, тоже нахлебался с этими именами форм (особенно форм списков) - каких только вариантов названий не встретишь, программисты в типовых конфигурациях сами пренебрегают своими же стандартами.
Еще одна боль - отсутствие удобной штатной возможности программно определить "основной реквизит" на форме, встречал в типовых реализацию даже с применением спец. реквизита что-то типа "ИмяОсновногоРеквизита" строкового типа, который и хранил имя "основного реквизита" формы.
30. PLAstic 295 11.08.22 10:12 Сейчас в теме
(20) В БСП есть масса методов для работы с метаданными (ОМ ОбщегоНазначения) и в т.ч. для многих случаев можно использовать не сами метаданные, а ИдентификаторыОбъектовМетаданных - это удобнее и кодом они тоже сильно обвязаны.
31. sapervodichka 6842 11.08.22 10:34 Сейчас в теме
(30) Леонид, если они тут применимы =))) напиши пример, что вместо Найти(пИмяФормы, "Справочник.Сотрудники") > 0 использовать из БСП, чтобы понять что основной объект формы не Форма.Объект, а Форма.Сотрудник?
32. PLAstic 295 11.08.22 12:40 Сейчас в теме
(31) Ну, в конкретном случае я бы поставил 5 за целеустремлённость и 2 за грамотность реализации.
В механизме подключаемых команд тебе передаётся множество параметров, которые помогут ответить, откуда идёт вызов и к кому его хотели применить. Например, во внешнюю обработку заполнения с типом ОткрытиеФормы передаётся как сама исходная форма, так и объект(ы). Поэтому тут ничего выдумывать не надо, делаем по инструкции.
Ты сам признал, что есть вариант подключить нужные объекты к подсистеме "Подключаемые команды". Сделай это и у тебя откроется возможность реализовать этот механизм без колхоза.

На всякий случай ссылка на описание подсистемы.
33. sapervodichka 6842 11.08.22 13:55 Сейчас в теме
(32) спасибо, я ранее читал, но кому-нибудь обязательно пригодятся эти ссылки
Оставьте свое сообщение