В современных конфигурациях на платформе 1С:Предприятие 8.3 интерфейс «Такси» является стандартом де-факто. Однако часто возникают специфические задачи, когда необходимо максимально освободить экранное пространство для работы пользователя, например, в специализированных киосках, на мониторах с низким разрешением или в формах быстрого ввода. Стандартная возможность «Скрыть все панели» (доступная через меню Вид) отлично справляется с этой задачей, но пользователям неудобно нажимать её при каждом входе. В этой статье мы разберем, как реализовать это программно.
Проанализируем наиболее корректный и «чистый» способ управления интерфейсом, который предоставляет сама платформа. Речь идет об использовании объекта НастройкиИнтерфейсаКлиентскогоПриложения. Этот объект позволяет описать, какие именно панели должны отображаться в окне и в каких областях.
Рассмотрим пошагово, как применить эти настройки в модуле управляемого приложения. Нам понадобится процедура ПриНачалеРаботыСистемы. Основная логика заключается в создании пустого состава панелей и его применении к текущему сеансу.
Посмотрим на пример кода:
Процедура ПриНачалеРаботыСистемы()
// Создаем объект для описания настроек интерфейса
Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
// Создаем пустой состав панелей.
// Если мы не добавляем в него элементы, система скроет всё лишнее.
Состав = Новый СоставПанелейИнтерфейсаКлиентскогоПриложения;
// Устанавливаем этот пустой состав в наши настройки
Настройки.УстановитьСостав(Состав);
// Применяем настройки для текущего клиента
УстановитьНастройкиИнтерфейсаКлиентскогоПриложения(Настройки);
КонецПроцедуры
Выясним причину, почему этот метод считается приоритетным. Во-первых, он использует штатные методы платформы, которые гарантируют корректную перерисовку интерфейса без необходимости перезапуска программы. Во-вторых, этот метод работает на уровне клиентского приложения, что позволяет гибко управлять видимостью в зависимости от ролей пользователя или параметров запуска.
Существует и другой подход, упомянутый в обсуждении: запись настроек напрямую в системное хранилище. Этот метод полезен, если нам нужно «зафиксировать» состояние интерфейса для пользователя так, чтобы оно сохранялось между сеансами, даже если 1С закроется некорректно. Для просмотра и очистки таких записей можно применить инструмент для управления хранилищем настроек пользователей.
Настройки расположения панелей в интерфейсе «Такси» хранятся под определенным ключом. Путь к объекту в хранилище выглядит так: Общее/Панели/НастройкиИнтерфейсаКлиентскогоПриложения. Чтобы программно скрыть панели этим способом, мы должны сформировать объект настроек (как в первом методе) и принудительно записать его в базу данных под именем текущего пользователя.
Разберем пример реализации на стороне сервера:
Процедура СкрытьПанелиЧерезХранилище(ИмяПользователя) Экспорт
Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
// Оставляем состав панелей пустым для скрытия всех элементов
Состав = Новый СоставПанелейИнтерфейсаКлиентскогоПриложения;
Настройки.УстановитьСостав(Состав);
// Записываем настройки в хранилище
ХранилищеСистемныхНастроек.Записать(
"Общее/Панели/НастройкиИнтерфейсаКлиентскогоПриложения",
"",
Настройки,
,
ИмяПользователя
);
КонецПроцедуры
Важно помнить: изменения, внесенные напрямую в ХранилищеСистемныхНастроек, могут не отобразиться мгновенно в текущем активном сеансе. Пользователю может потребоваться перезапуск приложения, чтобы система прочитала новые данные из хранилища при инициализации интерфейса. Именно поэтому использование УстановитьНастройкиИнтерфейсаКлиентскогоПриложения() в паре с записью в хранилище является наиболее надежной комбинацией.
В качестве альтернативного решения в сообществе иногда предлагают эмуляцию комбинации клавиш CTRL + SHIFT + ~. Это сочетание клавиш в платформе 8.3 отвечает за быстрое переключение режима «Скрыть все панели».
Для реализации этого метода используется объект WScript.Shell. Рассмотрим, как это выглядит в коде:
Попытка
ОбъектWsh = Новый COMОбъект("WScript.Shell");
// Эмулируем нажатие Ctrl+Shift+~
// Символ ^ соответствует Ctrl, + соответствует Shift
ОбъектWsh.SendKeys("^+~");
Исключение
// Обработка ошибки, если COM-объект недоступен
КонецПопытки;
Проанализируем ситуацию с этим методом. Несмотря на простоту, это решение имеет ряд серьезных недостатков, которые делают его неприменимым в профессиональной разработке:
SendKeys отправляет символы в активное окно. Если в момент выполнения кода фокус сместится (например, на окно антивируса или другое приложение), команда уйдет «в никуда» или вызовет непредсказуемое поведение в другой программе.Начиная с версии платформы 8.3.15, в 1С появился «Компактный вариант интерфейса». Иногда вместо полного скрытия панелей достаточно включить именно его. Это позволяет уменьшить отступы и размеры шрифтов в заголовках панелей, сохраняя навигацию доступной.
Управление этим режимом осуществляется через свойство ВариантИнтерфейсаКлиентскогоПриложения. Мы можем установить его программно:
Настройки = Новый НастройкиИнтерфейсаКлиентскогоПриложения;
Настройки.ВариантИнтерфейса = ВариантИнтерфейсаКлиентскогоПриложения.Компактный;
УстановитьНастройкиИнтерфейсаКлиентскогоПриложения(Настройки);
Это хорошее промежуточное решение, если полное скрытие панелей кажется пользователям слишком радикальным. Для централизованного переключения этого режима у пользователей можно использовать обработку для смены варианта интерфейса с компактного на обычный.
Проанализируем важный нюанс: программные настройки интерфейса имеют приоритет над стандартными настройками, заданными в конфигураторе. Однако, если пользователю в его роли (правах доступа) запрещено изменять состав панелей или если интерфейс жестко зафиксирован администратором, программные методы могут столкнуться с ограничениями платформы.
Также стоит учитывать, что пользователь всё равно сможет вернуть панели через меню «Вид», если у него есть соответствующие права. Полностью «заблокировать» интерфейс можно только путем комбинирования программного скрытия и настройки прав доступа в конфигураторе, ограничивающих видимость конкретных панелей (например, панели разделов или панели инструментов) для определенных ролей.
Мы рассмотрели несколько способов управления видимостью панелей в интерфейсе «Такси». Подводя итог, можно сказать, что лучшим решением является использование объекта НастройкиИнтерфейсаКлиентскогоПриложения в процедуре ПриНачалеРаботыСистемы. Это обеспечивает надежность, кроссплатформенность (в рамках клиентов 1С) и предсказуемый результат без использования сомнительных «костылей» вроде эмуляции нажатия клавиш.