Как программно настроить панель навигации и состав разделов пользователя в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 (управляемое приложение) часто возникает задача гибкой настройки интерфейса для конкретных пользователей. Стандартный механизм ролей и прав доступа не всегда позволяет реализовать сложную логику отображения, когда видимость раздела или команды зависит не только от прав, но и от конкретных настроек, констант или должностных обязанностей сотрудника в данный момент времени — в таких случаях поможет инструмент гибкой настройки ролей и видимости форм без конфигуратора.

Рассмотрим два основных подхода к решению этой задачи, которые обсуждались специалистами: использование механизма Хранилища системных настроек (для прямой манипуляции интерфейсом) и использование Функциональных опций (для архитектурного управления видимостью). Для глубокого анализа их влияния на интерфейс есть отчет для анализа влияния функциональных опций и ролей на видимость объектов.

Подход 1: Программное изменение настроек интерфейса

Управляемый интерфейс 1С хранит пользовательские настройки (расположение панелей, видимость команд) в системном хранилище. Мы можем программно обращаться к этому хранилищу, считывать текущие настройки, модифицировать их и записывать обратно. Это позволяет "навязать" пользователю определенный вид интерфейса при входе в систему — для быстрого решения этой задачи подойдёт конструктор адаптивных рабочих столов и интерфейсов в 1С.

Для работы с настройками используется глобальный объект ХранилищеСистемныхНастроек. Главная сложность заключается в знании правильных ключей (путей) к конкретным элементам интерфейса.

Ключи доступа к настройкам

Для доступа к различным частям интерфейса используются следующие строковые идентификаторы (ключи объекта):

  1. Панель разделов (верхняя или боковая панель с подсистемами):
    "Общее/ПанельРазделов/НастройкиКомандногоИнтерфейса"
    (или на английском: "Common/SectionsPanel/CommandInterfaceSettings")
  2. Панель навигации основного раздела (команды "Рабочего стола"):
    "ОсновнойРаздел/ПанельНавигации/НастройкиКомандногоИнтерфейса"
    ("MainSection/NavigationPanel/CommandInterfaceSettings")
  3. Панель действий основного раздела (команды создания):
    "ОсновнойРаздел/ПанельДействий/НастройкиКомандногоИнтерфейса"
    ("MainSection/ActionsPanel/CommandInterfaceSettings")
  4. Панель навигации конкретной подсистемы:
    Путь формируется динамически: ПолноеИмяПодсистемы + "/ПанельНавигации/НастройкиКомандногоИнтерфейса"
    Пример: "Подсистема.Продажи/ПанельНавигации/НастройкиКомандногоИнтерфейса"

Алгоритм изменения настроек

Давайте разберем процесс программного изменения. Логика следующая: мы загружаем настройки (если их нет — создаем или получаем пустые), меняем видимость нужных элементов и сохраняем обратно.

Пример кода для сохранения настройки:


// Пример сохранения настройки для панели действий основного раздела
КлючОбъекта = "ОсновнойРаздел/ПанельДействий/НастройкиКомандногоИнтерфейса";
ИмяНастройки = ""; // Пустая строка для настроек по умолчанию
Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, ИмяНастройки);

// Если настройки еще не существуют, их нужно сформировать.
// Внимание: объект НастройкиКомандногоИнтерфейса сложно создать с нуля конструктором,
// проще всего взять эталонную настройку, настроенную вручную, и скопировать её.

// После модификации сохраняем:
ХранилищеСистемныхНастроек.Сохранить(КлючОбъекта, ИмяНастройки, Настройки);

Важная особенность: Создать объект НастройкиКомандногоИнтерфейса полностью программно "с чистого листа" достаточно трудоемко, так как он содержит коллекции видимости команд, привязанные к уникальным идентификаторам. Поэтому на практике часто используют следующий прием:

  1. Администратор настраивает интерфейс "эталонно" в режиме 1С:Предприятие.
  2. Программно считывает эту настройку из хранилища.
  3. Сериализует её (например, в XML или XDTO) или просто копирует объект.
  4. Применяет эту настройку для других пользователей, записывая её в их хранилище настроек.

Подход 2: Использование Функциональных опций (Рекомендуемый)

Если задача состоит в том, чтобы скрыть или показать целые подсистемы или группы команд в зависимости от настроек пользователя (например, "Пользователь имеет доступ к закупкам"), более правильным архитектурным решением является использование Функциональных опций (ФО).

Этот метод предложил автор темы как наиболее стабильное решение. Суть его заключается в создании связки: Регистр сведений -> Функциональная опция -> Интерфейс.

Пошаговая реализация

Разберем, как это настроить в Конфигураторе и режиме Предприятия.

Шаг 1. Создаем объект хранения настроек.

Создадим регистр сведений, например, НастройкиДоступаКПодсистемам.

Шаг 2. Создаем Функциональные опции.

Для каждого ресурса создаем отдельную Функциональную опцию в дереве метаданных.

Шаг 3. Параметры функциональных опций.

Так как наш регистр имеет измерение Пользователь, нам нужно создать Параметр функциональной опции.

Преимущества подхода с Функциональными опциями

Использование этого метода дает ряд преимуществ перед прямой правкой системных настроек:

  1. Стабильность: Вы не зависите от внутренних идентификаторов команд интерфейса, которые могут меняться.
  2. Управляемость: Администратор может просто поставить галочки в регистре сведений, и интерфейс пользователя перестроится автоматически.
  3. Производительность: Платформа 1С оптимизирована для работы с ФО, скрытие элементов происходит на уровне ядра.

Дополнительные возможности: ИнструментыКомандногоИнтерфейса

Если вам все же необходимо работать с панелью навигации программно (например, скрывать конкретные команды отчетов внутри подсистемы), но вы не хотите использовать ФО, обратите внимание на объект ИнструментыКомандногоИнтерфейса. Он доступен на сервере.

С помощью метода ПолучитьКоманды() можно проанализировать, какие команды вообще доступны в данной подсистеме, чтобы затем точечно отключить их видимость в объекте настроек.


// Пример получения списка команд для подсистемы
Команды = ИнструментыКомандногоИнтерфейса.ПолучитьКоманды("Подсистема.Продажи");
// Команды - это ТаблицаЗначений, содержащая информацию о всех навигационных ссылках
Для Каждого СтрокаКоманды Из Команды Цикл
    // Здесь можно проанализировать имена команд, чтобы знать,
    // какой Id искать в НастройкахКомандногоИнтерфейса для отключения
КонецЦикла;

Выводы

Проанализируем полученные решения:

← На главную