В процессе разработки и администрирования систем на платформе 1С:Предприятие 8.3 периодически возникают нестандартные задачи. Например, разработчику или системному администратору может потребоваться встроенный инструмент для быстрой корректировки данных прямо в форме списка документов (например, изменение статуса чека ККМ, проведение застрявших документов или принудительная синхронизация). При этом важно, чтобы обычные пользователи не имели доступа к этой возможности и даже не подозревали о её существовании.
Первое очевидное решение, которое приходит в голову — создать команду формы, назначить ей горячие клавиши (хоткей) и скрыть кнопку, установив свойство Видимость = Ложь или Доступность = Ложь. Однако при попытке реализовать это в управляемом приложении разработчики сталкиваются с тем, что сочетание клавиш перестает работать. Давайте разберем причины такого поведения платформы и рассмотрим рабочие альтернативные варианты реализации этой задачи.
--- ### Почему в управляемых формах не работают хоткеи для скрытых кнопок?
В отличие от старых обычных форм (где скрытые кнопки продолжали обрабатывать нажатия клавиш), в управляемых формах 1С оптимизирует передачу данных между сервером и тонким клиентом. Если у элемента формы свойство Видимость или Доступность принимает значение Ложь, платформа полностью исключает этот элемент из отрисовки интерфейса на клиенте. Он физически не создается в дереве элементов клиентской формы. Соответственно, связанные с ним горячие клавиши перестают перехватываться, так как перехватывать их некому.
Для решения этой проблемы нам нужно сделать так, чтобы команда технически оставалась активной и видимой для платформы, но при этом была скрыта от глаз рядового пользователя. Проанализируем самые эффективные способы реализации этой задачи.
---
Это полностью задокументированный, стабильный и безопасный способ. Мы привязываем команду формы к контекстному меню какого-либо крупного и постоянно активного элемента на форме, например, к таблице динамического списка (списку документов или справочников) или к группе элементов.
Разберем реализацию этого способа по шагам:
СлужебнаяКорректировка).Ctrl + Shift + Alt + F12).Список).СлужебнаяКорректировка в это контекстное меню.Результат: Кнопка команды теперь физически присутствует на клиенте, она активна и доступна. Сочетание клавиш будет без проблем срабатывать всегда, когда активна данная форма. Обычный пользователь не увидит никаких изменений на форме, если только не решит нажать правой кнопкой мыши по списку и детально изучить все пункты контекстного меню.
---
Если вам обязательно нужно разместить кнопку на панели формы, но сделать её невидимой для человека, можно воспользоваться особенностями визуального оформления элементов в 1С. Платформа будет считать кнопку видимой, и хоткей продолжит работать.
Рассмотрим варианты визуальной маскировки кнопки:
Отображение в значение Картинка. При этом само свойство Картинка оставим пустым, а текст заголовка полностью сотрем. Кнопка превратится в крошечную пустую область на форме, которая сольется с командной панелью, но технически останется видимой и рабочей.Гиперссылка, очистим заголовок (можно поставить один пробел, чтобы платформа не подставляла стандартное имя команды). Визуально гиперссылка без текста не занимает места и не отображается на форме.ЦветФона, ЦветТекста и ЦветГраницы равными стилю Цвет фона формы. Кнопка станет абсолютно неразличима на общем фоне.РастягиватьПоГоризонтали и РастягиватьПоВертикали. Установим ширину и высоту кнопки в значение 1.---
Этот способ отлично подходит, если вы хотите спрятать команду от большинства пользователей, но при этом не против, чтобы она была доступна через интерфейс в крайнем случае. Стандартное меню «Еще» содержит множество системных команд, и появление там одной дополнительной строчки вряд ли привлечет внимание обычного сотрудника.
Чтобы скрыть кнопку в «Еще», выполним следующие настройки:
Истина.После этого кнопка автоматически переместится с основной видимой панели внутрь выпадающего меню «Еще». Привязанное сочетание клавиш будет стабильно работать.
---
В платформе «1С:Предприятие 8» существует особенность работы глобальных команд. Если создать Общую команду в дереве метаданных конфигурации (или в расширении), назначить ей сочетание клавиш и определить тип параметра команды (или оставить его пустым), то эта команда будет перехватывать нажатие горячих клавиш в любой открытой форме приложения, даже если кнопка этой команды вообще никуда не выведена.
Важное предупреждение: Использовать этот метод в промышленной разработке не рекомендуется. Это недокументированное поведение платформы, которое разработчики 1С могут исправить в любом из следующих обновлений. Кроме того, общая команда будет глобально перехватывать сочетание клавиш во всей информационной базе, что может привести к непредсказуемым конфликтам с другими формами.
--- ### Правильный подход к безопасности и архитектуре
Попытка скрыть административные функции с помощью «секретных сочетаний клавиш» (метод Security through obscurity — безопасность через неведение) является плохой практикой разработки. Рано или поздно пользователи могут случайно нажать эту комбинацию клавиш, увидеть её в коде расширения или подсмотреть за действиями администратора.
Поэтому при разработке подобных скрытых инструментов обязательно внедряйте дополнительные уровни защиты. Проанализируем, как это сделать правильно.
Даже если команда вызвана «секретным» хоткеем, в самом начале процедуры-обработчика обязательно должна выполняться проверка прав текущего пользователя на сервере или клиенте.
Посмотрим на пример реализации такой проверки:
&НаКлиенте
Процедура ВыполнитьСкрытуюКорректировку(Команда)
// Сначала проверяем права на клиенте (быстрая проверка)
Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("АдминистрированиеДанных") Тогда
ПоказатьПредупреждение(, "У вас нет прав на выполнение данной операции!");
Возврат;
КонецЕсли;
// Переходим к серверному выполнению
ВыполнитьКорректировкуНаСервере();
КонецПроцедуры
Для предотвращения случайного запуска процедуры (например, если пользователь случайно зажал комбинацию клавиш на клавиатуре тяжелой папкой с документами) обязательно используйте диалог подтверждения или даже запрос дополнительного административного пароля.
Посмотрим, как реализовать диалог подтверждения в асинхронном стиле, принятом в управляемом приложении:
&НаКлиенте
Процедура ВыполнитьСкрытуюКорректировку(Команда)
Оповещение = Новый ОписаниеОповещения("ВыполнитьКорректировкуПослеПодтверждения", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Вы действительно хотите запустить процедуру ручной корректировки реквизитов чека?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьКорректировкуПослеПодтверждения(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
// Запускаем процесс изменения данных
ПровестиКорректировкуДанных();
КонецЕсли;
КонецПроцедуры
Любые ручные изменения реквизитов документов или справочников в обход стандартной бизнес-логики конфигурации должны фиксироваться в Журнале регистрации. Это защитит разработчика от необоснованных претензий в случае расхождения данных с ОФД или учетной системой.
Рекомендуется использовать метод ЗаписьЖурналаРегистрации() на стороне сервера:
&НаСервереБезКонтекста
Процедура ЗаписатьВЖурналРегистрацииСобытие(ДокументСсылка)
ИмяСобытия = "Администрирование.РучноеИзменениеРеквизитов";
ТекстСообщения = Шаблон("Пользователь %1 принудительно изменил статус чека %2 на 'Пробит'",
ПользователиИнформационнойБазы.ТекущийПользователь().Имя,
Строка(ДокументСсылка));
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньЖурналаРегистрации.Предупреждение,
ДокументСсылка.Метаданные(),
ДокументСсылка,
ТекстСообщения);
КонецПроцедуры
--- ### Резюме
Для реализации скрытого вызова процедур по горячим клавишам в управляемых формах 1С 8.3 используйте размещение команды в контекстном меню или настройку свойства Только во всех действиях (меню «Еще»). Эти способы полностью соответствуют стандартам разработки фирмы «1С», стабильно работают на любых версиях платформы и не вызовут трудностей при последующих обновлениях конфигурации. И обязательно защищайте код обработчиков проверкой ролей, чтобы ваш удобный служебный инструмент не стал лазейкой для обхода бизнес-логики системы.