АЦРК: автоматический запрет редактирования для пользователей в БП 2.0

Как известно в конфигурации БП 2.0 нельзя штатными средствами установить дату запрета редактирования не в монопольном режиме. Это вызывает массу проблем, которые потом внедренцам приходится решать. (О чем думали разработчики - отдельный вопрос. Им много лет писали, но сделали они такую возможность только в БП 3.0. Причем в других конфигурациях такой проблемы нет).

Очень хотелось сделать для БП 2.0 что-то подобное АЦРК: Автоматический запрет редактирования для пользователей УТ 10.3. Немного углубившись в этот механизм в конфигурации обнаружил, что можно все-таки в типовой конфигурации устанавливать дату запрета и не в монопольном режиме. С другой стороны хотелось сделать и автоматический механизм установки даты запрета редактирования. Вроде все удалось.

1. Как в типовой бухгалтерии 2.0 установить дату запрета редактирования не в монопольном режиме ?

Вопрос очень актуальный. Как правило в течение рабочего дня не хочется выгонять всех пользователей, потому что это сложно. Они сидят в разных местах (кассир в кассе, например), у некоторых люди в очереди стоят, кому-то надо срочно отчет сделать или платежку подготовить и т.д. Кто-то от компьютера отошел. В общем главбух думает "установлю позже", но к концу дня забывает. В результате оказывается, что месяц закрыт, а дата запрета редактирования не установлена. Через месяц выясняется, что изменились остатки на конец предыдущего месяца и начинаются поиски причин и способов исправления.

Оказывается дату запрета все-таки можно установить и в немонопольном режиме. Это делается в режиме прямого редактирования регистра сведений "ГраницыЗапретаИзмененияДанных". Устанавливать надо дату запрета для каждой организации. Делать это может только пользователь с полными правами.


 
В штатной форме установки даты запрета редактирования есть три режима: ОбщаяДата, ПоОрганизациям и ПоОрганизациямИПользователям. Но режим ОбщаяДата соответствует не одной записи с пустой организацией и пользователем (как можно было бы предположить исходя из здравого смысла), а набору записей для всех организаций базы данных с одинаковой датой запрета редактирования. Поэтому надо заводить записи по всем организациям. Записи с пустой организацией в этот регистр вводить не надо, они ни на кого не подействуют.

На пользователей такое изменение подействует при следующем их входе в базу данных. Многим этого будет вполне достаточно.


2. Как в типовой бухгалтерии 2.0 сделать автоматический запрета редактирования вчерашнего дня при входе пользователей в систему?

Это тоже можно, но придется включить возможность изменения конфигурации и сделать небольшую доработку.

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

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

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

Но лучше мы будем устанавливать запрет редактирования вчерашнего дня не при входе в систему, а при выходе из нее. То есть при входе дата запрета для пользователя изменяться не будет. Тогда при необходимости редактировать прошлые периоды пользователь должен выйти из базы, подойти к уполномоченному пользователю с полными правами (главбуху), тот, пользуясь рекомендациями пункта 1, через регистр сведений установит для нужного пользователя по нужной организации (и для самой нужной организации) нужную дату запрета и все (то есть надо будет изменить две даты: у организации и у пользователя по этой организации). Теперь пользователь может снова войти в базу и делать изменения в прошлых периодах, а при выходе из базы для него опять закроется период по вчерашний день включительно.

Вроде все красиво. Сегодня 11.11 пользователь с утра зашел в базу, поработал, вышел из базы - для него закрылся период по 10.11 включительно. Завтра, 12.11 он войдет в базу, для него будет открыт период по 10.11 включительно, выйдет - закроется по 11.11 включительно. 12.11 останется открытым.

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

2.1 Делаем изменения в конфигурации.

К сожалению, придется включить возможность изменения конфигурации. Конечно, не хочется снимать бухгалтерию с поддержки, но ... Разработчиков убедить делать что-то в БП 2.0 теперь уже невозможно, когда 3.0 уже есть.

 
 

Добавляем новый общий модуль "АЦРК_Привилегированный", в свойствах модуля устанавливаем флажки "Сервер", "Вызов сервера" и "Привилегированный".

Вот текст модуля:

=======

Процедура ЗакрытиеПредыдущегоДня(п_ОтступВДнях=1) Экспорт
    л_ПользовательОпределен = ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь);

    л_ВыборкаОрганизаций = Справочники.Организации.Выбрать();
    Пока л_ВыборкаОрганизаций.Следующий() Цикл 
        л_Запись = РегистрыСведений.ГраницыЗапретаИзмененияДанных.СоздатьМенеджерЗаписи();
        л_Запись.Организация = л_ВыборкаОрганизаций.Ссылка;
       Если л_ПользовательОпределен Тогда 
           л_Запись.Пользователь = ПараметрыСеанса.ТекущийПользователь;
       Иначе 
       КонецЕсли;
       л_Запись.ГраницаЗапретаИзменений = НачалоДня(НачалоДня(ТекущаяДата())-п_ОтступВДнях*60*60*24);
       л_Запись.Записать();

       л_Запись = РегистрыСведений.ГраницыЗапретаИзмененияДанных.СоздатьМенеджерЗаписи();
       л_Запись.Организация = л_ВыборкаОрганизаций.Ссылка;
       л_Запись.Пользователь = "";
       л_Запись.ГраницаЗапретаИзменений = КонецГода(КонецДня(ТекущаяДата())+60);
       л_Запись.Записать();
   КонецЦикла;

   ПолныеПрава.УстановитьПараметрГраницыЗапретаИзмененияДанных();
КонецПроцедуры

=======

Теперь откроем модуль обычного приложения, найдем процедуру ПриЗавершенииРаботыСистемы() и перед ее окончанием вставим строку

    АЦРК_Привилегированный.ЗакрытиеПредыдущегоДня(1); //АЦРК

 

ВСЕ.

Параметр в процедуре ЗакрытиеПредыдущегоДня() определяет, на сколько дней дата запрета будет отставать от текущей даты.

Теперь дата запрета редактирования будет автоматически продвигаться вперед для каждого пользователя и будет отставать на 1-2 дня от текущей даты.

Для открытия предыдущих периодов пользователь с полными правами должен устанавливать дату запрета вручную. Только надо помнить, что если он делает это для самого себя, то не надо выходить из программы, а надо зайти в нее еще раз со своим именем (открыть второй сеанс) и только после этого можно закрыть первый сеанс.

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

 Картина даты запрета изменений будет примерно такой:

 

 Для открытия предыдущего периода какому-то конкретному пользователю надо сделать следующее:

  • пользователь, которому нужно открыть период, должен выйти из программы;

  • пользователь с полными правами должен установить для этого пользователя дату запрета редактирования вручную, пользуясь рекомендациями п.1;
  • пользователь, которому открыли период, может зайти в программу и работать в прошлом периоде. При выходе из программы прошлый период автоматически закроется.

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

(с) АЦРК, 2012