Реализация системы безопасности на уровне реквизитов документа

Тема в разделе "1C и всё что с ней связано", создана пользователем ech, 6 июл 2009.

  1. ech

    ech Гость

    Необходимо сделать возможность управления уровнем доступа к реквизитам одного документа в зависимости от набора прав пользователей, т.е.
    реквизит: не доступен, просмотр, редактирование.
    1C 7.7., кто сталкивался, каким образом это можно реализовать?
     
  2. Hryv

    Hryv Гость

  3. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    В процедуре ПРиОТкрытии(), ВводНового()

    Пишешь что-то типа
    Если НазваниеНабораПрав() = "Менеджер"
    НомерДок.Доступность(0);
    ДатаДок.Доступность(0);
    Примечание.Видимость(0);


    и так далее


    Как вариант - можешь создать справочник с наименованиями реквизитов каждого документа (заполнить через метаданные), и для каждого набора прав брать значения видимости\доступности оттуда. А потом при в ПРиОТкрытии(), ВводНового() пробегаться по метаданным, ища соответсвующие элементы в справочнике и вытягивая оттуда доступность/видимость.
     
  4. ech

    ech Гость

    Спасибо! В этом приемере немного не так как я хотел бы. Хотелось бы универсальняю процедуру сделать, для 4х видок документов, 10ти прав пользователей, и большой кучей реквизитов. Вот это интересует.

    Вот это более похоже на правду, вернее то что я хочу. А можно немного подробней? Я вытащу в справочник рекизиты , не спорю, но как мне вытащить туда что положено видеть/редактировать тому или иному юзеру??
     
  5. Hryv

    Hryv Гость

    Если делать через справочник, то я бы сделал группа - это док, а элементы справочника - реквизиты
    И уже в самом справочнике задавать для каждого элемента: не доступен, просмотр, редактирование

    А ПриОткрытии() и ВводНового() искать в справочнике нужную группу и перебирая элементы устанавливать доступ к реквизитам

    Видимо puh14 тоже самое предлагает, только другими словами
     
  6. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Процедура ПриОткрытии()
    Спр = СоздатьОбъект("Справочник.Права");//Например так справочник обзавешь
    Спр.НайтиПоНаименованию(Вид());
    Если Спр.ЭтоГруппа() = 1 Тогда
    Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());//тут может ругнуться - я обычно серез пару переменных делал. В справочнике прав - //название группы - это название документа
    Иначе
    Возврат;
    КонецЕсли;

    Для ааа = 1 по Метаданные.Документ(Вид()).РевизитШапки() Цикл
    Спр.НайтиПоНаименованию(Метаданные.Документ(Вид()).РеквизитШапки(ааа).Идентифика
    тор,1);
    УстановитьПрава(Спр.ТекущийЭлемент(),Метаданные.Документ(Вид()).РеквизитШапки(аа
    а).Идентификатор);//Тут ты получаешь строку а не реквизит //документа - фига с два напрямую права установишь;Поэтому вызываешь процедуру в глобальнике, где строку можно использовать для обращения к //ревизиту
    КонецЦИкла;

    Для ааа = 1 по Метаданные.Документ(Вид()).РеквизитТабличнойЧасти() Цикл
    Спр.НайтиПоНаименованию(Метаданные.Документ(Вид()).РеквизитТабличнойЧасти(ааа).И
    дентифика
    тор,1);
    УстановитьПрава(Спр.ТекущийЭлемент(),Метаданные.Документ(Вид()).РеквизитТаблично
    йЧасти(ааа).Идентификатор);
    КонецЦИкла;


    Для ааа = 1 по Метаданные.Документ(Вид()).ОбщийРеквизитДокумента() Цикл
    Спр.НайтиПоНаименованию(Метаданные.Документ(Вид()).ОбщийРеквизитДокумента(ааа).И
    дентификатор,1);
    УстановитьПрава(Спр.ТекущийЭлемент(),Метаданные.Документ(Вид()).ОбщийРеквизитДок
    умента(ааа).Идентификатор);
    КонецЦИкла;

    КонецПРоцедуры

    в глобальнике
    процедура УстановитьПрава(Права,Реквизит) Экспорт

    Конт.Реквизит.Видимость(Права.ПродавецВидимость);
    Конт.Реквизит.Редактирование(Права.ПродавецРедактирование);
    Конт.Реквизит.Доступность(Права.ПродавецДоступность);
    КонецПРоцедуры;

    //Тут в элементе группы с именем документа в справочнике права наименование элемента - имя реквизита, а реквизиты элемента - наиенование набора прав + операция. Можно и подругому - например в внешнем файле, строчное значение через запятые, подчиненные справочники. Так как я написал - жестковато, если новые права создаешь - надо изменять состав реквизитов справочника Права. Будут проблемы - стучись.

    ещё тут почитай http://www.softpoint.ru/article_id51.htm - примеров много


    ЗЫ Как-то строчки коряво переносятся - поправить не получается. по смыслу читай
     
  7. ech

    ech Гость

    спасибо за резвернутый ответ ..

    Во внешнем текстовом файле думаю будет удобней? туда тоже структуру документов выгрузить с реквизитами или как?
     
  8. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну например так - название папки в которой лежат тестовые файлы - НазваниеНабораПРав(),название файла - это имя документа, далее в строках - имя реквизита и три цифры (0 или 1) первая видимость, вторая доступность, третья -редактирование (хотя зачем редактирование тебе надо - оно только на простые типы данных годится). Как-то так. Проще сделай обработку, которая сама будет пробегаться по метаданным и заполнит всё это дело согласно вышеизложенному - и правь себе. В начале текстового файла в первой строке лучше сделать комментарий - что есть что.
    кстати - при таком раскладе тебе даже не надо по метаданным пробегаться - тупо процедуру в глобальнике ( для неё потребуется отправить Вид() из документа, ну может ещё НазваниеНабораПрав() хотя это можно и в глобальнике получить) и бегать по строчкам, проставляя в контексте права.
     
  9. ech

    ech Гость

    смутно как то все это представляю ((((
     
  10. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Пример в каталоге базы папка Менеджер, в ней файлик прходная.txt
    в ней строка

    НомерДок 1 1 1

    Заполнено благодаря ВСтрокуСРазделителями
    В глобальнике

    процедура УстановитьПрава(Права,Вид,Конт) Экспорт //Права - Это НазваниеНабораПРав(), вид - это Вид() из документа откуда вызов
    Текст = СоздатьОбъект("Текст");
    Текст.Открыть(КаталогИБ()+"\"+Права+"\"+Вид+".TXT");
    Параметры = СоздатьОбъект("СписокЗначений");

    Для ааа = 1 По Текст.КоличествоСтрок() Цикл

    Тек = Текст.ПолучитьСтроку(ааа);
    Параметры.ИзСтрокиСРазделителями(Тек);

    Реквизит = Параметры.ПолучитьЗначение(1);
    Видимость = Параметры.ПолучитьЗначение(2);
    Редактирование = Параметры.ПолучитьЗначение(3);
    Доступность = Параметры.ПолучитьЗначение(4);

    Конт.Реквизит.Видимость(Видимость);
    Конт.Реквизит.Редактирование(Редактирование);
    Конт.Реквизит.Доступность(Доступность);
    КонецЦикла;
    //Текст.Закрыть(); //ну мож и не не надо этого...
    КонецПРоцедуры;


    тут не запятые использовал - а разделители.
    В принципе несложно написать обработку, которая тебе сама все эти данные заполнит и запишет а ты потом только правь.Но это уже за денежку ;-)
     
  11. ech

    ech Гость

    Спасибо за пример, теперь более менее ясно что к чему.
     
  12. ech

    ech Гость

    Реквизит = Параметры.ПолучитьЗначение(1);
    {Глобальный модуль(3916)}: Значение не представляет агрегатный объект (ПолучитьЗначение)
     
  13. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Значит у тебя скорее всего есть глобальная переменная Параметры. Она, наприемр, числовая - а прога пытается вытащить из неё первое значение списка, что есть косяк. Попробуй параметры поменять на что-то другое, например СписокПрав

    процедура УстановитьПрава(Права,Вид,Конт) Экспорт //Права - Это НазваниеНабораПРав(), вид - это Вид() из документа откуда вызов
    Текст = СоздатьОбъект("Текст");
    Текст.Открыть(КаталогИБ()+"\"+Права+"\"+Вид+".TXT");
    СписокПрав = СоздатьОбъект("СписокЗначений");

    Для ааа = 1 По Текст.КоличествоСтрок() Цикл

    Тек = Текст.ПолучитьСтроку(ааа);
    СписокПрав.ИзСтрокиСРазделителями(Тек);

    Реквизит = СписокПрав.ПолучитьЗначение(1);
    Видимость = СписокПрав.ПолучитьЗначение(2);
    Редактирование = СписокПрав.ПолучитьЗначение(3);
    Доступность = СписокПрав.ПолучитьЗначение(4);

    Конт.Реквизит.Видимость(Видимость);
    Конт.Реквизит.Редактирование(Редактирование);
    Конт.Реквизит.Доступность(Доступность);
    КонецЦикла;

    КонецПРоцедуры;

    глянь кстати после ИзСтрокиСРазделителями в отладчике нормально - ли список получился
     
  14. ech

    ech Гость

    "Параметры" - не было такой переменной, вообщем какой то глюк, вроде заработало.
    глянь кстати после ИзСтрокиСРазделителями в отладчике нормально - ли список получился
    Получаю список, проверил.
    Спасибо.
     
  15. ech

    ech Гость

    Таки пришлось еще СРР юзать.
     
Загрузка...

Поделиться этой страницей