gifts2017

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

Опубликовал anry mc (AnryMc) в раздел Программирование - Практика программирования

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

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

 

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

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

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

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

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

 

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

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

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

 

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

 

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

 

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

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Игорь Исхаков (Ish_2) 16.01.11 13:26
А отчеты , печати документов и т.д. ?
Стоит ли огород городить ?
2. anry mc (AnryMc) 16.01.11 13:47
(1) Я и написал "Предлагается частное решение."
С удовольствием выслушаю предложение, как максимально просто решить задачу.
3. anry mc (AnryMc) 16.01.11 14:00
(1) В 1С (1.0, 3.0, 4.0, 5.0, 6,0, 7.0, 7.5, 7.7, 8.0, 8.1, 8.2) и в Windows (1.0, 2/0, 3.0, 3.1, 3.1 FWG, 3.1 NT, 3.5 NT, 3.51 NT, 95, 4.0 NT, 98, 98 SE, 2000, Me, XP, Windows Fundamentals for Legacy PCs, Vista, HS, S 2008, 7, S 2008 R2) в принципе нельзя ЗАЩИТИТЬ данные, а можно только ЗАТРУДНИТЬ доступ к ним...
:D
4. Владислав Чинючин (vcv) 16.01.11 14:14
(3) Ну, что в 1С "нельзя защищить данные", может быть еще можно согласиться. А при чем тут Windows и чем он не даёт защищать данные?
5. anry mc (AnryMc) 16.01.11 14:52
(4) Ещё не попадал в ситуацию, когда мне очень хотелось что-то сделать в Windows, а политики это запрещали... С большими или меньшими временными затратами я это делал...
6. anry mc (AnryMc) 16.01.11 14:55
7. Ийон Тихий (cool.vlad4) 16.01.11 15:04
(0) Первое впечатление может быть обманчивым, но оно как-то не очень - код не понравился, как альтернативно решить проблему подумаю, но не в выходные. Насчет защиты - вопрос всегда будет спорным доколе спорящие стороны не договорятся о том какой смысл они вкладывают в это - "защита данных" - в зависимости от смысла может и результат быть разным - и да (т.е. можно защитить) и нет (невозможно)
8. anry mc (AnryMc) 16.01.11 15:24
(7) Хочется увидеть результат обещания.
Feci, quod potui, faciant meliora potentes
9. Alexandr_P (Русский) 16.01.11 15:32
(0) переходите на 8.2, там есть пользовательская видимость (видимость по ролям) :!:
10. Ийон Тихий (cool.vlad4) 16.01.11 18:06
(8) может быть, но только я ничего не обещал...
ЗЫ הבלים ;)
11. Игорь Исхаков (Ish_2) 16.01.11 18:28
(2) Нет у меня решения.
Стоило указать в теме , что решение не претендует на полное сокрытие информации о реквизите,
т.к. есть еще печатные формы - и никаких вопросов и придирок бы не возникло.
Просто такие важные вопросы не стоит оставлять по умолчанию - а указывать явно.
cool.vlad4; +1 Ответить 2
12. Ийон Тихий (cool.vlad4) 16.01.11 18:41
Согласен с (11), сокрытие реквизита в данном случае же не абсолютно, а только для форм и "списков" форм с указанными в публикации процедурами(конф-цию тогда можно указать)
13. anry mc (AnryMc) 16.01.11 18:55
(11) Согласен - подправил "Предлагается частное решение - для формы документа и списка документа"
(12) האמת
14. maxp77 (maxp77) 17.01.11 01:05
"Т.к. реализация RLS в 1С не позволяет реализовать это (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются). "
- неверное утверждение, 4 года назад я с этим уже боролся и поборол, вот обсуждение и решение:
http://www.forum.mista.ru/topic.php?id=248242
15. Игорь Исхаков (Ish_2) 17.01.11 11:27
(14) Здесь изложить сможете ?
16. anry mc (AnryMc) 17.01.11 20:57
(14) Насколько я понял по ссылке находиться решение, когда в список документов не попадают документы с определенным значением реквизита. И такие документы вообще не открываются. А мне нужно не показывать значение определенного реквизита (т.е. в списке видны все документы и выводятся все реквизиты, но один реквизит "пустой").
17. maxp77 (maxp77) 18.01.11 09:29
(16) Там решение задачи: необходимо, чтобы часть реквизитов документов(справочников) некоторым пользователям(то бишь одной роли) были недоступны для чтения, если в настройках списка документов или среди полей выборки в запросе присутсвует отсекаемый реквизит (он видим в списке), то данные из базы не получаются; отсутствует (не видим) - все документы видны; тоже самое с формой документа: отсекаемый реквизит присутсвует на форме - форма не откроется вообще, отсутствует - откроется. P.S. На кой в списке документов показывать целиком пустую колонку, ее нужно предварительно сделать невидимой для пользователя - кому не стоит, тот даже знать не будет о существовании отсекаемого реквизита.
(15) извините, некогда отсекать зерна от плевел.
18. Игорь Исхаков (Ish_2) 18.01.11 09:54
19. anry mc (AnryMc) 18.01.11 20:44
(17) Может я туплю, но в (0) я и написал " (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются)", т.е. я это решение знаю, но меня оно не устраивает.
В приведенной вами в (14) ссылке решения нет только обсуждение.
20. Вадим Никонов (V.Nikonov) 19.01.11 18:05
Есть ещё одина идея решения проблемы: Реквизит - вещь условная, есть пользовательское понятие реквизита (то что на экране) и программисткое (компонент объекта). Я проектировал подобные вещи выселяя частично открытые "реквизиты" в свойства объекта или связанные справочники. При этом приходилось писать код вывода на экран и управления доступом.
В списке свойств, можно пропускать некоторые ("запрещённые") строки. Одиночные реквизиты выносить на вкладки и не открывать вкладку формы, скрывать "защищённые" колонки списков...
21. bulpi bulpi (bulpi) 19.01.11 21:39
Похоже, я туплю :?:
Что мешает написать
Если Не РольДоступна("ПолныеПрава") Тогда ЭлементыФормы.Реквизит.Видимость=Ложь КонецЕсли;
?????
22. Ийон Тихий (cool.vlad4) 19.01.11 22:51
(21) Ну этот прием стар как мир, где-то на ИС даже целая конфа на эту тему - можно еще для разнообразия(в зависимости от целей) использовать ТолькоПросмотр, Доступность(у себя в конфе так и сделал) - но все это свойства элементовформ, т.е. прочитать реквизиты все равно есть возможность(почему я и промолчал)
23. anry mc (AnryMc) 20.01.11 12:32
(21) Если сделать реквизит невидимым, а пользователь знает, что он должен быть, возникают вопросы... а иногода желание и стремление увидеть скрытое...
А так поле есть, но в нем ничего нет...
24. Ийон Тихий (cool.vlad4) 20.01.11 12:41
(23) Поле есть, а данных нет - во-первых это дезинформация, а во-вторых - как пользователь узнает, что в поле действительно ничего нет или это у него так заблокировано и в-третьих как пользователь определяет, что данное поле соотносится с данным реквизитом, вследствие чего у него не возникает вопросов?
25. anry mc (AnryMc) 20.01.11 15:38
(24) Согласитесь, что жизнь сложна и многообразна… Возможно и надо ввести в заблуждение… А когда не показываются документы по RLS – это не ввод в заблуджение?
Скажем так – это требование заказчика показывать все документы, но не показывать определенные реквизиты в них.
26. mc2 26.01.11 11:17
Т.к. реализация RLS в 1С не позволяет реализовать это (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются).

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


А не проще перейти на 1С 8.2 где RLS позволяет установить доступ по ролям к любому реквизиту, я этим уже больше года пользуюсь и никаких проблем нет...
27. anry mc (AnryMc) 08.03.11 19:05
(26) После отказа 1С от поддержки 81, клиенту придется перейти на 82. Воспользуюсь Вашим советом.
28. Роман Романов (romansun) 08.03.11 22:01
(23)(26)
а в 8.2 есть возможность именно показать пустое поле? Ведь, я так понял, надо само поле-то показать, а вот значение в нём - нет :).

У моих пациентов до показа пустых полей дело как-то не дошло... Но некую систему прав для регулирования всех этих видимостей и доступностей пришлось мутить.
29. mc2 08.03.11 22:19
romansun пишет:

(23)(26)

а в 8.2 есть возможность именно показать пустое поле? Ведь, я так понял, надо само поле-то показать, а вот значение в нём - нет .



У моих пациентов до показа пустых полей дело как-то не дошло... Но некую систему прав для регулирования всех этих видимостей и доступностей пришлось мутить.


В управляемых формах если поле недоступно пользователю, то оно не отображается вообще. На обычных формах я не проверял. Но в принципе не понятно зачем отображать поле без информации? Чтобы юзера унизить? :)
30. anry mc (AnryMc) 08.03.11 22:35
вообще мне интересно - программисты делают то что хочет заказчик, или берут деньги за вопросы: "А зачем?..."
Это вообще область инжиниринга и консалтинга, но не программирования
31. Иван (Spartan) 09.03.11 08:37
AnryMc пишет:

вообще мне интересно - программисты делают то что хочет заказчик, или берут деньги за вопросы: "А зачем?..."
Это вообще область инжиниринга и консалтинга, но не программирования

Хорошие программисты берут деньги за то, что хочет заказчик, если это ему действительно нужно, не противоречит здравому смыслу, логике системы и не достигается стандартными средствами.
CaSH_2004; +1 Ответить
32. Олег Шалимов (CaSH_2004) 23.11.11 16:28
(30)Если программист будет делать только то что хочет заказчик, то потом он все будет это переделывать т.к. заказчик не знал что "это неправильно", потому что программист постеснялся спросить "зачем это надо".
У меня такое сплошь и рядом, поэтому часто я трачу 30 мин. на выяснение вопроса, и 5 мин. на написание кода, и не исправляю потом то что не нужно.
Собственно если бы так как вы предлогаете поступили бы с вами, то и вам бы это потом не понравилось, уверен.
33. anry mc (AnryMc) 06.05.13 18:05
(32) CaSH_2004,

В принципе согласен, но...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа