bdd2

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

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

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

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

 

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

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

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

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

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

 

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

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

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

 

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

 

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

 

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

 

 

См. также

Добавить вознаграждение
Комментарии
1. Игорь Исхаков (Ish_2) 954 16.01.11 13:26 Сейчас в теме
А отчеты , печати документов и т.д. ?
Стоит ли огород городить ?
2. anry mc (AnryMc) 706 16.01.11 13:47 Сейчас в теме
(1) Я и написал "Предлагается частное решение."
С удовольствием выслушаю предложение, как максимально просто решить задачу.
3. anry mc (AnryMc) 706 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) 82 16.01.11 14:14 Сейчас в теме
(3) Ну, что в 1С "нельзя защищить данные", может быть еще можно согласиться. А при чем тут Windows и чем он не даёт защищать данные?
5. anry mc (AnryMc) 706 16.01.11 14:52 Сейчас в теме
(4) Ещё не попадал в ситуацию, когда мне очень хотелось что-то сделать в Windows, а политики это запрещали... С большими или меньшими временными затратами я это делал...
6. anry mc (AnryMc) 706 16.01.11 14:55 Сейчас в теме
7. Ийон Тихий (cool.vlad4) 41 16.01.11 15:04 Сейчас в теме
(0) Первое впечатление может быть обманчивым, но оно как-то не очень - код не понравился, как альтернативно решить проблему подумаю, но не в выходные. Насчет защиты - вопрос всегда будет спорным доколе спорящие стороны не договорятся о том какой смысл они вкладывают в это - "защита данных" - в зависимости от смысла может и результат быть разным - и да (т.е. можно защитить) и нет (невозможно)
8. anry mc (AnryMc) 706 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) 41 16.01.11 18:06 Сейчас в теме
(8) может быть, но только я ничего не обещал...
ЗЫ הבלים ;)
11. Игорь Исхаков (Ish_2) 954 16.01.11 18:28 Сейчас в теме
(2) Нет у меня решения.
Стоило указать в теме , что решение не претендует на полное сокрытие информации о реквизите,
т.к. есть еще печатные формы - и никаких вопросов и придирок бы не возникло.
Просто такие важные вопросы не стоит оставлять по умолчанию - а указывать явно.
cool.vlad4; +1 Ответить 2
12. Ийон Тихий (cool.vlad4) 41 16.01.11 18:41 Сейчас в теме
Согласен с (11), сокрытие реквизита в данном случае же не абсолютно, а только для форм и "списков" форм с указанными в публикации процедурами(конф-цию тогда можно указать)
13. anry mc (AnryMc) 706 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) 954 17.01.11 11:27 Сейчас в теме
(14) Здесь изложить сможете ?
16. anry mc (AnryMc) 706 17.01.11 20:57 Сейчас в теме
(14) Насколько я понял по ссылке находиться решение, когда в список документов не попадают документы с определенным значением реквизита. И такие документы вообще не открываются. А мне нужно не показывать значение определенного реквизита (т.е. в списке видны все документы и выводятся все реквизиты, но один реквизит "пустой").
17. maxp77 (maxp77) 18.01.11 09:29 Сейчас в теме
(16) Там решение задачи: необходимо, чтобы часть реквизитов документов(справочников) некоторым пользователям(то бишь одной роли) были недоступны для чтения, если в настройках списка документов или среди полей выборки в запросе присутсвует отсекаемый реквизит (он видим в списке), то данные из базы не получаются; отсутствует (не видим) - все документы видны; тоже самое с формой документа: отсекаемый реквизит присутсвует на форме - форма не откроется вообще, отсутствует - откроется. P.S. На кой в списке документов показывать целиком пустую колонку, ее нужно предварительно сделать невидимой для пользователя - кому не стоит, тот даже знать не будет о существовании отсекаемого реквизита.
(15) извините, некогда отсекать зерна от плевел.
18. Игорь Исхаков (Ish_2) 954 18.01.11 09:54 Сейчас в теме
19. anry mc (AnryMc) 706 18.01.11 20:44 Сейчас в теме
(17) Может я туплю, но в (0) я и написал " (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются)", т.е. я это решение знаю, но меня оно не устраивает.
В приведенной вами в (14) ссылке решения нет только обсуждение.
20. Вадим Никонов (V.Nikonov) 112 19.01.11 18:05 Сейчас в теме
Есть ещё одина идея решения проблемы: Реквизит - вещь условная, есть пользовательское понятие реквизита (то что на экране) и программисткое (компонент объекта). Я проектировал подобные вещи выселяя частично открытые "реквизиты" в свойства объекта или связанные справочники. При этом приходилось писать код вывода на экран и управления доступом.
В списке свойств, можно пропускать некоторые ("запрещённые") строки. Одиночные реквизиты выносить на вкладки и не открывать вкладку формы, скрывать "защищённые" колонки списков...
21. bulpi bulpi (bulpi) 100 19.01.11 21:39 Сейчас в теме
Похоже, я туплю :?:
Что мешает написать
Если Не РольДоступна("ПолныеПрава") Тогда ЭлементыФормы.Реквизит.Видимость=Ложь КонецЕсли;
?????
22. Ийон Тихий (cool.vlad4) 41 19.01.11 22:51 Сейчас в теме
(21) Ну этот прием стар как мир, где-то на ИС даже целая конфа на эту тему - можно еще для разнообразия(в зависимости от целей) использовать ТолькоПросмотр, Доступность(у себя в конфе так и сделал) - но все это свойства элементовформ, т.е. прочитать реквизиты все равно есть возможность(почему я и промолчал)
23. anry mc (AnryMc) 706 20.01.11 12:32 Сейчас в теме
(21) Если сделать реквизит невидимым, а пользователь знает, что он должен быть, возникают вопросы... а иногода желание и стремление увидеть скрытое...
А так поле есть, но в нем ничего нет...
24. Ийон Тихий (cool.vlad4) 41 20.01.11 12:41 Сейчас в теме
(23) Поле есть, а данных нет - во-первых это дезинформация, а во-вторых - как пользователь узнает, что в поле действительно ничего нет или это у него так заблокировано и в-третьих как пользователь определяет, что данное поле соотносится с данным реквизитом, вследствие чего у него не возникает вопросов?
25. anry mc (AnryMc) 706 20.01.11 15:38 Сейчас в теме
(24) Согласитесь, что жизнь сложна и многообразна… Возможно и надо ввести в заблуждение… А когда не показываются документы по RLS – это не ввод в заблуджение?
Скажем так – это требование заказчика показывать все документы, но не показывать определенные реквизиты в них.
26. mc2 6 26.01.11 11:17 Сейчас в теме
Т.к. реализация RLS в 1С не позволяет реализовать это (чтение объекта возможно только целиком, и если вы ограничиваете чтение определенного реквизита, то такие объекты не отображаются в списках и не открываются).

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


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

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

(23)(26)

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



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


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

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

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

В принципе согласен, но...