Имя: Пароль:
1C
1С v8
Проверить, изменен ли документ (сравниваем объект и ссылку)
,
0 Kifsif
 
26.11.14
11:50
УТ 10.
Задача: не дать пользователю без соответствующих прав проводить документы по БУ.

Заведена роль - МенеджерБезПроведенияПоБУ.
Заведена подписка на события на все документы - перед записью.

В общем модуле:

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

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

    Если СсылкаОтражатьВБухгалтерскомУчете Тогда
        ИнформироватьПользователя("Этот объект уже был проведен в бухгалтерском учете. " +
                                  "Нет прав изменять этот документ. " +
                                "Документ не записан.");
        Отказ = Истина;    
    КонецЕсли;    
    
КонецПроцедуры

Проблема такая: если юзер открыл или создал документ, нажал записать. Не закрывая документ накидывает флаг БУ и проводит прекрасно по БУ.
Иными словами, если документ закрывался, то код работает корректно.А вот если не закрывался, то ссылка-то сохранилась.

Как можно победить?
1 Лефмихалыч
 
26.11.14
11:52
а просто снять галочку с нужных полей в настройках роли - не вариант?
2 Господин ПЖ
 
26.11.14
11:54
а что побеждать то?

вся эта городьба работает только на Если Источник.ЭтоНовый() Тогда
3 Kifsif
 
26.11.14
11:55
Типовые роли не правим. Обходимся только добавленными обхетами и модулями.
4 Kifsif
 
26.11.14
11:56
(2) Надо не только на новый, но и на существовавший документ сделать механизм.
5 Господин ПЖ
 
26.11.14
11:58
(4) ну так сравнивай, в чем проблема то
6 Крошка Ру
 
26.11.14
11:59
(4) Если РежимЗаписи = РежимЗаписиДокумента.Проведение ?
7 Господин ПЖ
 
26.11.14
11:59
тут вообще в принципе параллельно - новый он или старый, весь вопрос в разнице состояний между ссылкой и объектом в момент срабатывания подписки
8 Крошка Ру
 
26.11.14
11:59
Ну только ПередЗаписью() проверять
9 Крошка Ру
 
26.11.14
12:00
(7) А если перепроведение?
10 Крошка Ру
 
26.11.14
12:00
(7) Состояние и там, и там одинаково
11 JeyRico
 
26.11.14
12:01
В ПередЗаписью() снять галочку БУ у тех кому нельзя проводить по БУ.
12 Господин ПЖ
 
26.11.14
12:02
(9) нет роли - досвидос, какое перепроведение
13 Господин ПЖ
 
26.11.14
12:02
(10) там еще наличие роли анализируется...
14 Крошка Ру
 
26.11.14
12:04
(12) Так вроде ж роли не трогаем?
Создать и провести ведь может и тот у кого есть право, а потом "бесправный" тоже может ОК нажать. Это ведь тоже отлавливать надо. А здесь разницы состояний между ссылкой и объектом не будет.
15 Господин ПЖ
 
26.11.14
12:07
(14) >Так вроде ж роли не трогаем?

эм... типовые он не трогает, новую завел: "Заведена роль - МенеджерБезПроведенияПоБУ"

т.е. по идее так: в новом не должно быть БУ, в старом разницы между ссылкой и объектом...

может он перепровести "не трогая" бу - я не понял
Независимо от того, куда вы едете — это в гору и против ветра!