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

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

В статье описано, как доработать конфигурацию УТ 10.3, чтобы при входе определенных пользователей в базу для них автоматически устанавливался запрет редактирования предыдущего дня.

 

Автоматический запрет редактирования (для конфигураций УТ 10.3)

редакция 2

В популярной конфигурации «1С:Управление торговлей 10.3» есть механизм установки запрета редактирования по пользователям базы данных.

С его помощью можно, например, запретить менеджерам редактировать информацию ранее определенной даты, например, текущей. Но есть один минус – это надо делать вручную. Как-то не технологично.

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

В первой редакции было сделано так, что если для пользователя никаких действий не предпринималось, то и запрет редактирования для него автоматически не устанавливался, а для установки надо было установить пользователю дополнительную настройку.

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

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

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

Итак.

Задача.

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

Решение.

1. Вводим дополнительное право пользователя.

Назовем его «Автоматически НЕ закрывать предыдущий день».

}39; В режиме Предприятие открываем меню «Операции / Планы видов характеристик / Права пользователей»

}39; В группу «Документы» (или куда сочтете нужным) добавляем новое право «Автоматически НЕ закрывать предыдущий день», тип значения – Булево (составной тип отменяется).

}39; Во избежание возможных эксцессов при последующих обновлениях код нового элемента лучше установить в «1000», например. Разработчики конфигурации при пополнении списка новыми предопределенными характеристиками вряд ли дойдут до такого кода.

}39; Теперь в меню «Сервис / Пользователи / Настройка дополнительных прав пользователей» в группе «Документы» появился новый флажок, который можно установить тем пользователям, для которых НЕ надо задействовать механизм автоматического закрытия вчерашнего дня от редактирования.

2. Дорабатываем конфигурацию

}39; добавляем новый ПРИВИЛЕГИРОВАННЫЙ общий модуль. Назовем его, например, «АЦРК_Привилегированный». В свойствах модуля должны быть установлены галочки «Привилегированный», "Вызов сервера" и «Сервер».

В этом модуле должны быть следующая процедура:

 

Процедура ЗакрытиеПредыдущегоДня() Экспорт

// НЕ зхакрывает предыдущий день если установлено право пользователя "Автоматически НЕ закрывать предыдущий день"

// в противном случае производится запрет редактирования по предыдущий день включительно.

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

// "Автоматически НЕ закрывать предыдущий день" не установлена.

л_Право = ПланыВидовХарактеристик.ПраваПользователей.НайтиПоНаименованию("Автоматически НЕ закрывать предыдущий день");

//л_Право = ПланыВидовХарактеристик.ПраваПользователей.НайтиПоНаименованию("Автоматически закрывать предыдущий день");

Если л_Право.Пустая() Тогда

// если такой настройки в принципе в базе нет, то ничего и не делаем

Возврат;

КонецЕсли;

 

л_ТекущийПользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();

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

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

| ЗначенияДополнительныхПравПользователя.Значение

|ИЗ

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

|ГДЕ

| ЗначенияДополнительныхПравПользователя.Пользователь = &Пользователь

| И ЗначенияДополнительныхПравПользователя.Право = &Право";

Запрос.УстановитьПараметр("Пользователь", л_ТекущийПользователь);

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

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

Если Результат.Пустой() Тогда

л_УстановитьЗапрет = Истина;

Иначе

Выборка = Результат.Выбрать();

Выборка.Следующий();

л_УстановитьЗапрет = НЕ Выборка.Значение;

КонецЕсли;

 

Если л_УстановитьЗапрет Тогда

л_Запись = РегистрыСведений.ГраницыЗапретаИзмененияДанных.СоздатьМенеджерЗаписи();

л_Запись.Пользователь = л_ТекущийПользователь;

л_Запись.ГраницаЗапретаИзменений = НачалоДня(НачалоДня(ТекущаяДата())-60);

л_Запись.Записать();

КонецЕсли;

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

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

 

}39; Вставляем одну строку в модуль приложения, перед окончанием процедуры «ПриНачалеРаботыСистемы»

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

КонецПроцедуры // ПриНачалеРаботыСистемы()

 

Вот и все.

3. Как это работает

Уполномоченный пользователь в настройках дополнительных прав пользователей устанавливает у нужных пользователей флажок «Автоматически НЕ закрывать предыдущий день». У всех остальных пользователей (будем называть их менеджерами) флажок оставляем не установленным.

Когда такой менеджер утром заходит в базу данных для него автоматически устанавливается запрет редактирования по вчерашний день включительно. В этом можно убедиться, посмотрев в меню «Сервис / Настройка учета / Установка даты запрета изменения данных». На закладке «Основная дата» вы увидите записи по тем менеджерам, для которых не установлен флажок «Автоматически НЕ закрывать предыдущий день».

Чтобы дать такому менеджеру возможность изменения документов уполномоченный пользователь должен выполнить следующие действия:

}39; выбрать меню «Сервис / Настройка учета / Установка даты запрета изменения данных». На закладке «Основная дата» отображаются записи по пользователям. Для нужного менеджера отодвинуть дату запрета на нужную дату, нажать кнопку «Установить»;

}39; в настройке дополнительных прав пользователей для нужного менеджера установите флажок в строке «Автоматически НЕ закрывать предыдущий день»;

}39; менеджер должен выйти из базы и снова в нее зайти;

}39; после того, как менеджер войдет в базу, снова снимите флажок «Автоматически НЕ закрывать предыдущий день». После этого уполномоченный пользователь может продолжать свою работу. При очередном входе менеджера в базу (на следующий день) для него снова установится запрет редактирования на предыдущую дату.

 

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

 

Файлы

Наименование Файл Версия Размер Кол. Скачив.
Текст статьи
.doc 25,50Kb
11.11.12
84
.doc 25,50Kb 84 Бесплатно

См. также

Комментарии

1. reynagroup 21.01.2011 00:51
С точки зрения бухгалтерского учёта - не совсем правильно изменять документы в прошлом периоде.
необходимо сторнировать.
# Ответить
2. Поручик 21.01.2011 18:14
http://infostart.ru/public/71590/

Там же есть и список аналогичных работ.
Ответили: (3)
# Ответить
3. acrk 21.01.2011 19:05
(2) Прямой аналог только один - Мотива... Но он гораздо круче, поэтому платный.
Зато здесь минимальные изменения, вносимые в код разработчика: 1 строка, меньше не бывает.
# Ответить
4. eAkademik 15.09.2011 22:35
В рознице работает без проблем, как раз искал подобное
# Ответить
5. trunix 14.10.2011 08:35
Если использовать вместо ПланыВидовХарактеристик.ПраваПользователя, ПланыВидовХарактеристик.НастройкиПользователей можно будет указывать количество дней запрета.
Ответили: (6)
# Ответить
6. acrk 14.10.2011 09:32
(5) Настройки пользователя доступны пользователю, так что он сможет сам отодвинуть дату запрета на сколько захочет. Использование прав пользователя более правильно, потому что к ним доступ есть не у всех.
# Ответить
7. esa35 15.11.2011 11:37
eAkademik пишет:

В рознице работает без проблем, как раз искал подобное


у меня в Рознице 8.2 не работает((( подскажите как быть. у меня почему то кассиры (с ролью РМК) спокойно проводят предыдущий день, а старые документы(предыдущего месяца) не могут. бьюсь и не пойму в чем проблема. дата запртеа ставится, но они все равно могут изменить(((

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

Если л_УстановитьЗапрет Тогда
КолДней = Число(Константы.КоличествоДнейЗапрета.Получить());

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

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


кто подскажет что может быть не так?
# Ответить
8. dynamite 18.04.2012 23:39
Я что то не то делаю скорее всего и у меня выходит ошибка при запуске


{МодульОбычногоПриложения(206,3)}: Переменная не определена (АЦРК_Привилегированный)
<<?>>АЦРК_Привилегированный.ЗакрытиеПредыдущегоДня(); //АЦРК
Ответили: (9)
# Ответить
9. acrk 19.04.2012 11:54
(8) dynamite,
АЦРК_Привилегированный - это общий модуль. Проверьте его свойства, внимательно по инструкции.
# Ответить
10. dynamite 19.04.2012 20:17
вроде все сделал по инструкции. Создал общий модель "АЦРК_Привилегированный" в свойствах установил галочки в «Привилегированный» и «Сервер», в новосозданном модуле с копировал это

Процедура ЗакрытиеПредыдущегоДня() Экспорт
// НЕ зхакрывает предыдущий день если установлено право пользователя "Автоматически НЕ закрывать предыдущий день"
// в противном случае производится запрет редактирования по предыдущий день включительно.
// Для вновь введенных пользователей предыдущий день будет автоматически закрываться, потому что настройка
// "Автоматически НЕ закрывать предыдущий день" не установлена.
л_Право = ПланыВидовХарактеристик.ПраваПользователей.НайтиПоНаименованию("Автоматически НЕ закрывать предыдущий день");
//л_Право = ПланыВидовХарактеристик.ПраваПользователей.НайтиПоНаименованию("Автоматически закрывать предыдущий день");
Если л_Право.Пустая() Тогда
// если такой настройки в принципе в базе нет, то ничего и не делаем
Возврат;
КонецЕсли;

л_ТекущийПользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗначенияДополнительныхПравПользователя.Значение
|ИЗ
| РегистрСведений.ЗначенияДополнительныхПравПользователя КАК ЗначенияДополнительныхПравПользователя
|ГДЕ
| ЗначенияДополнительныхПравПользователя.Пользователь = &Пользователь
| И ЗначенияДополнительныхПравПользователя.Право = &Право";
Запрос.УстановитьПараметр("Пользователь", л_ТекущийПользователь);
Запрос.УстановитьПараметр("Право", л_Право);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
л_УстановитьЗапрет = Истина;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
л_УстановитьЗапрет = НЕ Выборка.Значение;
КонецЕсли;

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


вроде и все. А так же в модуле обычного приложении перед окончанием процедуры «ПриНачалеРаботыСистемы» вставил это

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

может я что то не да понял или еще что надо дописать
# Ответить
11. dynamite 19.04.2012 20:35
все нашел ошибку, просто надо было в общем модуле свойствах поставит галочку не в привилегированный а в Клиент (обычное приложении)
всем спасибо!
# Ответить
12. Bud78 20.10.2012 12:51
Установил на последней версии УТ (10.3.19.3).
дата запрета не устанавливается :(
Ответили: (13)
# Ответить
13. acrk 22.10.2012 23:26
(12) Bud78,
Специально проверил на релизе 10.3.19.3 - все работает.
Причина скорее всего в том, что у пользователя, которого вы проверяете, установлены полные права. На таких запрет не действует. На мой взгляд это неправильно, но это уже вопрос к 1С.
Но ведь логично же не давать полные права тем пользователям, которых вы хотите ограничить.
Ответили: (16)
# Ответить
14. Bud78 23.10.2012 10:41
Проверяю на пользователях. у которых нету полных прав.

А по поводу вопроса к 1с, то в настройках учетной политики есть галочка, которая разрешает применение даты запрета для полных прав.
Ответили: (15)
# Ответить
15. acrk 23.10.2012 14:01
(14) Bud78,
у модуля галка "Привилегированный" установлена ?
# Ответить
16. azeraus 23.10.2012 14:58
Помогите пожалуйста, сделал все по инструкции, но выдает ошибку

{ОбщийМодуль.АЦРК_Привилегированный.Модуль(13)}: Метод объекта не обнаружен (ОпределитьТекущегоПользователя)
л_ТекущийПользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
Ответили: (17)
# Ответить
17. acrk 23.10.2012 15:29
(16) azeraus,
У вас точно УТ 10.3 ?
А то может вы это в УТ 11 проделали ?
Ответили: (18)
# Ответить
18. azeraus 24.10.2012 07:12
(17) acrk, У меня стоит Управление торговлей для Казахстана локализация САПА версия 2.2.12.7, платформа 8.2.14.537
Это может как то повлиять?
Ответили: (19)
# Ответить
19. acrk 24.10.2012 09:29
(18) azeraus,
Не знаю. Наверное может. Может они там все процедуры экспортные переименовали.
Надо смотреть.
Вы сами можете посмотреть, есть ли в конфигурации общий модуль "УправлениеПользователями" (судя по сообщению - есть) и есть ли в нем процедура "ОпределитьТекущегоПользователя" (судя по сообщению - нет).
Ответили: (20)
# Ответить
20. azeraus 24.10.2012 10:53
(19) acrk, Все точно так как вы написали, есть общий модуль "УправлениеПользователями", но нет процедура "ОпределитьТекущегоПользователя", посоветуйте как быть, сам я не программист, но нееемного разбираюсь в 1С :)
Ответили: (21)
# Ответить
21. acrk 24.10.2012 18:26
(20) azeraus,
вышлите модуль на info@acrk.ru
# Ответить
22. LexBG 15.02.2013 15:14
Спасибо огромное! Как раз стояла такая задача, сэкономил массу времени!
# Ответить
23. xoxmaister 15.10.2013 17:04
Отлично написано! очень подробно! Спасибо большое!
# Ответить
24. masik85 30.09.2014 13:26
Спасибо огромное за разработку!! Во- первых очень интересный метод , с помощью ПлановВидовХарактеристик. Мне Ваш способ понравился больше всего.Мало изменений и практически одноразово в конфе, все остальное можно добавлять через меню. Просто молодец! Переделаю под УПП. Единственно , наверное еще переделаю чтобы "галки" ставить тем у кого обрубать период, их меньше. Остальные по общей дате практически умещаются. В любом случае Спасибо огромное! за труд, за идею, за воплощение.
Ответили: (25)
# Ответить
25. acrk 01.10.2014 11:20
(24) masik85,
В первом варианте так и было - галочки ставились тем, кому надо обрубать период.
Потом специально переделал, потому что это неправильно - принцип автоматического запрета нарушается. Вот забыли Вы общую дату изменить, значит и запрет забыл установиться.
Тем более, если у Вас УПП, значит пользователей много, текучка есть. Один кладовщик уволился, другой пришел. Нового пользователя создали, а галочки установить забыли - период не закрылся.
А так он зароется автоматически по вчерашний день.
Если этот рядовой кладовщик будет недоволен - вы ему объясните, что ему так положено. А если этот новый пользователь начальник какой-нибудь, и вы ему должны были бы открыть больший период, но забыли, он к Вам сам обратится и напомнит, и Вы тогда ему откроете период какой надо.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016