При разработке управляемых форм в 1С:Предприятии 8.3 мы часто сталкиваемся с необходимостью оптимизировать работу пользователей, в том числе путем использования горячих клавиш. Однако, когда на одной форме присутствуют несколько страниц, а на этих страницах расположены кнопки с одинаковым смыслом, которые, по логике, должны реагировать на одну и ту же горячую клавишу, возникают конфликты. Пользователь ожидает, что горячая клавиша будет выполнять действие кнопки на текущей странице, но вместо этого может происходить активация кнопки на другой странице или вовсе нежелательное поведение, например, навигация. Рассмотрим, как решить эту проблему, обеспечив контекстную работу горячих клавиш.
Мы наблюдаем, что при нажатии горячей клавиши "+" на второй странице формы нас перебрасывает на первую страницу. Давайте проанализируем потенциальные причины такого поведения:
Insert (Ins) или F9. Если наша кнопка "+" каким-то образом воспринимается как попытка активировать эту стандартную логику, платформа может применять свое поведение, которое может быть не привязано к текущей странице или фокусу.
Наша задача – явно указать платформе, какую команду выполнять в зависимости от того, какая страница в данный момент активна.
Чтобы наша горячая клавиша работала специфично для каждой страницы, мы должны явно указать, какая команда должна быть выполнена в зависимости от текущей активной страницы. Это достигается проверкой свойства ТекущаяСтраница элемента Страницы.
Рассмотрим пошаговый подход к реализации этого решения:
ДобавитьСтрокуСтраница1 и ДобавитьСтрокуСтраница2. В обработчиках этих команд мы опишем специфическую логику добавления строк для каждой страницы.
&НаКлиенте
Процедура ДобавитьСтрокуСтраница1(Команда)
// Логика добавления строки для Страницы 1
Сообщить("Добавляем строку на Странице 1");
// Пример: Здесь может быть вызов серверной функции:
// ВызватьСервернуюФункциюДляСтраницы1();
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьСтрокуСтраница2(Команда)
// Логика добавления строки для Страницы 2
Сообщить("Добавляем строку на Странице 2");
// Пример: Здесь может быть вызов серверной функции:
// ВызватьСервернуюФункциюДляСтраницы2();
КонецПроцедуры
ОбработатьГорячуюКлавишуДобавления. Именно этой команде мы и назначим нашу горячую клавишу "+". Это централизованный обработчик, который будет принимать все нажатия нашей горячей клавиши.
ОбработатьГорячуюКлавишуДобавления, найдите свойство «Сочетание клавиш» и установите для него значение +. Критически важно: убедитесь, что ни одна из кнопок на разных страницах не имеет прямого назначения на эту горячую клавишу. Горячая клавиша должна быть назначена только одной общей команде.
ОбработатьГорячуюКлавишуДобавления мы будем проверять, какая страница в данный момент активна. Для этого используем условие с проверкой Элементы.Страницы.ТекущаяСтраница. Объект Элементы.Страницы представляет собой элемент формы типа "Группа страниц".
&НаКлиенте
Процедура ОбработатьГорячуюКлавишуДобавления(Команда)
Если Элементы.Страницы.ТекущаяСтраница = Элементы.Страница1 Тогда
// Вызываем команду, предназначенную для Страницы 1
ДобавитьСтрокуСтраница1(Команда);
ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Страница2 Тогда
// Вызываем команду, предназначенную для Страницы 2
ДобавитьСтрокуСтраница2(Команда);
Иначе
// Опционально: Обработка для других страниц или предупреждение
Сообщить("Горячая клавиша '+' не определена для текущей страницы.");
КонецЕсли;
КонецПроцедуры
Обратите внимание, что мы передаем параметр Команда в вызовы специфичных команд. Это является хорошей практикой, хотя в данном конкретном случае его содержимое может и не использоваться напрямую в обработчиках ДобавитьСтрокуСтраница1 или ДобавитьСтрокуСтраница2.
ДобавитьСтрокуСтраница1, а на второй странице – аналогичную кнопку к команде ДобавитьСтрокуСтраница2. Таким образом, при нажатии на кнопку мышью, будет выполняться нужная логика для конкретной страницы. А при нажатии горячей клавиши, общая команда ОбработатьГорячуюКлавишуДобавления будет маршрутизировать вызов, обеспечивая контекстное поведение.
Этот подход позволяет нам централизованно управлять горячей клавишей и направлять ее действие в зависимости от контекста – текущей страницы формы.
Помимо основного решения, существуют другие важные моменты, которые следует учитывать при работе с горячими клавишами в 1С. Разберем их подробнее, чтобы обеспечить максимально надежную и предсказуемую работу.
Платформа 1С имеет встроенные сочетания клавиш для перемещения между страницами формы. Например, мы часто используем Ctrl + Page Down и Ctrl + Page Up для перехода на следующую и предыдущую страницу соответственно. Также, в зависимости от версии платформы или настроек, могут использоваться сочетания Ctrl + Alt + F для перехода на следующую страницу и Ctrl + Alt + B для перехода на предыдущую страницу. Если выбранная вами горячая клавиша ("+") каким-либо образом пересекается с этими системными настройками или по умолчанию вызывает перемещение фокуса, это может объяснить нежелательное поведение, которое мы изначально наблюдали. Мы всегда должны проверять, не конфликтует ли выбранная нами клавиша с уже существующими глобальными или системными горячими клавишами, чтобы избежать непредсказуемых эффектов.
Предположим, наша проблема частично связана с тем, что стандартные горячие клавиши, такие как Insert (Ins) или F9, перехватывают действие и добавляют пустую строку в табличную часть (ТЧ), даже если мы хотим реализовать свою логику. Если мы хотим, чтобы наша кнопка "+" полностью контролировала процесс добавления строки и не конкурировала со стандартным поведением, для табличного поля мы можем установить свойство «Изменять состав строк» в значение Ложь. Это позволяет отключить стандартное поведение платформы по добавлению пустой строки через Insert (или F9) и даст нам полный контроль над процессом добавления через нашу специально реализованную кнопку и связанную с ней горячую клавишу. Мы таким образом гарантируем, что наша кастомная логика будет единственным способом добавления строк.
В 1С поведение горячих клавиш может быть очень контекстно-зависимым. Например, клавиша Del (Delete) может выполнять совершенно разные действия в зависимости от того, какой элемент управления активен и имеет фокус. Она может помечать элемент на удаление в списке значений, удалять содержимое ячейки в табличном документе или даже закрывать форму. Это означает, что платформа по умолчанию может применять разные действия для одной и той же клавиши в зависимости от активного элемента или текущего положения фокуса. В нашем случае, если горячая клавиша "+" вызывает навигацию, возможно, она воспринимается как системная команда именно потому, что фокус находится на элементе, который может реагировать на эту клавишу как на команду навигации, а не как на команду конкретной кнопки на текущей странице. Понимая эту особенность, мы можем более эффективно проектировать поведение наших форм.
Мы выясним, почему горячая клавиша "+" изначально вызывает переход на первую страницу. Это может указывать на то, что событие нажатия клавиши перехватывается на более высоком уровне платформы (например, на уровне всей формы или даже всего приложения) до того, как его обработает наша кнопка или команда на второй странице. В таких случаях, когда стандартные механизмы перехватывают событие раньше, чем мы хотим, применение общей команды формы с проверкой ТекущаяСтраница является одним из наиболее надежных и эффективных способов обеспечить правильное, контекстно-зависимое поведение. Мы как бы "перехватываем" событие на уровне формы и затем уже вручную диспетчеризируем его.
Для повышения удобства пользователей и надежности работы системы, а также для минимизации будущих проблем с горячими клавишами, мы рекомендуем следующее:
Ctrl + Alt + + или Ctrl + Shift + +. Это значительно снижает вероятность непреднамеренного перехвата наших клавиш платформой.
Таким образом, проблема конфликта горячих клавиш на многостраничных формах 1С решается путем централизованной обработки нажатия клавиши через общую команду формы и динамической диспетчеризации вызовов в зависимости от текущей активной страницы. Этот подход позволяет добиться гибкости, полного контроля над поведением интерфейса и предоставить пользователям удобный и предсказуемый функционал. Мы не просто решаем конкретную проблему, но и создаем более надежный и интуитивно понятный пользовательский опыт.