• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы ech
  • Дата начала
E

ech

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

puh14

В процедуре ПРиОТкрытии(), ВводНового()

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


и так далее


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

ech

Вот похожий пример
https://codeby.net/threads/30962.html

по другому вроде нельзя

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

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

Hryv

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

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

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

puh14

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

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

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


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

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

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

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

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

ещё тут почитай - примеров много


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

ech

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

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

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

puh14

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

ech

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

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

puh14

Пример в каталоге базы папка Менеджер, в ней файлик прходная.txt
в ней строка

НомерДок 1 1 1

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

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

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

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

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

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


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

ech

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

ech

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

puh14

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

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

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

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

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

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

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

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

ech

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!