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

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

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

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

Почему платформа не скрывает пункты подменю автоматически?

Проанализируем работу механизма в обычных формах:

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

Способ 1. Замена стандартной кнопки на динамическое подменю

Наиболее аккуратный способ решения задачи без дублирования элементов интерфейса — отключение автозаполнения стандартной командной панели и программное формирование состава подменю.

Разберем по шагам, как реализовать этот алгоритм:

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

Посмотрим на пример кода формирования подменю в событии ПриОткрытии:


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

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


Процедура ОбработкаВводаНаОсновании(Кнопка)
    
    ИмяДокумента = Кнопка.Подсказка;
    
    Если ЗначениеЗаполнено(ИмяДокумента) Тогда
        // Создаем структуру параметров или передаем ссылку в качестве основания
        ПараметрыФормы = Новый Структура("Основание", Ссылка);
        ОткрытьФорму("Документ." + ИмяДокумента + ".ФормаОбъекта", ПараметрыФормы);
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Управление видимостью кнопок существующей панели

Если в конфигурации командная панель уже сформирована вручную (автозаполнение отключено) и кнопки ввода на основании добавлены в конфигураторе как фиксированное подменю, нет необходимости создавать его заново через метод Добавить. Достаточно динамически управлять свойством Видимость существующих элементов.

Рассмотрим, как скрыть ненужные пункты в процедуре ПриОткрытии:


Процедура ПриОткрытии()

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

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

Важные нюансы при реализации

При внедрении выборочного ввода на основании важно учитывать следующие моменты:

  1. Формы списков и журналы: Пользователи часто вводят документы на основании не из открытого документа, а из формы списка или журнала документов. Описанные изменения командной панели необходимо продублировать и в форме списка соответствующего документа.
  2. Защита на уровне объекта: Настройка видимости кнопок в интерфейсе защищает от ошибочных нажатий, но не отменяет необходимости корректной проверки прав в модуле объекта. В обработчике ОбработкаЗаполнения создаваемого документа рекомендуется оставлять типовые проверки заполнения реквизитов.
← На главную