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