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