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