В практике разработки на платформе 1С:Предприятие 8.3 (управляемое приложение) часто возникает задача гибкой настройки интерфейса для конкретных пользователей. Стандартный механизм ролей и прав доступа не всегда позволяет реализовать сложную логику отображения, когда видимость раздела или команды зависит не только от прав, но и от конкретных настроек, констант или должностных обязанностей сотрудника в данный момент времени — в таких случаях поможет инструмент гибкой настройки ролей и видимости форм без конфигуратора.
Рассмотрим два основных подхода к решению этой задачи, которые обсуждались специалистами: использование механизма Хранилища системных настроек (для прямой манипуляции интерфейсом) и использование Функциональных опций (для архитектурного управления видимостью). Для глубокого анализа их влияния на интерфейс есть отчет для анализа влияния функциональных опций и ролей на видимость объектов.
Управляемый интерфейс 1С хранит пользовательские настройки (расположение панелей, видимость команд) в системном хранилище. Мы можем программно обращаться к этому хранилищу, считывать текущие настройки, модифицировать их и записывать обратно. Это позволяет "навязать" пользователю определенный вид интерфейса при входе в систему — для быстрого решения этой задачи подойдёт конструктор адаптивных рабочих столов и интерфейсов в 1С.
Для работы с настройками используется глобальный объект ХранилищеСистемныхНастроек. Главная сложность заключается в знании правильных ключей (путей) к конкретным элементам интерфейса.
Для доступа к различным частям интерфейса используются следующие строковые идентификаторы (ключи объекта):
"Общее/ПанельРазделов/НастройкиКомандногоИнтерфейса"
"Common/SectionsPanel/CommandInterfaceSettings")"ОсновнойРаздел/ПанельНавигации/НастройкиКомандногоИнтерфейса"
"MainSection/NavigationPanel/CommandInterfaceSettings")"ОсновнойРаздел/ПанельДействий/НастройкиКомандногоИнтерфейса"
"MainSection/ActionsPanel/CommandInterfaceSettings")ПолноеИмяПодсистемы + "/ПанельНавигации/НастройкиКомандногоИнтерфейса"
"Подсистема.Продажи/ПанельНавигации/НастройкиКомандногоИнтерфейса"Давайте разберем процесс программного изменения. Логика следующая: мы загружаем настройки (если их нет — создаем или получаем пустые), меняем видимость нужных элементов и сохраняем обратно.
Пример кода для сохранения настройки:
// Пример сохранения настройки для панели действий основного раздела
КлючОбъекта = "ОсновнойРаздел/ПанельДействий/НастройкиКомандногоИнтерфейса";
ИмяНастройки = ""; // Пустая строка для настроек по умолчанию
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, ИмяНастройки);
// Если настройки еще не существуют, их нужно сформировать.
// Внимание: объект НастройкиКомандногоИнтерфейса сложно создать с нуля конструктором,
// проще всего взять эталонную настройку, настроенную вручную, и скопировать её.
// После модификации сохраняем:
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, ИмяНастройки, Настройки);
Важная особенность: Создать объект НастройкиКомандногоИнтерфейса полностью программно "с чистого листа" достаточно трудоемко, так как он содержит коллекции видимости команд, привязанные к уникальным идентификаторам. Поэтому на практике часто используют следующий прием:
Если задача состоит в том, чтобы скрыть или показать целые подсистемы или группы команд в зависимости от настроек пользователя (например, "Пользователь имеет доступ к закупкам"), более правильным архитектурным решением является использование Функциональных опций (ФО).
Этот метод предложил автор темы как наиболее стабильное решение. Суть его заключается в создании связки: Регистр сведений -> Функциональная опция -> Интерфейс.
Разберем, как это настроить в Конфигураторе и режиме Предприятия.
Шаг 1. Создаем объект хранения настроек.
Создадим регистр сведений, например, НастройкиДоступаКПодсистемам.
Пользователь (СправочникСсылка.Пользователи).ДоступКПродажам, ДоступКЗакупкам.Шаг 2. Создаем Функциональные опции.
Для каждого ресурса создаем отдельную Функциональную опцию в дереве метаданных.
ИспользоватьПодсистемуПродажи.РегистрСведений.НастройкиДоступаКПодсистемам.Ресурс.ДоступКПродажам.Шаг 3. Параметры функциональных опций.
Так как наш регистр имеет измерение Пользователь, нам нужно создать Параметр функциональной опции.
ТекущийПользователь.
ПараметрыСеанса.ТекущийПользователь = Пользователи.ТекущийПользователь();
Использование этого метода дает ряд преимуществ перед прямой правкой системных настроек:
Если вам все же необходимо работать с панелью навигации программно (например, скрывать конкретные команды отчетов внутри подсистемы), но вы не хотите использовать ФО, обратите внимание на объект ИнструментыКомандногоИнтерфейса. Он доступен на сервере.
С помощью метода ПолучитьКоманды() можно проанализировать, какие команды вообще доступны в данной подсистеме, чтобы затем точечно отключить их видимость в объекте настроек.
// Пример получения списка команд для подсистемы
Команды = ИнструментыКомандногоИнтерфейса.ПолучитьКоманды("Подсистема.Продажи");
// Команды - это ТаблицаЗначений, содержащая информацию о всех навигационных ссылках
Для Каждого СтрокаКоманды Из Команды Цикл
// Здесь можно проанализировать имена команд, чтобы знать,
// какой Id искать в НастройкахКомандногоИнтерфейса для отключения
КонецЦикла;
Проанализируем полученные решения:
ХранилищеСистемныхНастроек, обращаясь к путям вида .../NavigationPanel/CommandInterfaceSettings.