Как ограничить список документов при вводе на основании в 1С:УПП?

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

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

Разберем ситуацию: в метаданных документа-основания (например, «Заказ покупателя») указано 15 типов документов, которые могут быть созданы на его основе. Мы настроили роль менеджера так, что он может создавать только «Реализацию товаров и услуг» и «Счет на оплату». Однако при нажатии на стандартную кнопку «Заполнить на основании» менеджер по-прежнему видит все 15 пунктов.

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

Решение №1: Создание собственной кнопки «Ввод на основании»

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

Рассмотрим алгоритм реализации по шагам:

  1. Откроем форму документа-основания в конфигураторе.
  2. Найдем основную командную панель формы.
  3. У стандартной кнопки ДействиеЗаполнитьНаОсновании (или аналогичной платформенной) снимем признак видимости или вовсе удалим ее из автозаполнения.
  4. Добавим свою кнопку (или подменю) с названием «Создать на основании».
  5. Напишем обработчик нажатия, который будет проверять права пользователя программно.

Посмотрим на пример кода, который можно использовать в обработчике нажатия вашей кнопки:


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

Использование функции ПравоДоступа с параметром "ИнтерактивноеДобавление" гарантирует, что пользователь увидит в списке только те объекты, которые он действительно может создать.

Решение №2: Программное управление стандартной панелью

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

Проанализируем ситуацию: платформа создает кнопки автоматически. Мы можем обратиться к коллекции кнопок командной панели в обработчике ПриОткрытии.


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

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

Решение №3: Изменение метаданных (Глобальный подход)

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

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

Осторожно: Этот метод затронет абсолютно всех пользователей, включая администраторов. Если вам нужно ограничить список только для роли «Менеджер», этот способ не подойдет.

Особенности работы с ролью «Пользователь» в УПП

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

Проанализируем структуру системы: роль Пользователь содержит права на критически важные объекты:

Если вы уберете эту роль, при входе в систему переменная ПараметрыСеанса.ТекущийПользователь не будет инициализирована. Это приведет к тому, что во всех запросах RLS (которые часто опираются на это значение) возникнет ошибка, и пользователь не сможет увидеть даже те данные, на которые у него есть права. Вместо удаления роли, следует создать копию роли Пользователь, назвав её, например, ОграниченныйПользователь, и аккуратно убрать из неё права на просмотр лишних журналов и документов, сохранив при этом доступ к системным механизмам.

Заключение

Для эффективного решения задачи в УПП мы рекомендуем придерживаться следующей стратегии:

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

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

← На главную