При тонкой настройке пользовательского интерфейса в 1С:Предприятии 7.7 часто возникает задача скрыть стандартные системные инструменты платформы, такие как встроенный калькулятор или календарь. Однако разработчики нередко сталкиваются с ситуацией, когда стандартный вызов метода управления видимостью пунктов меню не дает результата именно для калькулятора, тогда как остальные пункты меню скрываются без каких-либо сложностей.
Разберем подробнее, почему возникает эта ошибка, как устроены системные пункты меню платформы и какими способами можно гарантированно скрыть калькулятор или ограничить к нему доступ.
Проанализируем типовой вызов метода, который не срабатывает:
Окна.ВидимостьМеню("&КалькуляторCtrl+F2", 0);
Причина такого поведения заключается во внутреннем представлении пунктов меню в операционной системе Windows и платформе 1С:Предприятие 7.7. В строке названия пункта меню между самим текстом команды и комбинацией горячих клавиш (акселератором) всегда присутствует специальный разделитель. В подавляющем большинстве случаев это не слитное написание и даже не обычные пробелы, а системный символ табуляции (код ASCII 9).
Если переданная в метод строка не совпадает с внутренним системным заголовком пункта с точностью до каждого байта и управляющего символа, механизм поиска команды по названию просто не находит нужный пункт меню и игнорирует команду изменения видимости.
Посмотрим на практическое решение проблемы. Как выяснилось в ходе обсуждения, в строку можно передать точное количество пробелов, однако наиболее надежным и платформонезависимым подходом является явное использование символа табуляции через встроенную функцию Симв(9).
Рассмотрим правильный вариант вызова:
Окна.ВидимостьМеню("&Калькулятор" + Симв(9) + "Ctrl+F2", 0);
В этом выражении учитываются два критически важных элемента:
Alt. Позиция амперсанда должна строго соответствовать локализации платформы.Если конфигурация может запускаться на различных сборках платформы или существует вероятность несовпадения регистра и управляющих символов, надежнее применить динамический поиск команды. Разберем по шагам, как получить реальные имена пунктов меню и скрыть нужный элемент программно.
Посмотрим на пример реализации обхода:
СЗМеню = Окна.ПолучитьМеню();
Для Сч = 1 По СЗМеню.РазмерСписка() Цикл
ИмяПункта = "";
СЗМеню.ПолучитьЗначение(Сч, ИмяПункта);
Если Найти(ИмяПункта, "Калькулятор") > 0 Тогда
Окна.ВидимостьМеню(ИмяПункта, 0);
КонецЕсли;
КонецЦикла;
Такой подход полностью исключает риск ошибки из-за пробелов или табуляции, поскольку метод ВидимостьМеню получает ровно ту строку, которую зарегистрировала сама платформа при инициализации главного окна.
Выясним, какие сопутствующие особенности и альтернативные варианты существуют при решении этой задачи:
ВидимостьМеню убирает отображение строки из интерфейса, однако в ряде релизов платформы глобальный акселератор Ctrl+F2 может продолжать открывать калькулятор. Чтобы сделать команду недоступной, рекомендуется дополнительно использовать отключение доступности:
Окна.ДоступностьМеню("&Калькулятор" + Симв(9) + "Ctrl+F2", 0);
Окна.ВидимостьМеню("&Сервис", 0);
Использование правильной строки с Симв(9) или предварительное считывание списка меню через ПолучитьМеню() позволяет гарантированно управлять отображением любых встроенных элементов интерфейса 1С:Предприятия 7.7.