При разработке прикладных решений на платформе 1С:Предприятие 8.3 (Управляемые формы) программисты нередко сталкиваются с необходимостью создания «секретных» или служебных команд. Это могут быть панели отладки, функции быстрого заполнения тестовыми данными, запуск административных процедур или вывод сервисной информации. Идеальный сценарий для таких функций — вызов исключительно по сочетанию горячих клавиш (например, Ctrl+Alt+D или Shift+F12), при этом физическая кнопка на форме должна быть полностью скрыта от глаз обычного пользователя.
Однако стандартный механизм платформы накладывает жесткое ограничение: если у элемента формы (кнопки) свойство Видимость установлено в значение Ложь, платформа полностью исключает этот элемент из отрисовки на клиенте. Как результат, назначенное сочетание клавиш перестает регистрироваться и обрабатываться. В этой статье мы подробно разберем, почему так происходит, проанализируем поведение платформы и рассмотрим четыре проверенных альтернативных способа обхода этого ограничения.
Для начала разберем внутреннюю логику работы управляемого клиента 1С. Платформа стремится оптимизировать сетевой трафик и потребление памяти на стороне клиента. Когда мы устанавливаем свойство Видимость = Ложь для кнопки или всей командной панели, сервер 1С при формировании структуры формы для передачи клиенту попросту игнорирует эти элементы. На стороне веб-клиента или тонкого клиента их физически не существует в дереве элементов (DOM-модели или системном пуле окон).
Поскольку элемента нет на клиенте, операционная система и браузер не могут зарегистрировать глобальный перехватчик клавиатуры для конкретной комбинации клавиш. Следовательно, привычный путь скрытия кнопки через свойство Видимость для решения нашей задачи не подходит. Нам потребуются более гибкие и изощренные обходные пути.
Это один из самых элегантных, простых и штатных способов решения проблемы, предложенный участниками профессионального сообщества. Смысл заключается в том, что команда физически присутствует в интерфейсе, но скрыта глубоко внутри контекстного меню элемента формы, которым пользователи редко пользуются с помощью мыши.
Проанализируем пошаговый алгоритм реализации этого метода:
СлужебныйРежим) и назначим ей требуемое сочетание клавиш в свойстве СочетаниеКлавиш.Видимость = Истина.Почему это работает? Кнопка технически остается видимой для платформы, хотя визуально она скрыта до тех пор, пока пользователь не нажмет правой кнопкой мыши по конкретному полю. Сочетание клавиш при этом отрабатывает безотказно из любого места формы, где активен фокус. Дополнительным плюсом является то, что при необходимости разработчик всегда может вызвать эту команду мышкой, просто открыв контекстное меню.
Если контекстное меню по каким-то причинам не подходит или вы хотите полностью исключить возможность случайного нажатия кнопки мышью, рассмотрим метод визуальной маскировки. Мы заставим платформу думать, что кнопка видима, но сделаем её абсолютно незаметной для человеческого глаза.
Разберем по шагам, как настроить такой «стелс-элемент»:
Видимость в значение Истина.Заголовок и заменим стандартный текст на один или несколько пробелов: " ". Кнопка визуально лишится названия.Вид в Гиперссылка.Фон формы).Tab, снимем галочку со свойства Доступен при вводе (Пропускать при вводе).В результате на форме будет присутствовать невидимая область размером в несколько пикселей, которая никак себя не выдает. При этом платформа добросовестно обрабатывает сочетание клавиш, так как технически видимость элемента подтверждена.
Рассмотрим более масштабный архитектурный подход, который отлично работает во всех современных версиях платформы 1С:Предприятие 8.3. Этот метод базируется на использовании общей команды конфигурации.
Посмотрим на алгоритм реализации:
ВызватьСкрытыйРежим).СочетаниеКлавиш.Проанализируем пример кода для модуля общей команды:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// Получаем текущее активное окно клиентского приложения
АктивноеОкно = ПолучитьАктивноеОкно();
Если АктивноеОкно = Неопределено Тогда
Возврат;
КонецЕсли;
// Проверяем содержимое активного окна
ТекущаяФорма = АктивноеОкно.Содержимое;
Если ТипЗнч(ТекущаяФорма) = Тип("УправляемаяФорма") Тогда
// Проверяем, что горячие клавиши были нажаты именно в нашей целевой форме
Если ТекущаяФорма.ИмяФормы = "Обработка.МояСлужебнаяОбработка.Форма.Форма" Тогда
// Вызываем экспортный метод формы или выполняем код напрямую на клиенте
ТекущаяФорма.ВыполнитьСкрытоеДействие();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В модуле самой управляемой формы обработки нам достаточно определить экспортную процедуру:
&НаКлиенте
Процедура ВыполнитьСкрытоеДействие() Экспорт
ПоказатьПредупреждение(, "Активирован скрытый режим отладки для разработчиков!");
// Здесь размещаем ваш служебный код
КонецПроцедуры
Этот способ является наиболее надежным и чистым с точки зрения проектирования интерфейсов. Кнопки нет на форме вообще, отсутствуют риски случайного клика мышкой, а логика перехвата полностью контролируется платформой на глобальном уровне.
Рассмотрим еще один интересный визуальный трюк, основанный на многостраничных формах. Если ваша форма использует элемент Группа - Страницы (вкладки), мы можем создать техническую страницу-пустышку.
Давайте разберем этот процесс детально:
Группа - Страницы новую страницу с именем СлужебнаяСтраница.Видимость = Истина.Основная), а переключатели вкладок сделаем скрытыми (установив свойство группы страниц ОтображениеЗакладок в значение Не отображать).Результат: Кнопка технически видима (ее родитель — видимая страница), поэтому горячие клавиши работают стабильно. Но пользователь физически не может перейти на эту служебную вкладку, так как закладки скрыты программно, а код инициализации формы держит фокус на основных разделах.
В процессе обсуждений на форумах разработчики иногда предлагают использовать свойство Пользовательская видимость вместо обычного свойства Видимость для скрытия кнопок командной панели (как упоминалось в сообщении 10 темы). Нам необходимо детально проанализировать этот подход, чтобы предостеречь вас от возможных ошибок.
В платформе 1С результирующая видимость элемента на форме вычисляется как логическое «И» между системным свойством Видимость и Пользовательская видимость (которая зависит от настроек прав и ролей пользователя).
Если вы отключаете пользовательскую видимость для конкретной роли или пользователя, современные релизы платформы 1С:Предприятие 8.3 (начиная с версий 8.3.15 и выше) ведут себя точно так же, как при установке стандартного свойства Видимость = Ложь. Платформа оптимизирует интерфейс и не отправляет элемент на клиент, из-за чего горячие клавиши перестают работать. Поэтому данный метод является устаревшим и не рекомендуется к использованию в современных конфигурациях.
Для того чтобы вам было проще выбрать подходящий инструмент под конкретную задачу, сопоставим рассмотренные методы по ключевым параметрам:
| Метод | Сложность реализации | Надежность скрытия | Возможность вызова мышью | Применимость в типовых конфигурациях |
|---|---|---|---|---|
| 1. Контекстное меню | Низкая | Средняя (скрыто в меню) | Да (через правый клик) | Высокая (не требует изменения общих объектов) |
| 2. Стелс-элемент (Маскировка) | Средняя | Высокая (невидимый пиксель) | Практически нет (сложно попасть) | Высокая (настраивается прямо на форме) |
| 3. Общая команда | Средняя | Абсолютная (нет на форме) | Нет | Требует изменения метаданных конфигурации |
| 4. Неактивная вкладка | Высокая | Высокая (скрыта вкладка) | Нет | Ограничена (требуется структура страниц) |
Выбирайте метод, исходя из архитектурных особенностей вашей задачи. Для быстрых локальных доработок отлично подойдет размещение кнопки в контекстном меню или визуальная маскировка под стелс-элемент. Если же вы проектируете сложный отладочный функционал, который должен масштабироваться на всю систему — смело используйте механизм глобальных общих команд.