Как скрыть вкладку или документ в интерфейсе 1С, сохранив права доступа пользователя

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

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

Способ 1. Использование командного интерфейса подсистемы

Это один из самых эффективных способов, который позволяет жестко задать видимость команд для каждой конкретной роли. Разберем по шагам, как это реализовать:

  1. Откроем Конфигуратор и найдем в дереве метаданных нужную нам Подсистему, в которой отображается объект.
  2. В окне свойств подсистемы нажмем на ссылку Командный интерфейс.
  3. Перед нами откроется таблица, где в строках указаны команды (например, создание или просмотр списка документов), а в колонках — Роли, определенные в системе.
  4. Проанализируем список ролей. Найдем колонку, соответствующую роли «Рядовой пользователь», и снимем галочку в поле Видимость напротив нужного документа.
  5. Для роли «Администратор» оставим галочку включенной.

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

Способ 2. Разделение объектов по подсистемам и настройка прав

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

Проанализируем алгоритм действий:

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

Если у пользователя нет роли с правом Просмотр на конкретную подсистему, он не увидит ни саму вкладку в интерфейсе, ни объекты, которые в нее включены, даже если права на чтение и изменение самих данных у него остаются. Для анализа ролей и профилей с доступом к объекту подойдёт обработка для быстрой проверки прав доступа на объект метаданных.

Способ 3. Применение функциональных опций

Функциональные опции — это наиболее «архитектурно правильный» метод управления интерфейсом в современных конфигурациях. Посмотрим, как настроить скрытие объекта с их помощью:

  1. Создадим новый объект ФункциональнаяОпция.
  2. В качестве Хранилища для нее выберем либо константу, либо ПараметрСеанса (если видимость должна зависеть от текущего пользователя).
  3. На закладке Состав отметим наш документ или команду в соответствующей подсистеме.
  4. В коде при старте системы или в параметрах сеанса установим значение этой опции в Ложь для рядовых пользователей и в Истина для администраторов.

Система автоматически перестроит интерфейс, скрыв все объекты, привязанные к выключенной опции. Это позволяет динамически управлять составом меню без изменения ролей.

Способ 4. Программное управление при компоновке интерфейса

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

Разберем пример кода, который можно разместить в процедуре ПриКомпоновкеИнтерфейса:


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

Этот метод дает максимальную гибкость, так как позволяет программно обходить дерево командного интерфейса и скрывать любые элементы на лету.

Способ 5. Управление настройками через БСП

Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), мы можем воспользоваться типовыми инструментами администратора. Выясним, как это сделать без программирования:

  1. Зайдем в систему под пользователем с правами администратора.
  2. Настроим интерфейс «под пользователя»: нажмем на кнопку меню, выберем Настройки — Настройка навигации и удалим ненужные пункты (например, документ «Заявки») из правой колонки в левую.
  3. Перейдем в раздел Администрирование — Обслуживание — Управление настройками.
  4. Выберем операцию Копирование настроек.
  5. Укажем в качестве источника текущего администратора, а в качестве получателей — необходимых пользователей или целую группу.
  6. В списке настроек выберем только Настройки интерфейса.

Внимание: Чтобы пользователи не вернули всё обратно, в той же панели управления настройками можно установить запрет на изменение личных настроек интерфейса для определенных групп. При необходимости централизованного сброса или проверки параметров можно воспользоваться инструментом для просмотра и очистки хранилища настроек пользователей.

Способ 6. Программный отказ в форме списка

Если все вышеперечисленные методы кажутся избыточными, и нужно просто «отвадить» пользователя от случайного открытия списка, можно использовать проверку непосредственно в форме объекта. Разберем этот сценарий:

В модуле формы списка документа Заявки пропишем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Не РольДоступна("Администратор") Тогда
        // Сообщаем пользователю причину, если это необходимо
        ТекстСообщения = "У вас есть права на документы, но просмотр общего списка ограничен.";
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        // Отменяем открытие формы
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Однако помните, что Отказ = Истина полностью блокирует доступ к форме списка. Если пользователю все же нужно открывать список для выбора в других документах, этот метод не подойдет.

Нюансы с «Историей» и «Избранным»

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

Чтобы исключить визуальное присутствие полностью, необходимо в свойствах документа в Конфигураторе установить параметр Использовать стандартные команды в значение Ложь (если вы используете свои команды) или программно очищать историю при завершении работы, что является более трудоемкой задачей.

Подводя итог, наиболее сбалансированным решением для большинства задач является настройка видимости в Командном интерфейсе подсистемы или использование Функциональных опций. Эти методы позволяют сохранить чистоту интерфейса и при этом не нарушают логику прав доступа в системе.

← На главную