Каталог решений - Как прятать реквизит…

Как прятать реквизит…

Как прятать реквизит…

В наличии

Задача: Нужно, чтобы определенный пользователь «не видел» определенный реквизит.  

Категория:

Описание

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

 

Т.к. реализация RLS в 1С не позволяет реализовать это (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются). 

А надо, чтобы объекты отображались в списках и открывались,  но определенный пользователь не видел определенный реквизит.

Можно конечно, управлять видимостью данного реквизита (а в комплекте с ним и надписью к нему), но «пустое» поле на форме может вызвать вопросы. Тем более вопросы вызовет отсутствие реквизита, который ТОЧНО должен быть…

Предлагается частное решение — для формы документа и списка документа.

Допустим пользователь с ролью «Просмотр» не должен видеть значение реквизита «Комментарии» в форме документов и в форме их списков.

 

Чтобы не переписывать все документы (их формы и списки) найдем общие для всех них процедуры из «ПриОткрытии» формы документов и форм списков документов:

Для форм документов, это:  

// Установить доступность формы с учетом даты запрета редактирования
РаботаСДиалогами.УстановитьДоступностьФормыДляРедактирования(ЭтотОбъект, ЭтаФорма);
Для форм списков , это –
// Проверка однофирменности
РаботаСДиалогами.УстановитьОтборПоОрганизации(ЭтаФорма, глЗначениеПеременной("УчетПоВсемОрганизациям"), глЗначениеПеременной("ОсновнаяОрганизация"), "ДокументСписок");
Добавим в найденные в п. 1 вызов своих процедур:
Процедура УстановитьДоступностьФормыДляРедактирования(ДокументОбъект, ФормаДокумента) экспорт
…
мойПроцедуры.ПроверкаФормы(ДокументОбъект, ФормаДокумента);
…
КонецПроцедуры         // УстановитьДоступностьФормыДляРедактирования
 
Процедура УстановитьОтборПоОрганизации(Форма, УчетПоВсемОрганизациям, ОсновнаяОрганизация, ИмяРеквизитаСписка, СкрыватьКолонку = Истина, ИмяОтбора = "Организация") Экспорт
…
               МойПроцедуры.ПроверкаФормыСписка(Форма);
…
КонецПроцедуры // УстановитьОтборПоОрганизации()

 

Добавим общий модуль «мойПроцедуры» (галочка «Клиент», но НЕ галочка «Привелигированный») и впишем в него:

 

//Документы
 
Процедура ПроверкаФормы(ДокументОбъект, ФормаДокумента) Экспорт            
Если НЕ РольДоступна("Просмотр") Тогда
                               Возврат;
                Иначе
               ОбработкаОткрываемойФормыДляПросмотра(ДокументОбъект, ФормаДокумента);
КонецЕсли;      
КонецПроцедуры
 
Процедура ОбработкаОткрываемойФормыДляПросмотра(ДокументОбъект, ФормаДокумента)
                СписокРеквизитовПроверки=НОВЫЙ СписокЗначений;
                СписокРеквизитовПроверки.Добавить("Комментарий", , ,);
              
                МетаданныеДокумента = ДокументОбъект.Метаданные();
              
                Для КАЖДОГО текРеквизитПроверки ИЗ СписокРеквизитовПроверки Цикл
                               Если ОбщегоНазначения.ЕстьРеквизитДокумента(текРеквизитПроверки.Значение, МетаданныеДокумента) Тогда                           
               ФормаДокумента.ЭлементыФормы[текРеквизитПроверки.Значение].Данные="";            
               КонецЕсли;
                              
КонецЦикла;
КонецПроцедуры
 
//Списки
Процедура ПроверкаФормыСписка(ТекФорма) Экспорт
Если НЕ РольДоступна("Просмотр") Тогда
               Возврат;
Иначе
               ОбработкаОткрываемойФормыСпискаДляПросмотра(ТекФорма);
КонецЕсли;      
КонецПроцедуры
 
Процедура ОбработкаОткрываемойФормыСпискаДляПросмотра(ТекФорма);
СписокРеквизитовПроверки=НОВЫЙ СписокЗначений;
СписокРеквизитовПроверки.Добавить("Комментарий", , ,);
              
//Перебрать все табличные части
Для КАЖДОГО текРеквизитПроверки ИЗ СписокРеквизитовПроверки Цикл
               Для КАЖДОГО текЭлемент ИЗ ТекФорма.ЭлементыФормы  Цикл
                               Если НЕ ТипЗнч(текЭлемент)=Тип("ТабличноеПоле") Тогда
                                               Продолжить;
                               КонецЕсли;
                               Для КАЖДОГО текКолонкаТабПоля ИЗ текЭлемент.Колонки Цикл
                                               Если текКолонкаТабПоля.Имя=текРеквизитПроверки.Значение Тогда
                                                               текКолонкаТабПоля.Данные="";
                                               КонецЕсли;
                               КонецЦикла;
               КонецЦикла;
КонецЦикла;
КонецПроцедуры

 

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

 

 

has been added to your cart:
Оформление заказа