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