Как программно скрыть часть меню или команд интерфейса у пользователей в 1С

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

В процессе сопровождения типовых конфигураций 1С часто возникает задача упрощения пользовательского интерфейса. Типовые решения перегружены функционалом, и обычному сотруднику для выполнения повседневных задач требуется не более 5–10% от всех доступных команд. Однако простое отключение прав (ролей) не всегда является выходом: функционал может быть нужен для фоновых процессов, или права жестко завязаны на бизнес-логику, которую нельзя нарушать. В таких ситуациях мы сталкиваемся с необходимостью программно скрыть элементы меню, оставив права доступа нетронутыми — для этого подойдёт универсальный редактор видимости элементов интерфейса.

Рассмотрим детально, какими способами можно добиться чистоты интерфейса, не снимая конфигурацию с поддержки и не изменяя роли пользователей — для решения есть инструмент настройки интерактивных ролей и запретов.

Анализ проблемы: почему стандартные методы не всегда работают

Разберем ситуацию: в платформе 1С существует объект НастройкиКомандногоИнтерфейса. Казалось бы, это именно то, что нужно. Однако, как справедливо замечено в профессиональных обсуждениях, этот объект практически «закрыт» для прямого программного редактирования. У него нет доступных свойств или методов, которые позволили бы нам написать простой код типа Интерфейс.Скрыть("Продажи"). Настройки командного интерфейса хранятся в виде бинарных данных во внутреннем формате системы.

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

Способ №1: Программное копирование настроек через Хранилище системных настроек

Этот метод основан на том, что настройки видимости разделов и команд (те, которые пользователь меняет интерактивно через «Настройку навигации» или «Настройку действий») физически сохраняются в системной таблице базы данных. Мы можем настроить интерфейс «идеально» под одним пользователем (эталоном), а затем программно транслировать эти настройки всем остальным.

Рассмотрим алгоритм реализации этого метода:

  1. Создадим «эталонного» пользователя и вручную настроим его интерфейс, удалив лишние разделы и команды.
  2. Используем метод ХранилищеСистемныхНастроек.Загрузить(), чтобы получить эти данные.
  3. Используем метод ХранилищеСистемныхНастроек.Сохранить(), чтобы записать эти данные другим пользователям.

Пример программного кода для реализации такой задачи в рамках внешней обработки:


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

КонецПроцедуры

Выясним важный нюанс: этот метод не запрещает пользователю зайти в настройки и вернуть всё обратно. Он лишь устанавливает начальную конфигурацию меню. Если ваша задача — именно «убрать лишнее, чтобы не мешалось», это самый быстрый и безопасный способ для типовых конфигураций — задачу упростит конструктор индивидуальных рабочих столов и интерфейсов.

Способ №2: Использование функциональных опций

Если нам нужно гарантированно скрыть функционал, который зависит от бизнес-контекста, проанализируем механизм функциональных опций (ФО). Это штатный инструмент платформы 1С для управления видимостью объектов метаданных — помочь в настройке может анализатор прав доступа, ролей и профилей.

Рассмотрим, как это работает:

  1. В конфигурации (или в расширении) создается объект ФункциональнаяОпция.
  2. В свойстве «Контент» этой опции указываются команды, подсистемы или документы, которые должны скрываться.
  3. Сама опция привязывается к источнику — например, к константе или параметру сеанса.

Если мы привяжем ФО к параметру сеанса, мы сможем программно определять видимость меню в момент старта системы для каждого конкретного пользователя. Посмотрим на пример кода в модуле сеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Определяем, должен ли пользователь видеть расширенное меню
    НуженПолныйИнтерфейс = ПроверитьПринадлежностьКГруппеДоступа(Пользователи.ТекущийПользователь());
    
    // Устанавливаем значение параметра сеанса, к которому привязана функциональная опция
    ПараметрыСеанса.ИспользоватьРасширенноеМеню = НуженПолныйИнтерфейс;
    
КонецПроцедуры

Преимущество данного метода заключается в том, что элементы интерфейса исчезают полностью, и пользователь не может включить их через интерактивные настройки «Настройка навигации».

Способ №3: Программное управление через расширения конфигурации

В современных версиях платформы (8.3.x) наиболее правильным подходом для изменения типовых решений является использование расширений. Это позволяет не снимать основную базу с поддержки.

Разберем, как скрыть подсистемы через расширение:

  1. Создаем новое расширение.
  2. Добавляем в него нужные подсистемы из основной конфигурации.
  3. В расширении мы можем создать свою роль, в которой снимем флаг «Просмотр» у подсистемы.
  4. При назначении этой роли пользователю, вся подсистема целиком исчезнет из командного интерфейса (панели разделов).

Также в расширении можно использовать программный код для скрытия элементов формы или команд в модуле ПриСозданииНаСервере для конкретных форм, если нужно скрыть команды внутри документов или справочников.

Специфика интерфейса «Такси»

Проанализируем особенности версии платформы 8.3.4 и выше. В интерфейсе «Такси» появилось больше гибкости в управлении панелями. С помощью метода УстановитьСоставПанелей() можно программно менять расположение панелей разделов, инструментов и открытых окон — для этого есть настраиваемая панель виджетов и ссылок для интерфейса.

Однако стоит помнить: УстановитьСоставПанелей управляет глобальными блоками интерфейса, но не содержимым конкретной «Панели разделов». Для тонкой настройки состава команд внутри раздела всё же придется прибегнуть к первому или второму способу, описанному выше.

Резюме и рекомендации

Мы рассмотрели различные подходы к программному управлению видимостью меню. Подведем итоги:

Важно помнить, что любые манипуляции с интерфейсом должны быть протестированы под разными правами доступа, чтобы убедиться, что скрытие команд не мешает работе связанных механизмов системы.

← На главную