В платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с жесткими ограничениями интерфейса. Одним из таких вопросов является управление стандартной командной панелью и контекстным меню, вызываемым правой кнопкой мыши. Рассмотрим ситуацию на примере Плана счетов в конфигурации «Бухгалтерия 7.7», где необходимо скрыть конкретную кнопку — «Показывать счета, согласованные с корректными проводками», чтобы пользователь не мог видеть лишние данные. Мы разберем несколько стратегий решения этой задачи: от стандартных средств до использования мощных внешних компонент.
Если задача стоит радикально и нам не критично наличие всех кнопок на верхней панели, мы можем воспользоваться штатными настройками формы. Давайте проанализируем, как это сделать по шагам:
После выполнения этих действий верхняя панель с кнопками исчезнет полностью. Однако стоит учитывать, что это «грубое» решение: вместе с ненужной кнопкой пропадут и полезные, такие как «Поиск», «Сортировка» или «Новая строка». Кроме того, этот метод не отключает контекстное меню, вызываемое правой кнопкой мыши, где пункты управления отображением счетов все равно останутся доступны.
Вместо того чтобы бороться с интерфейсом, мы можем воздействовать на логику отображения данных. Платформа 7.7 позволяет программно ограничивать список доступных счетов. Рассмотрим, как принудительно установить фильтр, который будет работать независимо от нажатия кнопок пользователем.
Для этого в процедуре ПриОткрытии формы списка плана счетов мы можем прописать следующий код:
Процедура ПриОткрытии()
// Устанавливаем фильтр по корректным проводкам
// Параметр 1 включает режим фильтрации
ИспользоватьКорСчет(1);
КонецПроцедуры
Хотя кнопка на панели останется, при открытии формы пользователь сразу увидит отфильтрованный список. Чтобы сделать защиту более надежной, мы можем добавить проверку в процедуру выбора счета, чтобы даже если пользователь «обманул» интерфейс, система не дала ему выбрать некорректный счет.
Как мы выяснили, простое удаление панели инструментов не спасает от контекстного меню. В 1С 7.7 есть хитрость, позволяющая переопределить стандартное меню своим собственным. Давайте разберем этот алгоритм:
ПустоеМеню.ПустоеМеню.Теперь при нажатии правой кнопки мыши в форме вместо системного списка команд (где была кнопка корректных проводок) появится наше ограниченное меню. Это эффективный штатный способ убрать доступ к «зашитым» функциям платформы.
Если нам требуется точечное управление — например, оставить панель, но заблокировать нажатие конкретной кнопки или перехватить команду, — штатных средств будет недостаточно. Здесь на помощь приходит компонента RWidjets, которая входит в состав широко известного набора инструментов 1С++.
Проанализируем механизм перехвата команд. Компонента позволяет использовать глобальное событие ПриПолученииКоманды. Рассмотрим пример реализации в Глобальном модуле:
Процедура ПриПолученииКоманды(пКоманда, пЗаблокироватьКоманду)
// пКоманда - это числовой идентификатор системного действия
// Нам нужно заранее определить ID кнопки "Корректные проводки"
Если пКоманда = ИД_НУЖНОЙ_КНОПКИ Тогда
Предупреждение("Данное действие запрещено администратором!");
пЗаблокироватьКоманду = 1; // Блокируем выполнение команды платформой
КонецЕсли;
КонецПроцедуры
Для определения ID команды можно воспользоваться специальными утилитами или методом перебора (выводя значение пКоманда в окно сообщений при нажатии кнопок). Этот метод является наиболее профессиональным, так как он работает на уровне сообщений операционной системы Windows и не позволяет пользователю обойти запрет даже через горячие клавиши.
Еще одна популярная компонента — FormEx. Она позволяет динамически манипулировать объектами формы. Хотя она чаще используется для раскраски таблиц, в ней есть возможности по работе с окнами через Сервис и РасширениеФормы.
С помощью FormEx мы можем программно изменять стили окон или перехватывать нажатия клавиш клавиатуры. Если пользователь пытается вызвать функцию через сочетание клавиш (Hotkeys), мы можем отследить это в событии ПриНажатииКнопкиКлавиатуры. Рассмотрим пример:
Процедура ПриНажатииКнопкиКлавиатуры(Конт, КодКлавиши, Альт, Шифт, Контрол, Символ, ФлагСтандартнойОбработки)
// Пример блокировки сочетания клавиш, если оно назначено на кнопку
Если (Контрол = 1) и (КодКлавиши = 115) Тогда // Допустим, Ctrl + F4
ФлагСтандартнойОбработки = 0;
Возврат;
КонецЕсли;
КонецПроцедуры
Выясним причину, почему некоторые кнопки так сложно убрать. Платформа 1С 7.7 строит интерфейс на стандартных библиотеках Windows (Win32 API). Каждая панель инструментов — это объект класса ToolbarWindow32. Используя внешние функции из user32.dll, такие как SendMessage, можно отправить сообщение TB_DELETEBUTTON окну панели инструментов.
Этот путь требует серьезных знаний системного программирования. Процесс выглядит так:
Несмотря на сложность, этот метод позволяет физически удалить кнопку из интерфейса «на лету», не прибегая к отключению всей панели.
Подводя итог, выберем оптимальную стратегию в зависимости от ваших навыков и требований безопасности:
ИспользоватьКорСчет(1) и назначить форме Пустое меню в конфигураторе. Это решит проблему в 90% случаев.RWidjets. Это гарантирует, что команда не будет выполнена ни при каких обстоятельствах.ПриЗаписи или ПриВыбореСчета, так как любые визуальные ограничения — это лишь первый уровень защиты.Разберем еще один нюанс: при работе с планом счетов в 7.7 кнопка корректных проводок жестко связана с механизмом работы бухгалтерских итогов. Если вы её отключаете, убедитесь, что в базе корректно заполнен справочник «Корректные проводки», иначе пользователи могут столкнуться с тем, что список счетов окажется совершенно пустым.