Обработка, которая позволяет установить доступ к элементам справочников и документам, а именно:
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 Имя подписки "ПриУдалИзПроведенияДокумента" - событие "ОбработкаУдаленияПроведения" - объект "ДокументОбъект" - обробник "МодульПравДоступа.ПриУдалИзПроведенияДокументаОбработкаПроведения"
В те формы справочников, гду нудно запретить открытие и т.д нужно вставить в процедуру "ПередОткрытием" глобальну процедуру: МодульПравДоступа.ПриОткритииФормиСправочникаПроверитьПраваДоступа(ЭтаФорма,Этоновый(),Отказ);
В формы тех документов, которые нужно заперетить теже действия нужно вставить в процедуру "ПередОткрытием" глобальну процедуру: МодульПравДоступа.ПриОткритииФормиДокументаПроверитьПрава(ЭтаФорма,Этоновый(),Отказ);
Ну вроде все написал.. Обработка лежит! Строго не судите, пишите коменатарии кто и как применил!