Как реализовать скрытую команду на управляемой форме в 1С по сочетанию клавиш

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

При разработке прикладных решений на платформе 1С:Предприятие 8.3 (Управляемые формы) программисты нередко сталкиваются с необходимостью создания «секретных» или служебных команд. Это могут быть панели отладки, функции быстрого заполнения тестовыми данными, запуск административных процедур или вывод сервисной информации. Идеальный сценарий для таких функций — вызов исключительно по сочетанию горячих клавиш (например, Ctrl+Alt+D или Shift+F12), при этом физическая кнопка на форме должна быть полностью скрыта от глаз обычного пользователя.

Однако стандартный механизм платформы накладывает жесткое ограничение: если у элемента формы (кнопки) свойство Видимость установлено в значение Ложь, платформа полностью исключает этот элемент из отрисовки на клиенте. Как результат, назначенное сочетание клавиш перестает регистрироваться и обрабатываться. В этой статье мы подробно разберем, почему так происходит, проанализируем поведение платформы и рассмотрим четыре проверенных альтернативных способа обхода этого ограничения.

Выясняем причину: почему простая невидимость ломает горячие клавиши?

Для начала разберем внутреннюю логику работы управляемого клиента 1С. Платформа стремится оптимизировать сетевой трафик и потребление памяти на стороне клиента. Когда мы устанавливаем свойство Видимость = Ложь для кнопки или всей командной панели, сервер 1С при формировании структуры формы для передачи клиенту попросту игнорирует эти элементы. На стороне веб-клиента или тонкого клиента их физически не существует в дереве элементов (DOM-модели или системном пуле окон).

Поскольку элемента нет на клиенте, операционная система и браузер не могут зарегистрировать глобальный перехватчик клавиатуры для конкретной комбинации клавиш. Следовательно, привычный путь скрытия кнопки через свойство Видимость для решения нашей задачи не подходит. Нам потребуются более гибкие и изощренные обходные пути.


Решение 1. Размещение команды в контекстном меню (Рекомендация сообщества)

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

Проанализируем пошаговый алгоритм реализации этого метода:

  1. Создадим обычную команду управляемой формы (например, СлужебныйРежим) и назначим ей требуемое сочетание клавиш в свойстве СочетаниеКлавиш.
  2. Перейдем к дереву элементов нашей формы и найдем элемент, который всегда присутствует на экране и активен (например, основная табличная часть или декоративное поле).
  3. Откроем контекстное меню выбранного элемента. Если контекстного меню нет, добавим его через правую кнопку мыши — Добавить контекстное меню.
  4. Перетащим нашу команду формы внутрь этого контекстного меню в виде кнопки.
  5. В свойствах самой кнопки в контекстном меню оставим Видимость = Истина.

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


Решение 2. Создание "Стелс-элемента" (Визуальная маскировка кнопки)

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

Разберем по шагам, как настроить такой «стелс-элемент»:

  1. Добавим нашу команду на форму в виде обычной кнопки. Разместим её в самом низу формы или внутри неброской группы.
  2. Установим свойство кнопки Видимость в значение Истина.
  3. В свойствах кнопки найдем параметр Заголовок и заменим стандартный текст на один или несколько пробелов: " ". Кнопка визуально лишится названия.
  4. Изменим вид кнопки. Вместо стандартной кнопки установим значение свойства Вид в Гиперссылка.
  5. Настроим свойства оформления: установим цвет текста гиперссылки, совпадающий с цветом фона формы (используя системный стиль Фон формы).
  6. Для предотвращения случайного перехода по клавише Tab, снимем галочку со свойства Доступен при вводе (Пропускать при вводе).

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


Решение 3. Использование Глобальной Общей команды

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

Посмотрим на алгоритм реализации:

  1. В дереве метаданных конфигурации перейдем в ветку Общие -> Общие команды и создадим новую команду (например, ВызватьСкрытыйРежим).
  2. В свойствах этой команды зададим нужное СочетаниеКлавиш.
  3. Важно: мы не будем добавлять эту команду ни в одну командную панель формы и не будем выводить её в интерфейс командного интерфейса.
  4. В модуле нашей общей команды пропишем обработчик, который будет определять, на какой именно форме было совершено нажатие горячих клавиш, и вызывать необходимый алгоритм.

Проанализируем пример кода для модуля общей команды:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // Получаем текущее активное окно клиентского приложения
    АктивноеОкно = ПолучитьАктивноеОкно();
    Если АктивноеОкно = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем содержимое активного окна
    ТекущаяФорма = АктивноеОкно.Содержимое;
    Если ТипЗнч(ТекущаяФорма) = Тип("УправляемаяФорма") Тогда
        
        // Проверяем, что горячие клавиши были нажаты именно в нашей целевой форме
        Если ТекущаяФорма.ИмяФормы = "Обработка.МояСлужебнаяОбработка.Форма.Форма" Тогда
            
            // Вызываем экспортный метод формы или выполняем код напрямую на клиенте
            ТекущаяФорма.ВыполнитьСкрытоеДействие();
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

В модуле самой управляемой формы обработки нам достаточно определить экспортную процедуру:


&НаКлиенте
Процедура ВыполнитьСкрытоеДействие() Экспорт
    
    ПоказатьПредупреждение(, "Активирован скрытый режим отладки для разработчиков!");
    // Здесь размещаем ваш служебный код
    
КонецПроцедуры

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


Решение 4. Размещение кнопки на неактивной служебной вкладке

Рассмотрим еще один интересный визуальный трюк, основанный на многостраничных формах. Если ваша форма использует элемент Группа - Страницы (вкладки), мы можем создать техническую страницу-пустышку.

Давайте разберем этот процесс детально:

  1. Добавим в элемент управления Группа - Страницы новую страницу с именем СлужебнаяСтраница.
  2. Поместим на эту страницу кнопку нашей служебной команды и привяжем к ней горячие клавиши.
  3. Для самой страницы и для кнопки установим Видимость = Истина.
  4. При открытии формы и в процессе работы пользователя программно гарантируем, что активной страницей всегда будет являться любая другая страница (например, Основная), а переключатели вкладок сделаем скрытыми (установив свойство группы страниц ОтображениеЗакладок в значение Не отображать).

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


Анализ механизма "Пользовательской видимости"

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

В платформе 1С результирующая видимость элемента на форме вычисляется как логическое «И» между системным свойством Видимость и Пользовательская видимость (которая зависит от настроек прав и ролей пользователя).

Если вы отключаете пользовательскую видимость для конкретной роли или пользователя, современные релизы платформы 1С:Предприятие 8.3 (начиная с версий 8.3.15 и выше) ведут себя точно так же, как при установке стандартного свойства Видимость = Ложь. Платформа оптимизирует интерфейс и не отправляет элемент на клиент, из-за чего горячие клавиши перестают работать. Поэтому данный метод является устаревшим и не рекомендуется к использованию в современных конфигурациях.


Сравнительная таблица методов создания скрытых команд

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

Метод Сложность реализации Надежность скрытия Возможность вызова мышью Применимость в типовых конфигурациях
1. Контекстное меню Низкая Средняя (скрыто в меню) Да (через правый клик) Высокая (не требует изменения общих объектов)
2. Стелс-элемент (Маскировка) Средняя Высокая (невидимый пиксель) Практически нет (сложно попасть) Высокая (настраивается прямо на форме)
3. Общая команда Средняя Абсолютная (нет на форме) Нет Требует изменения метаданных конфигурации
4. Неактивная вкладка Высокая Высокая (скрыта вкладка) Нет Ограничена (требуется структура страниц)

Выбирайте метод, исходя из архитектурных особенностей вашей задачи. Для быстрых локальных доработок отлично подойдет размещение кнопки в контекстном меню или визуальная маскировка под стелс-элемент. Если же вы проектируете сложный отладочный функционал, который должен масштабироваться на всю систему — смело используйте механизм глобальных общих команд.

← На главную