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