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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

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

--- ### Почему в управляемых формах не работают хоткеи для скрытых кнопок?

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

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

---

Способ 1. Использование контекстного меню (самый надежный способ)

Это полностью задокументированный, стабильный и безопасный способ. Мы привязываем команду формы к контекстному меню какого-либо крупного и постоянно активного элемента на форме, например, к таблице динамического списка (списку документов или справочников) или к группе элементов.

Разберем реализацию этого способа по шагам:

  1. Откроем нужную управляемую форму в конфигураторе.
  2. На вкладке Команды создадим новую команду формы (например, СлужебнаяКорректировка).
  3. В свойствах созданной команды заполним поле Сочетание клавиш (например, Ctrl + Shift + Alt + F12).
  4. Создадим на клиенте обработчик команды формы.
  5. Перейдем на вкладку Элементы. Найдем элемент формы (например, таблицу списка документов Список).
  6. Развернем этот элемент и найдем внутри него элемент Контекстное меню (если его нет, создадим его принудительно, отключив автосостав).
  7. Перетащим нашу команду СлужебнаяКорректировка в это контекстное меню.

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

---

Способ 2. Визуальная маскировка кнопки («скрытие на виду»)

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

Рассмотрим варианты визуальной маскировки кнопки:

---

Способ 3. Перенос кнопки в меню «Еще»

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

Чтобы скрыть кнопку в «Еще», выполним следующие настройки:

  1. Выберем команду формы в конфигураторе.
  2. В палитре свойств найдем свойство Только во всех действиях и установим для него значение Истина.
  3. Перетащим команду на командную панель формы.

После этого кнопка автоматически переместится с основной видимой панели внутрь выпадающего меню «Еще». Привязанное сочетание клавиш будет стабильно работать.

---

Способ 4. Глобальные команды (Использование бага платформы)

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

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

--- ### Правильный подход к безопасности и архитектуре

Попытка скрыть административные функции с помощью «секретных сочетаний клавиш» (метод Security through obscurity — безопасность через неведение) является плохой практикой разработки. Рано или поздно пользователи могут случайно нажать эту комбинацию клавиш, увидеть её в коде расширения или подсмотреть за действиями администратора.

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

1. Жесткая проверка ролей в коде

Даже если команда вызвана «секретным» хоткеем, в самом начале процедуры-обработчика обязательно должна выполняться проверка прав текущего пользователя на сервере или клиенте.

Посмотрим на пример реализации такой проверки:


&НаКлиенте
Процедура ВыполнитьСкрытуюКорректировку(Команда)
    
    // Сначала проверяем права на клиенте (быстрая проверка)
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("АдминистрированиеДанных") Тогда
        ПоказатьПредупреждение(, "У вас нет прав на выполнение данной операции!");
        Возврат;
    КонецЕсли;
    
    // Переходим к серверному выполнению
    ВыполнитьКорректировкуНаСервере();
    
КонецПроцедуры

2. Подтверждение операции или ввод пароля

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

Посмотрим, как реализовать диалог подтверждения в асинхронном стиле, принятом в управляемом приложении:


&НаКлиенте
Процедура ВыполнитьСкрытуюКорректировку(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ВыполнитьКорректировкуПослеПодтверждения", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Вы действительно хотите запустить процедуру ручной корректировки реквизитов чека?", РежимДиалогаВопрос.ДаНет);
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьКорректировкуПослеПодтверждения(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
        // Запускаем процесс изменения данных
        ПровестиКорректировкуДанных();
    КонецЕсли;
    
КонецПроцедуры

3. Обязательное логирование в Журнал регистрации

Любые ручные изменения реквизитов документов или справочников в обход стандартной бизнес-логики конфигурации должны фиксироваться в Журнале регистрации. Это защитит разработчика от необоснованных претензий в случае расхождения данных с ОФД или учетной системой.

Рекомендуется использовать метод ЗаписьЖурналаРегистрации() на стороне сервера:


&НаСервереБезКонтекста
Процедура ЗаписатьВЖурналРегистрацииСобытие(ДокументСсылка)
    
    ИмяСобытия = "Администрирование.РучноеИзменениеРеквизитов";
    ТекстСообщения = Шаблон("Пользователь %1 принудительно изменил статус чека %2 на 'Пробит'", 
                             ПользователиИнформационнойБазы.ТекущийПользователь().Имя, 
                             Строка(ДокументСсылка));
                             
    ЗаписьЖурналаРегистрации(ИмяСобытия, 
                             УровеньЖурналаРегистрации.Предупреждение, 
                             ДокументСсылка.Метаданные(), 
                             ДокументСсылка, 
                             ТекстСообщения);
                             
КонецПроцедуры

--- ### Резюме

Для реализации скрытого вызова процедур по горячим клавишам в управляемых формах 1С 8.3 используйте размещение команды в контекстном меню или настройку свойства Только во всех действиях (меню «Еще»). Эти способы полностью соответствуют стандартам разработки фирмы «1С», стабильно работают на любых версиях платформы и не вызовут трудностей при последующих обновлениях конфигурации. И обязательно защищайте код обработчиков проверкой ролей, чтобы ваш удобный служебный инструмент не стал лазейкой для обхода бизнес-логики системы.

← На главную