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