В процессе настройки интерфейса для конечных пользователей часто возникает задача ограничения доступа к системным пунктам меню. Например, администратор может скрыть стандартное меню «Сервис», чтобы пользователь случайно не изменил критически важные настройки. Однако иногда требуется оставить возможность открывать конкретное окно, например, «Параметры», нажатием обычной кнопки на форме обработки. В версии 1С 7.7 штатных средств встроенного языка для этой задачи не предусмотрено, поэтому мы разберем использование внешних инструментов и механизмов операционной системы.
Наиболее надежным и эффективным способом управления окнами в 1С 7.7 является использование внешней компоненты FormEx. Она расширяет возможности платформы, позволяя взаимодействовать с объектами Windows напрямую. Для решения нашей задачи воспользуемся объектом Окна и методом ОтправитьКоманду.
Рассмотрим по шагам, как реализовать этот механизм. Для начала убедимся, что компонента FormEx.dll загружена в систему. После этого мы можем создать объект и отправить приложению сообщение WM_COMMAND с идентификатором нужного пункта меню. Для окна «Параметры» этот идентификатор — 32803.
Проанализируем пример кода, который можно разместить в модуле формы обработки при нажатии на кнопку:
Процедура ПриНажатииКнопкиНастройки()
// Создаем объект для управления окнами из FormEx
Окна = СоздатьОбъект("Окна");
// Вызываем команду открытия окна "Сервис-Параметры"
// 32803 - это внутренний идентификатор данной команды в 1С 7.7
Окна.ОтправитьКоманду(32803, 0);
КонецПроцедуры
Этот метод имитирует выбор пункта меню пользователем, даже если само меню в данный момент скрыто программно или через настройки интерфейса в Конфигураторе.
Часто программисту требуется вызвать не только окно параметров, но и другие стандартные диалоги (календарь, калькулятор, окно открытия файла). Выясним, как узнать нужный номер (wParam) для любой команды. Компонента FormEx позволяет «прослушивать» сообщения, приходящие в главное окно программы.
Разберем алгоритм поиска нужного кода:
ПриПолученииКомандыГлавнымОкном (доступна при использовании FormEx).Посмотрим на пример реализации в глобальном модуле:
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
Сообщить("Нажата команда с кодом: " + wParam);
КонецПроцедуры
Теперь, запустив 1С в режиме предприятия, мы можем просто нажимать на любые пункты меню, и в окне сообщений будут отображаться их числовые идентификаторы. Например, для основных функций 1С 7.7 актуальны следующие коды:
Если по каким-то причинам использование внешних компонент невозможно, проанализируем вариант с использованием системного объекта WScript.Shell. Этот метод основан на имитации нажатий клавиш клавиатуры (Hotkeys). Рассмотрим его реализацию:
Процедура ОткрытьПараметрыЧерезКлавиши()
Попытка
WshShell = СоздатьОбъект("WScript.Shell");
// Имитируем нажатие Alt, затем переход к меню Сервис и Параметры
// Внимание: последовательность зависит от языка раскладки и версии меню!
WshShell.SendKeys("%"); // Нажатие Alt (активация меню)
WshShell.SendKeys("с"); // Буква "с" для меню "Сервис"
WshShell.SendKeys("п"); // Буква "п" для пункта "Параметры"
Исключение
Предупреждение("Не удалось отправить команду клавиатуре");
КонецПопытки;
КонецПроцедуры
Нужно учитывать, что метод SendKeys крайне нестабилен. Он сильно зависит от текущей раскладки клавиатуры (русская или английская) и от того, какое окно находится в фокусе. Если фокус случайно переключится в момент выполнения скрипта, команда уйдет в другое приложение. Поэтому мы рекомендуем использовать способ с FormEx как основной.
Иногда задача «открыть окно параметров» является лишь промежуточным этапом, а конечная цель — изменить какую-то настройку (например, путь к базе почты или параметры печати). Выясним, как это сделать без участия пользователя.
Платформа 1С 7.7 хранит большинство настроек из окна «Сервис-Параметры» в реестре Windows. Путь к ветке настроек выглядит следующим образом:
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<ИмяБазы>\V7\<ИмяПользователя>\Options
Проанализируем ситуацию: если нам нужно программно установить режим, мы можем записать значение напрямую в реестр, используя тот же объект WScript.Shell, и пользователю даже не придется открывать никаких окон. Однако помните, что изменения в реестре вступают в силу либо сразу, либо после перезапуска программы, в зависимости от конкретного параметра.
При вызове окна «Параметры» через ОтправитьКоманду следует помнить, что это окно является модальным. Это означает, что выполнение программного кода в 1С будет приостановлено до тех пор, пока пользователь не закроет это окно. Если вы вызываете его из середины сложного алгоритма, убедитесь, что это не нарушит логику работы вашей обработки.
Таким образом, мы разобрали наиболее эффективный способ программного вызова системных диалогов в 1С 7.7. Использование FormEx и идентификаторов WM_COMMAND позволяет гибко настраивать интерфейс, предоставляя пользователю только необходимые инструменты и скрывая лишние элементы управления.