Как настроить горячие клавиши на разных страницах формы 1С, чтобы избежать конфликтов и обеспечить контекстное поведение?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых форм в 1С:Предприятии 8.3 мы часто сталкиваемся с необходимостью оптимизировать работу пользователей, в том числе путем использования горячих клавиш. Однако, когда на одной форме присутствуют несколько страниц, а на этих страницах расположены кнопки с одинаковым смыслом, которые, по логике, должны реагировать на одну и ту же горячую клавишу, возникают конфликты. Пользователь ожидает, что горячая клавиша будет выполнять действие кнопки на текущей странице, но вместо этого может происходить активация кнопки на другой странице или вовсе нежелательное поведение, например, навигация. Рассмотрим, как решить эту проблему, обеспечив контекстную работу горячих клавиш.

Понимание проблемы: почему горячая клавиша переключает страницы?

Мы наблюдаем, что при нажатии горячей клавиши "+" на второй странице формы нас перебрасывает на первую страницу. Давайте проанализируем потенциальные причины такого поведения:

  1. Глобальный перехват клавиши: Платформа 1С может перехватывать определенные горячие клавиши на более высоком уровне (например, на уровне формы или даже всего приложения) как системные команды. Если "+" является частью системного сочетания клавиш для навигации или смены фокуса, это объясняет нежелательный переход. Мы выясним, что платформа по умолчанию имеет горячие клавиши для навигации по страницам, и наша клавиша может с ними конфликтовать.
  2. Конфликт со стандартными командами добавления строки: Хотя автор уточняет, что добавление строки происходит по специальной логике, стоит помнить, что стандартные горячие клавиши для добавления строк в табличные части – Insert (Ins) или F9. Если наша кнопка "+" каким-то образом воспринимается как попытка активировать эту стандартную логику, платформа может применять свое поведение, которое может быть не привязано к текущей странице или фокусу.
  3. Неоднозначность привязки: Если одна и та же горячая клавиша назначена на несколько элементов напрямую, без должного контекста, платформа может выбрать элемент, который первым получил фокус, или тот, который был "назначен" раньше. В результате, кнопка на первой странице может иметь приоритет.

Наша задача – явно указать платформе, какую команду выполнять в зависимости от того, какая страница в данный момент активна.

Основное решение: контекстная обработка горячих клавиш по страницам

Чтобы наша горячая клавиша работала специфично для каждой страницы, мы должны явно указать, какая команда должна быть выполнена в зависимости от текущей активной страницы. Это достигается проверкой свойства ТекущаяСтраница элемента Страницы.

Рассмотрим пошаговый подход к реализации этого решения:

  1. Создание команд для каждой страницы: Для каждой кнопки на странице, которая должна выполнять уникальное действие по горячей клавише (в нашем случае, добавлять строки), мы создадим отдельную команду формы. Например, ДобавитьСтрокуСтраница1 и ДобавитьСтрокуСтраница2. В обработчиках этих команд мы опишем специфическую логику добавления строк для каждой страницы.
    
    &НаКлиенте
    Процедура ДобавитьСтрокуСтраница1(Команда)
        // Логика добавления строки для Страницы 1
        Сообщить("Добавляем строку на Странице 1");
        // Пример: Здесь может быть вызов серверной функции:
        // ВызватьСервернуюФункциюДляСтраницы1();
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ДобавитьСтрокуСтраница2(Команда)
        // Логика добавления строки для Страницы 2
        Сообщить("Добавляем строку на Странице 2");
        // Пример: Здесь может быть вызов серверной функции:
        // ВызватьСервернуюФункциюДляСтраницы2();
    КонецПроцедуры
    
  2. Создание общей команды для горячей клавиши: Далее мы создадим одну общую команду формы, например, ОбработатьГорячуюКлавишуДобавления. Именно этой команде мы и назначим нашу горячую клавишу "+". Это централизованный обработчик, который будет принимать все нажатия нашей горячей клавиши.
  3. Назначение горячей клавиши общей команде: В свойствах формы или непосредственно в свойствах созданной команды ОбработатьГорячуюКлавишуДобавления, найдите свойство «Сочетание клавиш» и установите для него значение +. Критически важно: убедитесь, что ни одна из кнопок на разных страницах не имеет прямого назначения на эту горячую клавишу. Горячая клавиша должна быть назначена только одной общей команде.
  4. Реализация обработчика общей команды: В обработчике команды ОбработатьГорячуюКлавишуДобавления мы будем проверять, какая страница в данный момент активна. Для этого используем условие с проверкой Элементы.Страницы.ТекущаяСтраница. Объект Элементы.Страницы представляет собой элемент формы типа "Группа страниц".
    
    &НаКлиенте
    Процедура ОбработатьГорячуюКлавишуДобавления(Команда)
        Если Элементы.Страницы.ТекущаяСтраница = Элементы.Страница1 Тогда
            // Вызываем команду, предназначенную для Страницы 1
            ДобавитьСтрокуСтраница1(Команда);
        ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.Страница2 Тогда
            // Вызываем команду, предназначенную для Страницы 2
            ДобавитьСтрокуСтраница2(Команда);
        Иначе
            // Опционально: Обработка для других страниц или предупреждение
            Сообщить("Горячая клавиша '+' не определена для текущей страницы.");
        КонецЕсли;
    КонецПроцедуры
    

    Обратите внимание, что мы передаем параметр Команда в вызовы специфичных команд. Это является хорошей практикой, хотя в данном конкретном случае его содержимое может и не использоваться напрямую в обработчиках ДобавитьСтрокуСтраница1 или ДобавитьСтрокуСтраница2.

  5. Связывание кнопок с командами: Теперь на первой странице привязываем элемент "Кнопка" (например, "Добавить строку") к команде ДобавитьСтрокуСтраница1, а на второй странице – аналогичную кнопку к команде ДобавитьСтрокуСтраница2. Таким образом, при нажатии на кнопку мышью, будет выполняться нужная логика для конкретной страницы. А при нажатии горячей клавиши, общая команда ОбработатьГорячуюКлавишуДобавления будет маршрутизировать вызов, обеспечивая контекстное поведение.

Этот подход позволяет нам централизованно управлять горячей клавишей и направлять ее действие в зависимости от контекста – текущей страницы формы.

Дополнительные аспекты и тонкости работы с горячими клавишами

Помимо основного решения, существуют другие важные моменты, которые следует учитывать при работе с горячими клавишами в 1С. Разберем их подробнее, чтобы обеспечить максимально надежную и предсказуемую работу.

  1. Стандартные горячие клавиши для навигации по страницам:

    Платформа 1С имеет встроенные сочетания клавиш для перемещения между страницами формы. Например, мы часто используем Ctrl + Page Down и Ctrl + Page Up для перехода на следующую и предыдущую страницу соответственно. Также, в зависимости от версии платформы или настроек, могут использоваться сочетания Ctrl + Alt + F для перехода на следующую страницу и Ctrl + Alt + B для перехода на предыдущую страницу. Если выбранная вами горячая клавиша ("+") каким-либо образом пересекается с этими системными настройками или по умолчанию вызывает перемещение фокуса, это может объяснить нежелательное поведение, которое мы изначально наблюдали. Мы всегда должны проверять, не конфликтует ли выбранная нами клавиша с уже существующими глобальными или системными горячими клавишами, чтобы избежать непредсказуемых эффектов.

  2. Отключение стандартного поведения добавления строк:

    Предположим, наша проблема частично связана с тем, что стандартные горячие клавиши, такие как Insert (Ins) или F9, перехватывают действие и добавляют пустую строку в табличную часть (ТЧ), даже если мы хотим реализовать свою логику. Если мы хотим, чтобы наша кнопка "+" полностью контролировала процесс добавления строки и не конкурировала со стандартным поведением, для табличного поля мы можем установить свойство «Изменять состав строк» в значение Ложь. Это позволяет отключить стандартное поведение платформы по добавлению пустой строки через Insert (или F9) и даст нам полный контроль над процессом добавления через нашу специально реализованную кнопку и связанную с ней горячую клавишу. Мы таким образом гарантируем, что наша кастомная логика будет единственным способом добавления строк.

  3. Контекстная зависимость горячих клавиш:

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

  4. Последовательность обработки событий:

    Мы выясним, почему горячая клавиша "+" изначально вызывает переход на первую страницу. Это может указывать на то, что событие нажатия клавиши перехватывается на более высоком уровне платформы (например, на уровне всей формы или даже всего приложения) до того, как его обработает наша кнопка или команда на второй странице. В таких случаях, когда стандартные механизмы перехватывают событие раньше, чем мы хотим, применение общей команды формы с проверкой ТекущаяСтраница является одним из наиболее надежных и эффективных способов обеспечить правильное, контекстно-зависимое поведение. Мы как бы "перехватываем" событие на уровне формы и затем уже вручную диспетчеризируем его.

Рекомендации по оптимизации и удобству использования

Для повышения удобства пользователей и надежности работы системы, а также для минимизации будущих проблем с горячими клавишами, мы рекомендуем следующее:

  1. Выбирайте неочевидные сочетания горячих клавиш: Мы стараемся использовать сочетания клавиш, которые менее вероятно будут конфликтовать со стандартными системными или прикладными командами 1С. Например, вместо простого "+" можно использовать более сложные, но менее конфликтные сочетания, такие как Ctrl + Alt + + или Ctrl + Shift + +. Это значительно снижает вероятность непреднамеренного перехвата наших клавиш платформой.
  2. Информируйте пользователей: Мы обязательно добавляем подсказки к кнопкам (в свойстве "Подсказка") или в общую справку формы, чтобы пользователи знали, какая горячая клавиша назначена для данного действия и как она работает. Это помогает пользователям быстро освоиться с функционалом и предотвращает недопонимания.
  3. Тщательно тестируйте: После реализации горячих клавиш, мы всегда проводим тщательное тестирование на всех страницах формы и с различными элементами в фокусе. Мы проверяем, как горячие клавиши ведут себя, когда фокус находится в табличной части, в поле ввода, на самой кнопке или на других элементах. Это помогает нам убедиться в корректности их работы и выявить скрытые конфликты.

Таким образом, проблема конфликта горячих клавиш на многостраничных формах 1С решается путем централизованной обработки нажатия клавиши через общую команду формы и динамической диспетчеризации вызовов в зависимости от текущей активной страницы. Этот подход позволяет добиться гибкости, полного контроля над поведением интерфейса и предоставить пользователям удобный и предсказуемый функционал. Мы не просто решаем конкретную проблему, но и создаем более надежный и интуитивно понятный пользовательский опыт.

← На главную