Отслеживать действия пользователей #112834


#0 by Скользящий
На меня повесили отслеживание работы пользователей в программе. Повесили  давно, но руки на постоянку не доходили. Пока приходится открывать по тупому все документы за скажем неделю, и смотреть, куда вбивали данные, и зачем. Отчетом можно посмотреть остатки на конкретных складах, и сделать выводы. Но все равно, доля ручного труда преобладает. Вы мне щас скажете, что это не работа программиста, но я не совсем прог, я еще и экономикой занимаюсь и б/у. Мне это интересно, но хотелось бы повысить эффективность проверки. Добавляю запреты на сохренение документов без введения данных в важных полях. Хочу запретить ручные операции, все только документами. Вопрос, есть ли отчеты и внешние обработки, анализирующие конкретные реквизиты документов, введены ли туда данные или пропущены. Обработки анализирующие активность конкретного пользователя в программе, по видам документов и датам. И вообще любые обработки подобного же типа. Я изначально формулирую вопрос расширенно, поскольку я заранее не знаю что может пригодиться.
#1 by Воинствующий кролик
Типа "дайте мне то - сам не знаю, что".
#2 by Rovan
Для этого надо ввести механизм, который пишет все изменения куда-то - например в журнал регситраций.
#3 by Скользящий
Согласен, не совсем конкретно сформулирован вопрос. Спрашивайте - уточню.
#4 by Скользящий
Пример какой нибудь есть, ссылку можешь кинуть?
#5 by France
так уточняй, чо надо старче..
#6 by Скользящий
Если поконкретнее... Ситуация такая. Есть 3 филиаловские базы. В них ежедневно вбивают данные. Я хочу чтобы они ежедневно присылали выгрузку. И ежедневно видеть аналитику, кто, что куда конкретно вводил. А потом звонить, и ставить раком тех, кто вводит неправильно. Если вручную, то мне полдня придется 3 базы смотреть.
#7 by Воинствующий кролик
Странно, а там что, 10 человек один и тот же документ редактируют?
#8 by Rovan
(+2) Поищи - я на Мисту публиковал его этой зимой. Может даже не тоько я.
#9 by Воинствующий кролик
И ещё странно: зачем отслеживать всё, что вводили, чтобы найти то, что вводили неправильно? Не проще ли сперва по неким критериям определять от, что введено неправильно, а потом разбираться - кто это ввёл.
#10 by France
н-да... самое лучше решение, отказаться от столь высококвалифицированной работы - эт работа не для тупых 1С-ников совмещающих функции экономиста и бухгалтера..
#11 by Скользящий
Да, спасибо, что напомнил. Хотелось бы отслеживать случаи редактирования документов задним числом.
#12 by France
и какие критерии правильности ввода данных в документ?..
#13 by Скользящий
Можно и так.
#14 by France
случаи редактирования задним числом надо запретить раз и навсегда, а не сидет и искать в журналах регистрации, "кто, где, когда"..
#15 by airyashov
Ввод задним числом легко ловиться по журнал регистрации.
#16 by France
ввод сзадним числом легко пресекается установкой даты запрета..
#17 by Воинствующий кролик
Да вот, тоже, как хотел сказать. И по поводу прочих ошибок - аналогично. А то почему-то сделают дыру в заборе и сидят, воров караулят...
#18 by Rovan
Это правда для 8-ки
#19 by Скользящий
Главная проблема, в удаленности филиалов. Короче, так. Типа отчета. Такой то пользователь ввел такие то документы. В этих документах такие то данные. Будет ясно кто работает в программе, кто ваньку валяет. Есть справочники например материалов, складов,  кто мусор в справочники пишет. Хочу чтобы в конфе вели БДДС, это означает, что данные должны вводиться правильно,  правильно указывать субконто, например, или выбирать нужную статью в документах например. Я думаю, подобные отчеты делались для директоров и главбухов, поэтому и спрашиваю.
#20 by France
что за конфа хоть расскажи, Настырный.
#21 by Rovan
(+18) Я нашел для 7-ки подобную. Надо ? (Только смотри - надо будет вызовы этой процедуры ставить ВО ВСЕ доки)
#22 by Скользящий
Давай. (Радостно протягивая руки.)
#23 by Rovan
Лови // Записать в журнал регистрации изменения в документе //-------------------------------------------------------------------- Процедура глЗаписатьПротоколИзмененийДокумента(Конт) Экспорт    Изменения = 0;        Если Конт.Выбран = 1 Тогда        В = Конт.Вид;                Док = СоздатьОбъект("Документ");        Док.НайтиДокумент(Конт.ТекущийДокумент);        // Общие        Для Сч = 1 По Метаданные.ОбщийРеквизитДокумента Цикл            Рекв = Метаданные.ОбщийРеквизитДокумента(Сч).Идентификатор;                        Попытка                Если Док.ПолучитьАтрибут(Рекв) <> Конт.ПолучитьАтрибут(Рекв) Тогда                      БылоСтало = " с <" + СокрЛП(Док.ПолучитьАтрибут(Рекв))    + "> на <" +                        СокрЛП( Конт.ПолучитьАтрибут( Рекв )) + ">";                                            ЗаписьЖурналаРегистрации("Изм.рекв. " + СокрЛП(Рекв) + БылоСтало,,,                        Конт.ТекущийДокумент,2);                    Изменения = 1;                КонецЕсли;                Исключение            КонецПопытки;        КонецЦикла;                    // Шапка                                      Для Сч = 1 По Метаданные.Документ(В).РеквизитШапки Цикл            Рекв = Метаданные.Документ(В).РеквизитШапки(Сч).Идентификатор;                        Попытка                Если Док.ПолучитьАтрибут(Рекв) <> Конт.ПолучитьАтрибут(Рекв) Тогда                      БылоСтало = " с <" + СокрЛП(Док.ПолучитьАтрибут(Рекв))    + "> на <" +                        СокрЛП( Конт.ПолучитьАтрибут( Рекв )) + ">";                                            ЗаписьЖурналаРегистрации("Изм.рекв. " + СокрЛП(Рекв) + БылоСтало,,,                        Конт.ТекущийДокумент,2);                    Изменения = 1;                КонецЕсли;                Исключение            КонецПопытки;        КонецЦикла;                    // Табличная часть        Если Конт.КоличествоСтрок <> Док.КоличествоСтрок Тогда                                                        ЗаписьЖурналаРегистрации("Изм.количество строк ",,,Конт.ТекущийДокумент,2);        КонецЕсли;                                  Если Конт.КоличествоСтрок < 100 Тогда            Конт.ВыбратьСтроки;                        Пока Конт.ПолучитьСтроку = 1 Цикл                Для Сч = 1 По Метаданные.Документ(В).РеквизитТабличнойЧасти Цикл                    Рекв = Метаданные.Документ(В).РеквизитТабличнойЧасти(Сч).Идентификатор;                    Док.ВыбратьСтроки;                    Пока Док.Получитьстроку = 1 Цикл                        Если Док.НомерСтроки <> Конт.номерСтроки Тогда                            Продолжить                        КонецЕсли;                                                Попытка                            Если Док.ПолучитьАтрибут(Рекв) <> Конт.ПолучитьАтрибут(Рекв) Тогда                                БылоСтало = " (стр." + Конт.НомерСтроки + ") c <" +                                    СокрЛП( Док.ПолучитьАтрибут(Рекв)) + "> на <" +                                    СокрЛП( Конт.ПолучитьАтрибут(Рекв)) + ">";                                                                ЗаписьЖурналаРегистрации("Изм.рекв. " + СокрЛП(Рекв) + БылоСтало,,,                                    Конт.ТекущийДокумент, 2 );                                Изменения = 1;                            КонецЕсли;                            Исключение                        КонецПопытки;                    КонецЦикла;                КонецЦикла;            КонецЦикла;        КонецЕсли;        КонецЕсли; КонецПроцедуры
#24 by Rovan
А может и для справочника надо ?
#25 by Скользящий
Кидай все.
#26 by Скользящий
Я так понимаю, это работает при изменении доков задним числом, или для всех вновь вводимых. А процедуру глЗаписатьПротоколИзмененийДокумента(Конт)  - ее нужно во все процедуры при записи вставлять, я правильно понял?
#27 by Rovan
Да, в ПриЗаписи. При всех записях доков - если были изменения, то они фиксируются, но конечно только интерактивные изменения. И кстати помни, что твоя конфа перестает быть ТИПОВОЙ. //-------------------------------------------------------------------- // Записать в журнал регистрации изменения в справочнике //-------------------------------------------------------------------- Процедура глЗаписатьПротоколИзмененийСправочника(Конт) Экспорт    Если Конт.Выбран = 1 Тогда        В = Конт.Вид;        Спр = СоздатьОбъект("Справочник."+В);        Спр.НайтиЭлемент(Конт.ТекущийЭлемент);                Если Спр.Код <> Конт.Код Тогда              БылоСтало = " c <" + СокрЛП(Спр.ПолучитьАтрибут("Код")) + "> на <" +                СокрЛП(Конт.ПолучитьАтрибут("Код")) + ">";                            ЗаписьЖурналаРегистрации("Изм.рекв. Код" + БылоСтало,,,Конт.ТекущийЭлемент,2);        КонецЕсли;                    Если Спр.Наименование <> Конт.Наименование Тогда              БылоСтало = " c <" + СокрЛП(Спр.ПолучитьАтрибут("Наименование")) + "> на <" +                СокрЛП(Конт.ПолучитьАтрибут("Наименование")) + ">";                            ЗаписьЖурналаРегистрации("Изм.рекв. Наименование" + БылоСтало,,,                Конт.ТекущийЭлемент,2);        КонецЕсли;                        Для Сч = 1 По Метаданные.Справочник(В).Реквизит Цикл            Рекв = Метаданные.Справочник(В).Реквизит(Сч).Идентификатор;                        Если Метаданные.Справочник(В).Реквизит(Сч).Периодический = 1 Тогда                Если Спр.ПолучитьАтрибут(Рекв).Получить(РабочаяДата) <>                     Конт.ПолучитьАтрибут(Рекв) Тогда                      БылоСтало = " c < " + СокрЛП(Спр.ПолучитьАтрибут(Рекв).Получить(РабочаяДата))                            + "> на <" + СокрЛП(Конт.ПолучитьАтрибут(Рекв)) + ">";                    ЗаписьЖурналаРегистрации("Изм.рекв. " + СокрЛП(Рекв) + БылоСтало,,,                        Конт.ТекущийЭлемент,2);                КонецЕсли;                Иначе                Если Спр.ПолучитьАтрибут( Рекв ) <> Конт.ПолучитьАтрибут( Рекв ) Тогда                      БылоСтало = " c <" + СокрЛП( Спр.ПолучитьАтрибут( Рекв )) + "> на <" +                        СокрЛП( Конт.ПолучитьАтрибут( Рекв )) + ">";                                            ЗаписьЖурналаРегистрации("Изм.рекв. " + СокрЛП(Рекв) + БылоСтало,,,                        Конт.ТекущийЭлемент, 2 );                КонецЕсли;                КонецЕсли;        КонецЦикла;        КонецЕсли; КонецПроцедуры
#28 by Скользящий
ТНХ! Конфа и так не типовая, поздно пить боржоми. Я не понял, она для новых доков работает? или только при изменении существующих?
#29 by Rovan
Для новых было не нужно - там и так событие идет в ЖР, что док сохранен. Но если хочешь, сделай и для новых сам - нужны небольшие доработки в алгоритм.
#30 by ШтушаКутуша
решение есть,я готов,причем в конфе НИЧЕГО менять не надо,но я бескорыстно люблю деньги,если надо то стукнись в асю
#31 by Скользящий
Еще вопрос, в филиалах Центральные базы, + периферийные на складах.Таким макаром (23, 27) я  все изменения добавлю в журнал регистрации. Мне присылают выгрузки из центральных, в выгрузке естессно mlg файла нет. Я сделаю чтобы в здесь была периферийная, которая ежедневно обновляется из регионов файлами выгрузки. Опять таки mlg файл отстуствует. Пользователей учить добавлять этот файл смысла нет - забыть могут. Как решить такую проблему?
#32 by Скользящий
Я тоже бескорыстно люблю деньги, и готов с частью расстаться, если эта часть не слишком большая, и если есть за что. В асе тебя нет.
#33 by Rovan
Делов-то! Сохраняй в справочник тогда, а не в mlg.
#34 by ШтушаКутуша
не нада засорять конфу! на куа?!!!
#35 by Скользящий
Вообще-то, наверно лучше в html файл выгружать.
#36 by France
не стоит этого делать
#37 by Скользящий
Почему. Я знаю точно, что такое можно сделать.
#38 by France
в 8.0 сделали выгрузку журнала регистрации в xml.... - впечатлило скорость анализа, вернее, можно забыть термин "скорость".
#39 by ШтушаКутуша
Браво!
#40 by ШтушаКутуша
+ не менее (а может и более) эффективно это можно забацать в 7.7
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С