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

18.05.20

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

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

Скачать файлы

Наименование Файл Версия Размер
ЖурнализированиеРегистраСведенийПередЗаписью.txt
.txt 4,34Kb
27
.txt 4,34Kb 27 Скачать

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

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

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

О практической пользе этой процедуры. Эта процедура, будучи своевременно встроена в базу 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));

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

 

См. также

LogManager - Внешний журнал регистрации в SQL

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Журнал регистрации платформы 1С в SQL. Общая база хранения всех журналов. Через com-подключение регламентным заданием периодически догружает журналы регистраций из рабочих баз. Предоставляет настраиваемый доступ к журналам по правам подразделений. Формирует отчеты по пользователям и данным.

10000 руб.

23.05.2014    54969    50    16    

43

Версионирование справочников, документов и регистров сведений на SQL-сервере

Журнал регистрации Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

19200 руб.

22.02.2018    34681    60    53    

54

Мониторинг баз и серверов 1С

Журнал регистрации Мониторинг Платформа 1С v8.3 Платные (руб)

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

9000 руб.

28.08.2019    29620    11    21    

59

LogiCH - хранение и анализ журнала регистрации в сверхбыстрой СУБД ClickHouse

Журнал регистрации Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

5000 руб.

28.11.2018    19236    12    6    

35

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

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

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

1 стартмани

13.11.2023    1790    2    AlexSTAL    0    

33

Мониторинг состояния с отправкой в telegram

Журнал регистрации Инструменты администратора БД Мониторинг Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Абонемент ($m)

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

3 стартмани

26.09.2023    1177    5    doom2good    10    

11

История фоновых заданий

Журнал регистрации Статистика базы данных HighLoad оптимизация Конфигурации 1cv8 Абонемент ($m)

Удобный отчет по выполнению фоновых заданий в 1С с разбивкой по разным критериям, например по срокам, в какой последовательности, выполнение дольше всех, сколько одновременно и так далее.

5 стартмани

04.09.2023    437    5    Maxiko    0    

7

Перенаправление вывода журнала регистрации

Linux Журнал регистрации Платформа 1С v8.3 Бесплатно (free)

Экспериментируем с реализацией драйвера текстового устройства под Linux для перенаправления вывода журнала регистрации.

07.08.2023    986    Lars Ulrich    1    

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

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