Как программно ограничить изменение элементов из контекстного меню формы выбора в 1С

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

При разработке пользовательских интерфейсов в управляемом приложении 1С:Предприятие 8.3 часто возникает задача ограничить возможность редактирования справочников непосредственно из формы выбора. Например, требуется запретить обычным пользователям модифицировать существующие карточки контрагентов при подборе в документ, сохранив при этом возможность добавления новых элементов и редактирования данных из основного списка справочника.

Проанализируем, почему возникает эта проблема и какими способами можно программно заблокировать изменение данных через контекстное меню и командную панель динамического списка.

Выясним причину поведения платформы

Разберем, почему стандартный пункт меню «Изменить» не удается отключить простым управлением свойствами кнопок командной панели:

  1. Автоматическое формирование контекстного меню. В управляемых формах платформы 1С стандартные пункты контекстного меню для таблицы с динамическим списком генерируются платформой динамически. Они отсутствуют в виде явных элементов формы в дереве элементов ПодчиненныеЭлементы контекстного меню.
  2. Независимость командной панели и контекстного меню. Изменение свойств Доступность или Видимость для кнопки на командной панели отключает только саму кнопку над списком, но не влияют на автогенерируемый пункт контекстного меню.
  3. Ограничения свойства ИзменятьСоставСтрок. Отключение свойства таблицы ИзменятьСоставСтрок = Ложь убирает команду «Изменить», однако одновременно блокирует команду «Создать», что не всегда подходят под бизнес-требования.

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

Способ 1. Полное отключение доступности контекстного меню

Простейший вариант — отключить доступность всего контекстного меню динамического списка и кнопки на командной панели для пользователей, у которых отсутствуют административные права.

Рассмотрим пример кода, который вызывается в обработчике ПриСозданииНаСервере или ПриОткрытии управляемой формы:


ПолныеПрава = РольДоступна("ПолныеПрава");

// Отключаем доступность контекстного меню списка
Элементы.СписокКонтрагенты.КонтекстноеМеню.Доступность = ПолныеПрава;

// Отключаем кнопку "Изменить" на командной панели
КнопкаИзменить = Элементы.СписокКонтрагенты.КоманднаяПанель.ПодчиненныеЭлементы.Найти("СписокКонтрагентыКнопкаИзменить");
Если КнопкаИзменить <> Неопределено Тогда
    КнопкаИзменить.Доступность = ПолныеПрава;
КонецЕсли;

Недостаток способа: отключение доступности контекстного меню полностью лишает пользователя всех команд меню для данной таблицы (включая поиск, настройку списка и добавление новых строк).

Способ 2. Блокировка события ПередНачаломИзменения (Рекомендуемый)

Более гибкий и корректный подход — оставить пункт меню и горячие клавиши (F2, Enter) видимыми, но перехватить само действие изменения на клиенте.

Разберем по шагам реализацию этого варианта:

  1. В форме выбора для элемента таблицы динамического списка нажимаем на событие ПередНачаломИзменения и создаем клиентский обработчик.
  2. В тексте процедур проверяем права пользователя и при отсутствии нужной роли отменяем стандартную обработку через параметр Отказ = Истина.

Проанализируем пример кода обработчика:


&НаКлиент
Процедура СписокПередНачаломИзменения(Элемент, Отказ, ВозможностьРедактирования)
    
    Если НЕ РольДоступна("ПолныеПрава") Тогда
        Отказ = Истина;
        ПоказатьПредупреждение(, НСтр("ru = 'Редактирование элементов из формы выбора запрещено. Перейдите в основной справочник.'"));
    КонецЕсли;
    
КонецПроцедура

При таком подходе кнопка «Создать» продолжает работать в штатном режиме, а любая попытка открыть карточку на редактирование (через контекстное меню, двойной клик или клавишу F2) успешно блокируется.

Способ 3. Ручное формирование состава контекстного меню

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

  1. В дереве элементов формы выделяем элемент КонтекстноеМеню таблицы динамического списка.
  2. В окне свойств убираем флаг Автозаполнение.
  3. Вручную добавляем в контекстное меню только разрешенные стандартные команды динамического списка (например, «Создать», «Выбрать», «Обновить»).

Поскольку команды теперь добавлены явно, мы сможем обращаться к ним из кода программно и управлять их свойством Доступность или Видимость:

Элементы.КонтекстноеМенюСписокИзменить.Видимость = РольДоступна("ПолныеПрава");

Способ 4. Перевод открываемой формы элемента в режим ТолькоПросмотр

Если требуется разрешить пользователю открывать форму элемента для ознакомления, но запретить запись изменений при вызове из формы выбора, проанализируем настройку самой формы объекта.

В модуле формы элемента справочника в обработчике ПриСозданииНаСервере проверим контекст открытия:


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

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

← На главную