gifts2017

Настройка прав пользователей доступа к объектам с под бухгалтерии

Опубликовал ROM (ROM_1C) в раздел Администрирование - Защита, права, пароли

Настройка прав доступа к справочникам и документам можно настройить с под бухгалтерии.

Обработка, которая позволяет установить доступ к элементам справочников и документам, а именно:

1.Открытие

2.Ввод нового

3.Сохранение

4.Проводка

5.Снятие с проводки

6.Удаление

Все права настроюються для конкретного пользователя и сохраняються в регистр сведений. Для правильной работы программы нужно сделать несложную коректировку в конфигураторе. А именно:

1.Добавляем новый регистр свединий "ПраваДоступа" с полями: Користувач - тип справочник ссилка Пользователи, Тип, Вид, Обект - типзнач. "строка" и измерения "булево" тип Булево

Регистр переодичен - ДЕНЬ, регистратор - отсутствует!

он нужен для хранения прав.

2.Добавляем общий модуль "МодульПравДоступа". Туда копируем код:

 


Функция ПолучитьПрава(структураПрав)

    Користувач=структураПрав.Користувач;

    Тип=структураПрав.Тип;

    вид=структураПрав.Вид;

    обект=структураПрав.обект;

    Запрос = Новый Запрос;

    Запрос.Текст = ("ВЫБРАТЬ

    |    ПраваДоступаСрезПоследних.Користувач,

    |    ПраваДоступаСрезПоследних.Тип,

    |    ПраваДоступаСрезПоследних.Вид,

    |    ПраваДоступаСрезПоследних.Обект,

    |    ПраваДоступаСрезПоследних.Булево

    |ИЗ

    |    РегистрСведений.ПраваДоступа.СрезПоследних КАК ПраваДоступаСрезПоследних

    |ГДЕ

    |    ПраваДоступаСрезПоследних.Користувач = &текКористувач

    |    И ПраваДоступаСрезПоследних.Тип = &Тип

    |    И ПраваДоступаСрезПоследних.Вид = &Вид

    |    И ПраваДоступаСрезПоследних.Обект = &Обект

    |");

    Запрос.УстановитьПараметр("текКористувач", Користувач); 

    Запрос.УстановитьПараметр("Тип", Тип); 

    Запрос.УстановитьПараметр("Вид", Вид); 

    Запрос.УстановитьПараметр("Обект", Обект); 

    Результат = Запрос.Выполнить(); 

    ТЗ = Результат.Выгрузить(); 

    Возврат ТЗ;

КонецФункции



Процедура ПриУдаленииЭлементаСправочникаПередУдалением(Источник, Отказ) Экспорт 

    СтрокаСтипом =ТипЗнч(Источник);

    Если Найти(ТипЗнч(Источник),"Довідник") >0 Тогда 

        тип ="Довідники";

    КонецЕсли;

    Если Найти(ТипЗнч(Источник),":")>0 Тогда 

        вид=СокрЛП(Сред(ТипЗнч(Источник),Найти(ТипЗнч(Источник),":")+2)); 

    КонецЕсли;

    ОбектВвода = "Видаляти";

    Користувач = ПараметрыСеанса.ТекущийПользователь.Ссылка;

    структураПрав = Новый Структура;

    структураПрав.Вставить("Користувач",Користувач);

    структураПрав.Вставить("Тип",Тип);

    структураПрав.Вставить("Вид",Вид);

    структураПрав.Вставить("Обект",ОбектВвода);

    тз = ПолучитьПрава(структураПрав);

    Если ТЗ.количество() > 0 Тогда 

        Для Каждого стр из ТЗ Цикл 

            Если  стр.тип = структураПрав.Тип и  вид = структураПрав.Вид и стр.Користувач = структураПрав.Користувач Тогда 

                Если стр.Булево = Истина Тогда 

                    Отказ = Ложь;

                    Прервать;

                ИначеЕсли стр.булево = Ложь Тогда 

                        Отказ=Истина;

                    Прервать;

                КонецЕсли;

            КонецЕсли;

        КонецЦикла;

    Иначе 

        Отказ=Истина;

    КонецЕсли;    

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


Процедура ПриЗаписиЭлементаСправочникаПриЗаписи(Источник, Отказ)   Экспорт 

    СтрокаСтипом =ТипЗнч(Источник);

    Если Найти(ТипЗнч(Источник),"Довідник") >0 Тогда 

        тип ="Довідники";

    КонецЕсли;

    Если Найти(ТипЗнч(Источник),":")>0 Тогда 

        вид=СокрЛП(Сред(ТипЗнч(Источник),Найти(ТипЗнч(Источник),":")+2)); 

    КонецЕсли;

        ОбектВвода = "Записувати";

    Користувач = ПараметрыСеанса.ТекущийПользователь.Ссылка;

    структураПрав = Новый Структура;

    структураПрав.Вставить("Користувач",Користувач);

    структураПрав.Вставить("Тип",Тип);

    структураПрав.Вставить("Вид",Вид);

    структураПрав.Вставить("Обект",ОбектВвода);

    тз = ПолучитьПрава(структураПрав);

    Если ТЗ.количество() > 0 Тогда 

        Для Каждого стр из ТЗ Цикл 

            Если  стр.тип = структураПрав.Тип и  вид = структураПрав.Вид и стр.Користувач = структураПрав.Користувач  Тогда 

                Если стр.Булево = Истина Тогда 

                    Отказ = Ложь;

                    Прервать;

                ИначеЕсли стр.булево = Ложь Тогда 

                        Отказ=Истина;

                    Прервать;

                КонецЕсли;

            КонецЕсли;

        КонецЦикла;

    Иначе 

        Отказ=Истина;

    КонецЕсли;    

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


Процедура   ПриОткритииФормиСправочникаПроверитьПраваДоступа(формаспр,новий,отказ) Экспорт

  ФормаОбекта = "Довідник";

  ПроверитьПраваПриОткритииФорми(формаспр,новий,Отказ,ФормаОбекта);

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






Процедура ПриЗаписиДокумента(Источник, Отказ)  Экспорт 

    ОбектВвода = "Записувати";

    РаботаСправами(ОбектВвода,Источник,Отказ);

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


Процедура ПриУдаленииДокументаПередУдалением(Источник, Отказ)  Экспорт 

    ОбектВвода = "Видаляти";

    РаботаСправами(ОбектВвода,Источник,Отказ);

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


Процедура ПриПроведенииДокументаОбработкаПроведения(Источник, Отказ, РежимПроведения)  Экспорт 

    ОбектВвода = "Проводити";

    РаботаСправами(ОбектВвода,Источник,Отказ);

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


Процедура ПриУдалИзПроведенияДокументаОбработкаПроведения(Источник, Отказ, РежимПроведения)  Экспорт 

    ОбектВвода = "Знімати з проводки";

    РаботаСправами(ОбектВвода,Источник,Отказ);

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




Процедура РаботаСправами(ОбектВвода,Источник,Отказ)

       СтрокаСтипом =ТипЗнч(Источник);

    Если Найти(ТипЗнч(Источник),"Документ") >0 Тогда 

        тип ="Документи";

    КонецЕсли;

    Если Найти(ТипЗнч(Источник),":")>0 Тогда 

        вид=СокрЛП(Сред(ТипЗнч(Источник),Найти(ТипЗнч(Источник),":")+2)); 

    КонецЕсли;

        Користувач = ПараметрыСеанса.ТекущийПользователь.Ссылка;

    структураПрав = Новый Структура;

    структураПрав.Вставить("Користувач",Користувач);

    структураПрав.Вставить("Тип",Тип);

    структураПрав.Вставить("Вид",Вид);

    структураПрав.Вставить("Обект",ОбектВвода);

    тз = ПолучитьПрава(структураПрав);

    Если ТЗ.количество() > 0 Тогда 

        Для Каждого стр из ТЗ Цикл 

            Если  стр.тип = структураПрав.Тип и  вид = структураПрав.Вид и стр.Користувач = структураПрав.Користувач  Тогда 

                Если стр.Булево = Истина Тогда 

                    Отказ = Ложь;

                    Прервать;

                ИначеЕсли стр.булево = Ложь Тогда 

                        Отказ=Истина;

                    Прервать;

                КонецЕсли;

            КонецЕсли;

        КонецЦикла;

    Иначе 

        Отказ=Истина;

    КонецЕсли;    

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


Процедура ПриОткритииФормиДокументаПроверитьПрава(формаспр,новий,Отказ) Экспорт 

       ФормаОбекта = "Документ";

       ПроверитьПраваПриОткритииФорми(формаспр,новий,Отказ,ФормаОбекта);

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


Процедура ПроверитьПраваПриОткритииФорми(формаспр,новий,отказ,ФормаОбекта)

     Для аа = 1 По 2 Цикл 

        Если аа =1 Тогда 

            ОбектВвода ="Переглядати";

        ИначеЕсли аа=2 Тогда 

            Если новий = Истина Тогда 

                ОбектВвода ="Створювати новий";

            Иначе 

                Прервать;;

            КонецЕсли;

        КонецЕсли;

        СтрокаСтипом =ТипЗнч(формаСпр);

        Если Найти(ТИпзнч(формаСпр.ЭтотОбъект),ФормаОбекта) >0 Тогда 

            тип =ФормаОбекта+"и";

        КонецЕсли;

        Если Найти(ТИпзнч(формаСпр.ЭтотОбъект),":")>0 Тогда 

            вид=СокрЛП(Сред(ТИпзнч(формаСпр.ЭтотОбъект),Найти(ТИпзнч(формаСпр.ЭтотОбъект),":")+2)); 

        КонецЕсли;

        Користувач = ПараметрыСеанса.ТекущийПользователь.Ссылка;

        структураПрав = Новый Структура;

        структураПрав.Вставить("Користувач",Користувач);

        структураПрав.Вставить("Тип",Тип);

        структураПрав.Вставить("Вид",Вид);

        структураПрав.Вставить("Обект",ОбектВвода);

        тз = ПолучитьПрава(структураПрав);

        Если ТЗ.количество() > 0 Тогда 

            Для Каждого стр из ТЗ Цикл 

                Если стр.тип = структураПрав.Тип и  вид = структураПрав.Вид и стр.Користувач = структураПрав.Користувач Тогда 

                    Если стр.Булево = Истина Тогда 

                        Если аа= 1 или аа=2 Тогда 

                            Отказ = Ложь;

                            Прервать;

                        КонецЕсли;

                    ИначеЕсли стр.булево = Ложь Тогда 

                        Если аа= 1 или аа = 2 Тогда 

                            Отказ=Истина;

                            Прервать;

                        КонецЕсли;

                    КонецЕсли;

                КонецЕсли;

            КонецЦикла;

        Иначе 

            Отказ=Истина;

        КонецЕсли;

        Если отказ = Истина Тогда 

            Прервать;

        КонецЕсли;

    КонецЦикла;

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


 

 


3.На каждое событие, что сбываетсья в документе и справочнике нужно создать подписку на событие.

 3.1 Имя подписки "ПриУдаленииЭлементаСправочника" - событие "ПередУдалением" - объект  "СправочникОбъект" - обробник "МодульПравДоступа.ПриУдаленииЭлементаСправочникаПередУдалением"

3.2. Имя подписки "ПриЗаписиЭлементаСправочника" - событие "ПриЗаписи" - объект  "СправочникОбъект" - обробник "МодульПравДоступа.ПриЗаписиЭлементаСправочникаПриЗаписи"

3,3, Имя подписки "ПриЗаписиДокумента" - событие "ПриЗаписи" - объект  "ДокументОбъект" - обробник "МодульПравДоступа.ПриЗаписиДокумента"

3,4 Имя подписки "ПриУдаленииДокумента" - событие "ПередУдалением" - объект  "ДокументОбъект" - обробник "МодульПравДоступа.ПриУдаленииДокументаПередУдалением"

3,5 Имя подписки "ПриПроведенииДокумента" - событие "ОбработкаПроведения" - объект  "ДокументОбъект" - обробник "МодульПравДоступа.ПриПроведенииДокументаОбработкаПроведения"

3,6 Имя подписки "ПриУдалИзПроведенияДокумента" - событие "ОбработкаУдаленияПроведения" - объект  "ДокументОбъект" - обробник "МодульПравДоступа.ПриУдалИзПроведенияДокументаОбработкаПроведения"


В те формы справочников, гду нудно запретить открытие и т.д нужно вставить в процедуру "ПередОткрытием" глобальну процедуру: МодульПравДоступа.ПриОткритииФормиСправочникаПроверитьПраваДоступа(ЭтаФорма,Этоновый(),Отказ);

В формы тех документов, которые нужно заперетить теже действия нужно вставить в процедуру "ПередОткрытием" глобальну процедуру: МодульПравДоступа.ПриОткритииФормиДокументаПроверитьПрава(ЭтаФорма,Этоновый(),Отказ);


Ну вроде все написал.. Обработка лежит! Строго не судите, пишите коменатарии кто и как применил!




Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
-
.1243521224 17,41Kb
27.08.14
160
.1243521224 17,41Kb 160 Скачать

См. также

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

Комментарии

1. Сергей Ожерельев (Поручик) 28.05.09 18:41
>>> гду нудно
>>> ПриОткритииФормиДокумента
Ужоснах. А шо це такэ?
тип ="Довідники"

Укажи в заголовке, только для Украины или перепиши нормально по-русски
2. ROM (ROM_1C) 28.05.09 19:07
(1)Тепер и для России тоже!
"Ужоснах" - это где? может опечатка!
3. Артур Аюханов (artbear) 29.05.09 09:30
Процедура ПриЗаписиДокумента(Источник, Отказ) Экспорт
ОбектВвода = "Записувати";
РаботаСправами(ОбектВвода,Источник,Отказ);
КонецПроцедуры

Процедура ПриУдаленииДокументаПередУдалением(Источник, Отказ) Экспорт
ОбектВвода = "Видаляти";
РаботаСправами(ОбектВвода,Источник,Отказ);
КонецПроцедуры
(2) Это по-русски чтоли ?
4. ROM (ROM_1C) 29.05.09 13:51
(3) по-видимому, 1С не умеет читать украиского.. А кому "Записувати" или "Видаляти" не нравиться - прошу сюда http://pereklad.online.ua/
5. Артур Аюханов (artbear) 29.05.09 14:53
(4) Ну и поставь в название суффикс/префикс "Укр" или прямо напиши, что на украинском.
Извини, но здесь российский сайт все-таки, и хотелось бы простым и ясным образом различать российские и не российские разработки, хотя бы по названию.
6. igor_gk (igor_gk) 03.06.09 11:06
Гы... а мне пофиг на каком - я с 5-ти лет и на русском и на украинском читать умею :)
И переписать код для меня не проблема :)) Просто могу.
7. Александр (aist) 05.06.09 22:48
А есть тоже самое на русском?, если есть то кинте, а то переписывать ломы.
8. ROM (ROM_1C) 05.06.09 23:33
(7) на русском нет.. там переписовать не так уж много.. слов 15 где-то:)
9. inse0f (inse0f) 09.07.09 22:36
11. Андрей (mawr41) 27.02.10 07:47
и я тоже поржал, имейте совесть господин РОМ, вы на российском сайте, то будьте добры написать по русски или указать в шапке что для хохлов. За это большой минус
12. ROM (ROM_1C) 27.02.10 11:57
(11) Спеціально для Вас, mawr41, напишу, що для москалів!
13. Евгения Р (Jane_R) 27.12.12 13:00
Вы меня извините, но я тоже из Украины. Но читать это не смогла. Тут же ошибка на ошибке! Вы выкладываете статью на русский сайт, не сделав пометки о том, что это решение подходит для Украины - это раз. И два - да загоните хотя бы в ворд текст для исправления ошибок - и то в два раза меньше их станет...
Если мы из Украины, то это не дает нам права не уважать русский язык.
14. Кирилл Самсонов (Vigor06) 15.06.13 18:46
Перевел,поправил, перепилил под "Группы пользователей" - все отлично))Спасибо!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа