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