v8: Авторство обьектов в базеДобавление в конфигурацию регистрацию, хранение и получение информации о том, кто и когда создавал и редактировал объекты. | | Автор статьи: PR Последняя редакция №1 от 16.03.07 URL: http://kb.mista.ru/article.php?id=501 | |
Ключевые слова: Автор, редактор, создание, пользователь
Часто клиент в лице генерального директора, главного бухгалтера или какого-либо другого представителя фирмы просит вещи, связанные с определением того, кто из пользователей и когда создал или отредактировал какой-либо элемент справочника, документ, запись в регистре сведений и т. д.
Обычно это “разбор полетов” с поиском виновных или разделение прав на объекты по пользователям.
Также можно упомянуть об анализе активности пользователей, выявлении пиков и спадов работы пользователей, построение отчетов с использованием этой информации и т. д.
Штатные средства программы едва ли годятся для всего этого хотя бы потому что лог хранится в отдельном файле, а не в базе, лог текстовый, то есть не поддерживает ссылочную целостность, привязать данные из лога в отчеты можно едва ли и т. д.
Что же требуется для того, чтобы, скажем, добавить в конфигурацию регистрацию, хранение и получение информации о том, кто и когда создавал объект и кто и когда его последним редактировал?
Для полноты картины предположим также, что у нас несколько распределенных баз данных, список которых хранится в плане обмена “РаспределенныеБазы”.
Итак, для этого нам потребуется несколько вещей.
Во-первых, создать справочник “Пользователи”, если его нет.
Во-вторых, настроить авторизацию пользователей, то есть при запуске программы присваивать параметру сеанса “ТекущийПользователь” элемент справочника “Пользователи”, соответствующий текущему пользователю в конфигураторе.
Пример такой авторизации можно посмотреть в статье Книга знаний: v8: Авторизация пользователей при входе в программу.
Параметр сеанса вместо глобальной переменной лучше использовать хотя бы по двум причинам, это возможность завязки RLS на текущем пользователе и возможность вместо
#Если Клиент Тогда
ТекущийПользователь = глТекущийПользователь;
#Иначе
ТекущийПользователь = глОпределитьТекущегоПользователя();
#КонецЕсли
писать
ТекущийПользователь = ПараметрыСеанса. ТекущийПользователь;
В-третьих, в каждый объект метаданных, для которого предполагается делать требуемую функциональность, добавить реквизиты “Автор” и “Редактор” типа “Справочник.Пользователи”, “ДатаСоздания” и “ДатаРедактирования” типа “Дата+Время” и “РаспределеннаяБазаСоздания” и “ РаспределеннаяБазаРедактирования” типа “ПланОбмена. РаспределенныеБазы”.
В-четвертых, в модуль каждого объекта в обработчик “ПередЗаписью” прописать заполнение этих реквизитов.
Делается это с помощью примерно такого кода
Если ЭтоНовый() Тогда
Автор = ПараметрыСеанса.ТекущийПользователь;
ДатаСоздания = ТекущаяДата();
РаспределеннаяБазаСоздания = ПланыОбмена.РаспределенныеБазы.ЭтотУзел();
Иначе
Редактор = ПараметрыСеанса.ТекущийПользователь;
ДатаРедактирования = ТекущаяДата();
РаспределеннаяБазаРедактирования = ПланыОбмена.РаспределенныеБазы.ЭтотУзел();
КонецЕсли;
Собственно, на этом все.
|