В процессе сопровождения типовых конфигураций 1С часто возникает задача упрощения пользовательского интерфейса. Типовые решения перегружены функционалом, и обычному сотруднику для выполнения повседневных задач требуется не более 5–10% от всех доступных команд. Однако простое отключение прав (ролей) не всегда является выходом: функционал может быть нужен для фоновых процессов, или права жестко завязаны на бизнес-логику, которую нельзя нарушать. В таких ситуациях мы сталкиваемся с необходимостью программно скрыть элементы меню, оставив права доступа нетронутыми — для этого подойдёт универсальный редактор видимости элементов интерфейса.
Рассмотрим детально, какими способами можно добиться чистоты интерфейса, не снимая конфигурацию с поддержки и не изменяя роли пользователей — для решения есть инструмент настройки интерактивных ролей и запретов.
Разберем ситуацию: в платформе 1С существует объект НастройкиКомандногоИнтерфейса. Казалось бы, это именно то, что нужно. Однако, как справедливо замечено в профессиональных обсуждениях, этот объект практически «закрыт» для прямого программного редактирования. У него нет доступных свойств или методов, которые позволили бы нам написать простой код типа Интерфейс.Скрыть("Продажи"). Настройки командного интерфейса хранятся в виде бинарных данных во внутреннем формате системы.
Тем не менее, решение существует. Мы можем использовать механизм Хранилища системных настроек, функциональные опции или расширения. Проанализируем каждый метод пошагово.
Этот метод основан на том, что настройки видимости разделов и команд (те, которые пользователь меняет интерактивно через «Настройку навигации» или «Настройку действий») физически сохраняются в системной таблице базы данных. Мы можем настроить интерфейс «идеально» под одним пользователем (эталоном), а затем программно транслировать эти настройки всем остальным.
Рассмотрим алгоритм реализации этого метода:
ХранилищеСистемныхНастроек.Загрузить(), чтобы получить эти данные.ХранилищеСистемныхНастроек.Сохранить(), чтобы записать эти данные другим пользователям.Пример программного кода для реализации такой задачи в рамках внешней обработки:
// Процедура копирует настройки интерфейса от одного пользователя другому
Процедура КопироватьНастройкиИнтерфейса(ИмяПользователяИсточник, ИмяПользователяПриемник) Экспорт
// Ключи настроек для панелей интерфейса "Такси"
КлючиНастроек = Новый Массив;
КлючиНастроек.Добавить("Общее/ПанельРазделов/Настройки");
КлючиНастроек.Добавить("Общее/ПанельНавигации/Настройки");
КлючиНастроек.Добавить("Общее/ПанельДействий/Настройки");
Для Каждого КлючНастройки Из КлючиНастроек Цикл
// Читаем настройки эталона
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючНастройки, , , ИмяПользователяИсточник);
Если Настройки <> Неопределено Тогда
// Записываем настройки целевому пользователю
ХранилищеСистемныхНастроек.Сохранить(КлючНастройки, , Настройки, , ИмяПользователяПриемник);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним важный нюанс: этот метод не запрещает пользователю зайти в настройки и вернуть всё обратно. Он лишь устанавливает начальную конфигурацию меню. Если ваша задача — именно «убрать лишнее, чтобы не мешалось», это самый быстрый и безопасный способ для типовых конфигураций — задачу упростит конструктор индивидуальных рабочих столов и интерфейсов.
Если нам нужно гарантированно скрыть функционал, который зависит от бизнес-контекста, проанализируем механизм функциональных опций (ФО). Это штатный инструмент платформы 1С для управления видимостью объектов метаданных — помочь в настройке может анализатор прав доступа, ролей и профилей.
Рассмотрим, как это работает:
ФункциональнаяОпция.Если мы привяжем ФО к параметру сеанса, мы сможем программно определять видимость меню в момент старта системы для каждого конкретного пользователя. Посмотрим на пример кода в модуле сеанса:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Определяем, должен ли пользователь видеть расширенное меню
НуженПолныйИнтерфейс = ПроверитьПринадлежностьКГруппеДоступа(Пользователи.ТекущийПользователь());
// Устанавливаем значение параметра сеанса, к которому привязана функциональная опция
ПараметрыСеанса.ИспользоватьРасширенноеМеню = НуженПолныйИнтерфейс;
КонецПроцедуры
Преимущество данного метода заключается в том, что элементы интерфейса исчезают полностью, и пользователь не может включить их через интерактивные настройки «Настройка навигации».
В современных версиях платформы (8.3.x) наиболее правильным подходом для изменения типовых решений является использование расширений. Это позволяет не снимать основную базу с поддержки.
Разберем, как скрыть подсистемы через расширение:
Также в расширении можно использовать программный код для скрытия элементов формы или команд в модуле ПриСозданииНаСервере для конкретных форм, если нужно скрыть команды внутри документов или справочников.
Проанализируем особенности версии платформы 8.3.4 и выше. В интерфейсе «Такси» появилось больше гибкости в управлении панелями. С помощью метода УстановитьСоставПанелей() можно программно менять расположение панелей разделов, инструментов и открытых окон — для этого есть настраиваемая панель виджетов и ссылок для интерфейса.
Однако стоит помнить: УстановитьСоставПанелей управляет глобальными блоками интерфейса, но не содержимым конкретной «Панели разделов». Для тонкой настройки состава команд внутри раздела всё же придется прибегнуть к первому или второму способу, описанному выше.
Мы рассмотрели различные подходы к программному управлению видимостью меню. Подведем итоги:
ХранилищеСистемныхНастроек.Важно помнить, что любые манипуляции с интерфейсом должны быть протестированы под разными правами доступа, чтобы убедиться, что скрытие команд не мешает работе связанных механизмов системы.