Имя: Пароль:
1C
1С v8
Разрешение ручной корректировки проводок для роли в 1с:Бухгалтерия предприятия 8
0 Scorp1985
 
28.11.13
07:29
Добрый день!
Появилась необходимость создать роли с ограниченными правами в 1с:Бухгалтерия предприятия 8.2
Добавил роль, назначил пользователю. Сначала у пользователя пропала галка "Ручная корректировка" вообще. Поправил в конфигурации, там в коде было железно прописано скрывать галку для всех ролей, кроме "ПолныеПрава" и "ПравоГлавногоБухгалтера". Сделал так:

ИначеЕсли РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава") Тогда
        РучнаяКорректировка = ДокументОбъект.РучнаяКорректировка;
        Если ДокументОбъект.Проведен ИЛИ РучнаяКорректировка ИЛИ ДокументОбъект.метаданные().Проведение =  Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда
            ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Нет;
        Иначе
            ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Верх;
        КонецЕсли;        
//added_by_Shtreys//
ИначеЕсли РольДоступна("ПравоНаРучнуюКорректировкуПроводок") Тогда
        РучнаяКорректировка = ДокументОбъект.РучнаяКорректировка;
        Если ДокументОбъект.Проведен ИЛИ РучнаяКорректировка ИЛИ ДокументОбъект.метаданные().Проведение =  Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда
            ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Нет;
        Иначе
            ЭлементыФормы.ПанельФлага.Свертка = РежимСверткиЭлементаУправления.Верх;
        КонецЕсли;        
//end_of added_by_Shtreys//

Теперь флаг можно установить, поменять проводки, но после нажатия "ок"  и повторного открытия проводок они опять становятся автоматическими.

Как подпилить?)
1 anaed
 
28.11.13
07:35
(0) дать уже пользователю право гб, спорим в коде еще не раз проверяется РольДоступна("ПравоГлавногоБухгалтера")?
2 Scorp1985
 
28.11.13
09:23
(1) Цель - чётко разграничить права пользователей. Единственный вариант - искать в коде РольДоступна("ПравоГлавногоБухгалтера") и везде где надо править код?
3 Scorp1985
 
28.11.13
09:30
Нашёл все вхождения строки

РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")

Не так уж много вхождений, кто-нибудь может объяснить где действительно требуется дописать ещё роль, а где не нужно для ручной корректировки?

a)

    Если Не (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда
        ЭлементыФормы.ДействияФормы.Кнопки.Настройка.Доступность = Ложь;
    КонецЕсли;

b)

Если Метаданные.Роли.Найти("ПравоГлавногоБухгалтера") <> Неопределено Тогда
        АдминистраторУчетнойЗаписи = РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава");
    Иначе
        АдминистраторУчетнойЗаписи = РольДоступна("ПолныеПрава");
    КонецЕсли;

c)

Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента("РучнаяКорректировка", ДокументОбъект.Метаданные()) Тогда
        
    ИначеЕсли РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда
        
        //Заполним недостающие поля записей регистров
        Для каждого СтрокаТаблицы Из Регистры Цикл
            
            Если СтрокаТаблицы.Отображение И СтрокаТаблицы.Прочитан Тогда
                ТабличнаяЧасть = ЭлементыФормы[СтрокаТаблицы.Имя].Значение;
            Иначе
                Продолжить;
            КонецЕсли;
            
            Для каждого Запись Из ТабличнаяЧасть Цикл
                Если СтрокаТаблицы.ТипРегистра = "РегистрСведений" Тогда
                    Если НЕ Метаданные.РегистрыСведений[СтрокаТаблицы.Имя].ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
                        Если Запись.Период = Дата('00010101') Тогда
                            Запись.Период = ДокументОбъект.Дата;
                        КонецЕсли;
                    КонецЕсли;
                Иначе
                    Если Запись.Период = Дата('00010101') Тогда
                        Запись.Период = ДокументОбъект.Дата;
                    КонецЕсли;
                КонецЕсли;
                
                Запись.Активность = ДокументОбъект.Проведен или (ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация"));
                Если НЕ ЗначениеЗаполнено(Запись.Регистратор) Тогда
                    Запись.Регистратор = ДокументОбъект.Ссылка;
                КонецЕсли;
                
                //Обработаем регистры, формы которых предопределены в обработке
                Если (СтрокаТаблицы.Имя = "Хозрасчетный") Тогда
                    Если НЕ ЗначениеЗаполнено(Запись.Организация) Тогда
                        Запись.Организация = ДокументОбъект.Организация;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
        
        //Установим признак ручной корректировки в документе
        Для каждого СтрокаТаблицыРегистров из Регистры Цикл
            Если СтрокаТаблицыРегистров.Прочитан Тогда
                ИмяРегистра = СтрокаТаблицыРегистров.Имя;
                Если ЭлементыФормы.Найти(ИмяРегистра)<>неопределено Тогда
                    ДокументОбъект.Движения[ИмяРегистра].Загрузить(ЭлементыФормы[ИмяРегистра].Значение.Выгрузить());
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
        ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка;
        Попытка
            ДокументОбъект.Записать();
        Исключение
            Сообщить("При попытке записи документа возникла ошибка:" + ОписаниеОшибки(), СтатусСообщения.Важное);
            Возврат;
        КонецПопытки;
        
    ИначеЕсли ДокументОбъект.РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда
        
        //Восстановим автоматические движения документа
        Если Вопрос("Ручная корректировка движений документа отменена.
                    |Восстановить движения сформированные автоматически?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;
        ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка;
        Попытка
            ОбщегоНазначения.ИзменитьАктивностьПоРегистратору(ДокументОбъект,ложь);
            Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда
                ФормаДокумента = ДокументОбъект.ПолучитьФорму("ФормаДокумента");
                ФормаДокумента.ВыполнитьОперацию();
            Иначе
                ДокументОбъект.Записать(?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.ОтменаПроведения));
            КонецЕсли;    
        Исключение
            Сообщить("При попытке проведения документа возникла ошибка. Проведение документа отменено.", СтатусСообщения.Важное);
            ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);            
        КонецПопытки;
        
    КонецЕсли;
    
    Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда
        // Для обновления статуса операции в обработке Закрытия месяца
        ОбщегоНазначения.ВыполнитьОповещение("РегОперация", ДокументОбъект.Состояние, ДокументОбъект.ВидОперации);
    КонецЕсли;

d)

Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента("РучнаяКорректировка", ДокументОбъект.Метаданные()) Тогда
        
    ИначеЕсли РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда
        
        //Заполним недостающие поля записей регистров
        Для каждого СтрокаТаблицы Из Регистры Цикл
            
            Если СтрокаТаблицы.Отображение И СтрокаТаблицы.Прочитан Тогда
                ТабличнаяЧасть = ЭлементыФормы[СтрокаТаблицы.Имя].Значение;
            Иначе
                Продолжить;
            КонецЕсли;
            
            Для каждого Запись Из ТабличнаяЧасть Цикл
                Если СтрокаТаблицы.ТипРегистра = "РегистрСведений" Тогда
                    Если НЕ Метаданные.РегистрыСведений[СтрокаТаблицы.Имя].ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
                        Если Запись.Период = Дата('00010101') Тогда
                            Запись.Период = ДокументОбъект.Дата;
                        КонецЕсли;
                    КонецЕсли;
                Иначе
                    Если Запись.Период = Дата('00010101') Тогда
                        Запись.Период = ДокументОбъект.Дата;
                    КонецЕсли;
                КонецЕсли;
                
                Запись.Активность = ДокументОбъект.Проведен или (ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация"));
                Если НЕ ЗначениеЗаполнено(Запись.Регистратор) Тогда
                    Запись.Регистратор = ДокументОбъект.Ссылка;
                КонецЕсли;
                
                //Обработаем регистры, формы которых предопределены в обработке
                Если (СтрокаТаблицы.Имя = "Хозрасчетный") Тогда
                    Если НЕ ЗначениеЗаполнено(Запись.Организация) Тогда
                        Запись.Организация = ДокументОбъект.Организация;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
        
        //Установим признак ручной корректировки в документе
        Для каждого СтрокаТаблицыРегистров из Регистры Цикл
            Если СтрокаТаблицыРегистров.Прочитан Тогда
                ИмяРегистра = СтрокаТаблицыРегистров.Имя;
                Если ЭлементыФормы.Найти(ИмяРегистра)<>неопределено Тогда
                    ДокументОбъект.Движения[ИмяРегистра].Загрузить(ЭлементыФормы[ИмяРегистра].Значение.Выгрузить());
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
        ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка;
        Попытка
            ДокументОбъект.Записать();
        Исключение
            Сообщить("При попытке записи документа возникла ошибка:" + ОписаниеОшибки(), СтатусСообщения.Важное);
            Возврат;
        КонецПопытки;
        
    ИначеЕсли ДокументОбъект.РучнаяКорректировка И (РольДоступна("ПравоГлавногоБухгалтера") ИЛИ РольДоступна("ПолныеПрава")) Тогда
        
        //Восстановим автоматические движения документа
        Если Вопрос("Ручная корректировка движений документа отменена.
                    |Восстановить движения сформированные автоматически?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;
        ДокументОбъект.РучнаяКорректировка = РучнаяКорректировка;
        Попытка
            ОбщегоНазначения.ИзменитьАктивностьПоРегистратору(ДокументОбъект,ложь);
            Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда
                ФормаДокумента = ДокументОбъект.ПолучитьФорму("ФормаДокумента");
                ФормаДокумента.ВыполнитьОперацию();
            Иначе
                ДокументОбъект.Записать(?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.ОтменаПроведения));
            КонецЕсли;    
        Исключение
            Сообщить("При попытке проведения документа возникла ошибка. Проведение документа отменено.", СтатусСообщения.Важное);
            ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);            
        КонецПопытки;
        
    КонецЕсли;
    
    Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.РегламентнаяОперация") Тогда
        // Для обновления статуса операции в обработке Закрытия месяца
        ОбщегоНазначения.ВыполнитьОповещение("РегОперация", ДокументОбъект.Состояние, ДокументОбъект.ВидОперации);
    КонецЕсли;


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