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

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

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

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

Причина ошибки: различие между данными объекта и элементами формы

Выясним причину, почему конструкций вида Объект.СкладОтправитель.Доступность = Ложь не существует. В платформе 1С:Предприятие 8.3 данные и элементы их отображения четко разделены:

  1. Объект (данные формы): Объект.СкладОтправитель хранит ссылку на справочник или значение поля. У данных нет визуальных свойств вроде Доступность или ТолькоПросмотр.
  2. Элементы формы (интерфейс): Элементы.СкладОтправитель представляет собой поле ввода на форме. Именно этот элемент управляет тем, как реквизит отображается и доступен ли он для взаимодействия.

Кроме того, обработчик ПриЧтенииНаСервере вызывается только при открытии или перечитывании уже записанного документа. Если пользователь создает новый документ, этот обработчик не сработает, и поле останется открытым для редактирования.

Способ 1. Программное ограничение доступа на сервере

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

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

  1. Доступность = Ложь — полностью блокирует элемент, делает его серым и неактивным. Пользователь не сможет скопировать значение или перейти в карточку справочника.
  2. ТолькоПросмотр = Истина — предпочтительный вариант. Запрещает изменение значения, но сохраняет возможность выделения текста, копирования и перехода по гиперссылке в выбранный объект.

Посмотрим на пример реализации кода с проверкой прав пользователя:


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

Если требуется заблокировать поле полностью, используем свойство доступности:


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

Способ 2. Интерактивная настройка в Конфигураторе

Рассмотрим вариант решения без написания программного кода. Платформа 1С 8.3 позволяет настроить права на редактирование конкретного реквизита формы прямо в редакторе управляемой формы.

Разберем процесс настройки по шагам:

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

Данная настройка жестко связывает возможность изменения реквизита с ролями пользователя на уровне самой формы без необходимости править модуль формы.

Способ 3. Бесконфликтная доработка через Расширение конфигурации

Чтобы не снимать типовую форму с поддержки (например, в «1С:Бухгалтерии Предприятия»), рекомендуется выносить подобную логику в расширение конфигурации.

Для этого добавим форму документа в расширение и создадим обработчик с аннотацией &После:


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

Важно помнить: если родительская группа или вся форма переведена в режим ТолькоПросмотр = Истина, включить доступность для одного отдельного вложенного элемента не получится, так как платформенный запрет контейнера имеет высший приоритет.

← На главную