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