Готовое решение для протоколирования записи и удаления данных в регистре сведений

18.05.20

База данных - Журнал регистрации

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ЖурнализированиеРегистраСведенийПередЗаписью.txt
.txt 4,34Kb
28
28 Скачать (10 SM) Купить за 4 550 руб.

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

Особенности реализации : если в наборе записей регистра сведений больше одной записи, то подробно протоколируется только первая запись набора и количество записей в наборе.

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

О практической пользе этой процедуры. Эта процедура, будучи своевременно встроена в базу 1С Зарплата и управление персоналом 8.2, реально помогла мне отследить порчу конкретным пользователем штатного расписания в базе 1С Зарплата и Управление персоналом 8.2 и переклассифицировать инцидент «порча данных штатного расписания» из разряда «программный сбой» в «ошибку пользователя».

 

Процедура ЖурнализированиеРегистраСведенийПередЗаписью(Источник, Отказ, Замещение) Экспорт

   
НаборЗаписей = Источник;

   
ТаблицаДляПечати1 = НаборЗаписей.Выгрузить();

   
ОписаниеИзменений1 = "";

   
СсылкаДляОтраженияВЖурналеРегистрации1 = Неопределено;

    Если
ТаблицаДляПечати1.Количество() = 0 Тогда
       
// в регистр пишется пустой набор записей, т.е. происходит удаление из регистра сведений по наложенному в наборе отбору

       
ЧтоПроисходит1 = "Удаление в регистре сведений";

       
МетаданныеНабора = НаборЗаписей.Метаданные();

       
ИмяРегистра = МетаданныеНабора.ПолноеИмя();

       
// Формируем текст условия блока ГДЕ основного запроса,
        // в соответствии с установленным отбором для набора записей

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

       
СписокПолейУсловияОтбораТекст = "";
       
Итерация = 0;
        Для каждого
ЭлементОтбора Из НаборЗаписей.Отбор Цикл
            Если не
ЭлементОтбора.Использование Тогда
                Продолжить;
            КонецЕсли;

            Если
Итерация = Тогда
               
ОписаниеИзменений1 = ОписаниеИзменений1 + "Отбор : ";
            Иначе
               
СписокПолейУсловияОтбораТекст = СписокПолейУсловияОтбораТекст  + " И ";
            КонецЕсли;

           
СписокПолейУсловияОтбораТекст = СписокПолейУсловияОтбораТекст +" Набор." + ЭлементОтбора.Имя + " = &" + ЭлементОтбора.Имя;

           
// здесь нужно сохранить в журнале регистрации значения отборов
           
ОписаниеИзменений1 = ОписаниеИзменений1 + "" + ЭлементОтбора.Имя + " = " + СокрЛП(Формат(ЭлементОтбора.Значение, "ДФ=dd.MM.yyyy")) + "" + Символы.ПС;

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

           
Итерация = 1;
        КонецЦикла;

        Если
Итерация = 1 Тогда
           
СписокПолейУсловияОтбораТекст = " ГДЕ " + СписокПолейУсловияОтбораТекст;
        КонецЕсли;

       
Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ИмяРегистра + " КАК Набор
        | "
+ СписокПолейУсловияОтбораТекст + "";

       
// ТаблицаДляПечати1 = Запрос.Выполнить().Выгрузить();
        // а тут лежат старые данные в регистре (которые перетираются!!!)
        // их можно анализировать и печатать

   
Иначе // записывается непустой набор записей

       
ЧтоПроисходит1 = "Запись в регистр сведений";

        Для каждого
Запись1 Из ТаблицаДляПечати1 Цикл

            Для каждого
Колонка1 Из ТаблицаДляПечати1.Колонки Цикл

               
ЗначениеКолонки1 = Запись1[Колонка1.Имя];
                Если
ЗначениеЗаполнено(ЗначениеКолонки1) Тогда // печатаем почти все значения непустых измерений, ресурсов, реквизитов!

                   
ТипЗнач1 = ТипЗнч(ЗначениеКолонки1);

                   
МожноПечататьПолноеЗначениеКолонки1 = Истина;
                    Если
ТипЗнач1 = Тип("Число") Тогда
                        Если
ЗначениеКолонки1 > 1000 Тогда
                           
// защита данных в журнале регистрации : не печатаем числовые значения колонок, если они превышают 1000 !
                            // например, это могут быть вилки окладов!
                           
МожноПечататьПолноеЗначениеКолонки1 = Ложь;
                        КонецЕсли;
                    КонецЕсли;

                    Если
МожноПечататьПолноеЗначениеКолонки1 Тогда
                       
ОписаниеИзменений1 = ОписаниеИзменений1 + Колонка1.Имя + " = " + Формат(ЗначениеКолонки1, "ДФ=dd.MM.yyyy") + Символы.ПС;

                        Если
СсылкаДляОтраженияВЖурналеРегистрации1 = Неопределено Тогда
                            Если
ТипЗнач1 <> Тип("Дата") Тогда
                               
СсылкаДляОтраженияВЖурналеРегистрации1 = ЗначениеКолонки1;
                            КонецЕсли;
                        КонецЕсли;

                    Иначе
                       
ОписаниеИзменений1 = ОписаниеИзменений1 + Колонка1.Имя + " > 1000" + Символы.ПС;
                    КонецЕсли;

                КонецЕсли;
            КонецЦикла;

            Прервать;
// прочтём только первую запись

       
КонецЦикла;

        Если
ТаблицаДляПечати1.Количество() > 1 Тогда

           
// по остальным записям - укажем только полное количество записей

           
ОписаниеИзменений1 = "Всего записей набора = " + ТаблицаДляПечати1.Количество() + "; первая запись :" + Символы.ПС + ОписаниеИзменений1;

        КонецЕсли;

    КонецЕсли;

   
ЗаписьЖурналаРегистрации(ЧтоПроисходит1, УровеньЖурналаРегистрации.Предупреждение, МетаданныеНабора, СсылкаДляОтраженияВЖурналеРегистрации1, СокрЛП(ОписаниеИзменений1));

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

 

См. также

Журнал регистрации Системный администратор Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

История изменений реквизитов и табличных частей справочников, документов, независимых регистров сведений, возможность отката изменения, восстановление удаленных объектов, сбор статистики использования базы 1С. Альтернативный журнал регистрации.

22800 руб.

22.02.2018    35962    59    54    

57

Журнал регистрации Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

6000 руб.

28.11.2018    21337    18    7    

44

Журнал регистрации Программист Россия Бесплатно (free)

В материале рассматривается сравнение двух инструментов для работы с журналом регистрации 1С: утилиты ibcmd и платформы Vector. Описаны их функциональные возможности, тестирование производительности и практическое применение для преобразования логов в формат JSON.

20.11.2024    1964    user1913000    13    

20

Журнал регистрации Тестирование QA Программист Бесплатно (free)

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

21.10.2024    4020    leemuar    8    

24

Инструменты администратора БД Журнал регистрации Системный администратор Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Внешняя обработка для регламентного сокращения журнала регистрации для конфигураций на базе БСП и платформы 8.3.20+

1 стартмани

29.12.2023    2645    43    dima_gsv    3    

14

Журнал регистрации Мониторинг Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    1842    6    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    5651    11    AlexSTAL    0    

47
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. w-divin 20.03.13 18:35 Сейчас в теме
Полезненько... спасибки...
megatrend; +1 Ответить
2. sstar90 21.03.13 10:01 Сейчас в теме
спасибо, сам задумывался над этим
megatrend; +1 Ответить
3. Alex1Cnic 150 27.11.13 10:19 Сейчас в теме
О как раз то что доктор прописал.... У меня тоже аналогичная задачка есть: добавлять в журнал регистрации дополнительные данные. Супер! Плюсую!
megatrend; +1 Ответить
4. b-dm 175 27.10.14 18:09 Сейчас в теме
Чудесная вещь. сейчас проверим :-) А в текстовом файле выложено то же самое что написано в публикации ?)
megatrend; +1 Ответить
5. megatrend 131 27.10.14 22:28 Сейчас в теме
(4) b-dm, да, файл не отличается от статьи.
6. primara 55 13.05.15 16:33 Сейчас в теме
Спасибо, очень помогло!
megatrend; +1 Ответить
7. ASV085 3 25.06.15 09:35 Сейчас в теме
Спасибо, как раз нужно было на регистр сведений вести запись в журанал, кто его меняет, а кто его портит.
megatrend; +1 Ответить
8. kosmo0 111 05.04.17 08:47 Сейчас в теме
Журналирование изменений регистров сведений

Переделанный вариант. С описанием почему реализовано именно так.
afk; Infected; megatrend; +3 Ответить
Оставьте свое сообщение