Динамическая кнопка 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. Мне как-то больше легли на душу комбинации, но бухгалтерия - всё больше голосует за кнопки.

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

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

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