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