Журнал регистрации 1С (sql lite) в web app

04.03.20

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

Данная публикация рассматривает построение компонентного решения работы журнала регистрации в стороннем приложении(web app). Встала задача миграции sql lite жр во внешнюю базу. Данное решение было создано: 1. для хранения жр за весь период 2. для ускорения работы с жр 3. для ускорения сервера предприятия, так как именно он (а точнее рагент) пытается записать данные в жр sql lite(фактически файл на диске), после увеличения размера файла более 10 гб, поступали жалобы по вопросу быстродействия 1с (и не только ради этого) Данная публикация может быть полезной администраторам, программистам, оптимизаторам.

Скачать исходный код

Наименование Файл Версия Размер
src web app
.7z 1,16Mb
4
.7z 1,16Mb 4 Скачать
src win ser допиленный (EventLogLoader-master)
.7z 48,11Mb
6
.7z 48,11Mb 6 Скачать

Компоненты, технологии:

1. вин служба(vb net)  - читает данные из sql lite,  вставляет в базу ms sql, удаляет записи из sql lite

2. web app back end(python) - многопоточная обработка запросов front end, выполняет запросы, отдает json на front

3.  web app front end(js) - форма для пользовательской работы

4. nginx

5. 1c для чтения истории изменения объекта из 1с

6. ms sql server

За основу миграции данных  из sql lite был взят проект(сами не стали писать, погуглили, нашли, посмотрели - вроде подходит):

https://github.com/alekseybochkov/EventLogLoader/tree/master/EventLogLoaderManager. Алексей(автор проекта) проделал хорошую работу, спасибо ему огромное, для законченной функциональности мне не хватало:

1. очистка sql lite после чтения

2. ссылка на 1с в формате 1с предприятия

Данные пункты запилил. Компонент миграции данных из sql lite в сиквел готов. Все работает, все ок.

Доработка базы(ms sql)+win служба:

 

Добавим вьюху, чтобы с нее читать с но лок:

SELECT     dbo.Events.DateTime, dbo.Events.DataString, dbo.Events.DataStructure, dbo.Events.Comment, dbo.Computers.Name AS ComputerName, 
                      dbo.Users.Name AS UsersName, dbo.Events.MetadataID, dbo.Metadata.Name AS MetadataName, dbo.Infobases.Name AS InfobasesName, dbo.Events.UserName, 
                      dbo.Events.ref_ones, dbo.Events.InfobaseCode, 
                      CASE WHEN dbo.EventsType.Name = '_$Session$_.Start' THEN 'Сеанс. Начало' WHEN dbo.EventsType.Name = '_$Session$_.Finish' THEN 'Сеанс. Завершение' WHEN
                       dbo.EventsType.Name = '_$InfoBase$_.ConfigUpdate' THEN 'Информационная база. Изменение конфигурации' WHEN dbo.EventsType.Name = '_$InfoBase$_.DBConfigUpdate'
                       THEN 'Информационная база. Изменение конфигурации  базы данных' WHEN dbo.EventsType.Name = '_$InfoBase$_.EventLogSettingsUpdate' THEN 'Информационная база. Изменение  параметров журнала регистрации'
                       WHEN dbo.EventsType.Name = '_$InfoBase$_.InfoBaseAdmParamsUpdate' THEN 'Информационная база. Изменение  параметров информационной базы' WHEN
                       dbo.EventsType.Name = '_$InfoBase$_.MasterNodeUpdate' THEN 'Информационная база. Изменение главного  узла' WHEN dbo.EventsType.Name = '_$InfoBase$_.RegionalSettingsUpdate'
                       THEN 'Информационная база. Изменение  региональных установок' WHEN dbo.EventsType.Name = '_$InfoBase$_.TARInfo' THEN 'Тестирование и исправление. Сообщение'
                       WHEN dbo.EventsType.Name = '_$InfoBase$_.TARMess' THEN 'Тестирование и исправление. Предупреждение' WHEN dbo.EventsType.Name = '_$InfoBase$_.TARImportant'
                       THEN 'Тестирование и исправление. Ошибка' WHEN dbo.EventsType.Name = '_$Data$_.New' THEN 'Данные. Добавление' WHEN dbo.EventsType.Name = '_$Data$_.Update'
                       THEN 'Данные. Изменение' WHEN dbo.EventsType.Name = '_$Data$_.Delete' THEN 'Данные. Удаление' WHEN dbo.EventsType.Name = '_$Data$_.TotalsPeriodUpdate'
                       THEN 'Данные. Изменение периода рассчитанных итогов' WHEN dbo.EventsType.Name = '_$Data$_.Post' THEN 'Данные. Проведение' WHEN dbo.EventsType.Name
                       = '_$Data$_.Unpost' THEN 'Данные. Отмена проведения' WHEN dbo.EventsType.Name = '_$User$_.New' THEN 'Пользователи. Добавление' WHEN dbo.EventsType.Name
                       = '_$User$_.Update' THEN 'Пользователи. Изменение' WHEN dbo.EventsType.Name = '_$User$_.Delete' THEN 'Пользователи. Удаление' WHEN dbo.EventsType.Name
                       = '_$Job$_.Start' THEN 'Фоновое задание. Запуск' WHEN dbo.EventsType.Name = '_$Job$_.Succeed' THEN 'Фоновое задание. Успешное завершение' WHEN dbo.EventsType.Name
                       = '_$Job$_.Fail' THEN 'Фоновое задание. Ошибка выполнения' WHEN dbo.EventsType.Name = '_$Job$_.Cancel' THEN 'Фоновое задание. Отмена' WHEN dbo.EventsType.Name
                       = '_$PerformError$_' THEN 'Ошибка выполнения' WHEN dbo.EventsType.Name = '_$Transaction$_.Begin' THEN 'Транзакция. Начало' WHEN dbo.EventsType.Name
                       = '_$Transaction$_.Commit' THEN 'Транзакция. Фиксация' WHEN dbo.EventsType.Name = '_$Transaction$_.Rollback' THEN 'Транзакция. Отмена' ELSE dbo.EventsType.Name
                       END AS EventTypeName, dbo.Applications.Name AS ApplicationName, dbo.Events.EventType, dbo.Events.EventID, dbo.Events.TransactionStatus
FROM         dbo.Events WITH (NOLOCK) LEFT OUTER JOIN
                      dbo.EventsType ON dbo.Events.EventID = dbo.EventsType.Code AND dbo.Events.InfobaseCode = dbo.EventsType.InfobaseCode LEFT OUTER JOIN
                      dbo.Applications ON dbo.Events.InfobaseCode = dbo.Applications.InfobaseCode AND dbo.Events.AppName = dbo.Applications.Code LEFT OUTER JOIN
                      dbo.Metadata ON dbo.Events.InfobaseCode = dbo.Metadata.InfobaseCode AND dbo.Events.MetadataID = dbo.Metadata.Code LEFT OUTER JOIN
                      dbo.Users ON dbo.Events.InfobaseCode = dbo.Users.InfobaseCode AND dbo.Events.UserName = dbo.Users.Code LEFT OUTER JOIN
                      dbo.Computers ON dbo.Events.ComputerName = dbo.Computers.Code AND dbo.Events.ComputerName = dbo.Computers.Code AND 
                      dbo.Events.InfobaseCode = dbo.Computers.InfobaseCode LEFT OUTER JOIN
                      dbo.Infobases ON dbo.Events.InfobaseCode = dbo.Infobases.Code

Доработка EventLogProcessor.vb:

 Sub LoadEvents83(FileName As String)
...

 Command.CommandText = "SELECT 
                                            [rowID],
                                            [severity],
                                            [date],
                                            [connectID],
                                            [session],
                                            [transactionStatus],
                                            [transactionDate],
                                            [transactionID],
                                            [userCode],
                                            [computerCode],
                                            [appCode],
                                            [eventCode],
                                            [comment],
                                            [metadataCodes],
                                            [sessionDataSplitCode],
                                            [dataType],
                                            [data],
                                            [dataPresentation],
                                            [workServerCode],
                                            [primaryPortCode],
                                            [secondaryPortCode],

											CASE
											    WHEN  instr(data, ':')>0 
                                                    THEN 
                                                        substr(data, 25 + instr(data, ':'), 8) || '-' ||
                                                        substr(data, 21 + instr(data, ':'), 4) || '-' ||
                                                        substr(data, 17 + instr(data, ':'), 4) || '-' || 
                                                        substr(data, 1 + instr(data, ':'), 4)  || '-' ||
                                                        substr(data, 5 + instr(data, ':'), 12)
													ELSE  
                                                         ''
											END  as ref_ones

                                        FROM [EventLog] 
                                        WHERE [rowID] > @LastEventNumber83 AND [date] >= @MinimumDate
                                        ORDER BY 1
                                        LIMIT 100000"

                Command.Parameters.AddWithValue("LastEventNumber83", LastEventNumber83)

                Dim noOfSeconds As Int64 = (LoadEventsStartingAt - New Date).TotalSeconds
                Command.Parameters.AddWithValue("MinimumDate", noOfSeconds * 10000)
....
 

Command_DELETE.CommandText = "PRAGMA journal_mode = TRUNCATE; DELETE From EventLog WHERE rowID < @LastEventNumber83;"
                Command_DELETE.Parameters.AddWithValue("LastEventNumber83", LastEventNumber83)

                Try

                    Command_DELETE_Count = Command_DELETE.ExecuteNonQuery()

                    Log.Info("Try delete(EventLog) success: " + Command_DELETE_Count.ToString + " LastEventNumber83:" + LastEventNumber83.ToString)

                Catch ex As Exception

                    Log.Error(ex, "Try delete failed")

                End Try

                Command_DELETE.CommandText = "PRAGMA journal_mode = TRUNCATE; DELETE From EventLogMetadata WHERE eventLogID < @LastEventNumber83;"
                Command_DELETE.Parameters.AddWithValue("LastEventNumber83", LastEventNumber83)

...

 

web app.

Итак, backend python:

1.api_log.py(основной файл)

from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn
import threading
import json
from urllib.parse import urlparse, parse_qs
import socket
import api_log_func

class Handler(BaseHTTPRequestHandler):

    def do_GET(self):

        path = urlparse(self.path).path
        qs = urlparse(self.path).query
        qs = parse_qs(qs)

        res =  api_log_func.callback(path, qs, self)

        resp = json.dumps(res, default=api_log_func.json_serial).encode()

        self.send_response(200)
        self.send_header("Content-type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Expose-Headers", "Access-Control-Allow-Origin")
        self.send_header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
        self.end_headers()
        self.wfile.write(resp)
        
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

if __name__ == '__main__':
    server = ThreadedHTTPServer(('0.0.0.0', 8010), Handler)
    print('Starting server, use <Ctrl-C> to stop')
    server.serve_forever()

слушает порт, выполняет методы, возвращает json

2. api_log_func

#import peewee

#import json
from datetime import datetime
from datetime import timedelta

#import os
#import orm.fields
#import gevent
#import threading
## from call import Call # TODO loopback!

#import inspect

## import asyncio

import pymssql, base64, sys, json, time

def get_mssql_conn():
    
    conn = pymssql.connect(server='', user='sa', password='', database='ExLogBook2')  
    cursor = conn.cursor()  

    return cursor

def api_log_get_meta_data(qs):
   
    #res = (OrgCRM
    #    .select(OrgCRM.ref, OrgCRM.name)
    #    .where(OrgCRM.mark == False)
    #    .where(OrgCRM.show == True))

    #res = res.dicts()
    #return list(res) 
   
    d = []

    cursor = get_mssql_conn()

    cursor.execute('SELECT [Code],[Name] FROM [ExLogBook2].[dbo].[Metadata] WHERE [InfobaseCode]=1;')  

    row = cursor.fetchone()  
    while row:  
        
        d.append({'code':row[0],'name':row[1]})

        row = cursor.fetchone()  

    #return sorted(d, key=lambda e: e['name'])
    return d

def api_log_get_event_objs(qs):
    
    #in:
    #metadata_id
    #data_string
     
    d = []

    query_text = 'SELECT DISTINCT [DataString], [DataStructure], [ref_ones] FROM [ExLogBook2].[dbo].[v_Events] WHERE [InfobaseCode]=1 %data_string% %metadata_id% %date_start% %date_end%'

    if qs.get('data_string'):
        query_text = query_text.replace('%data_string%', ' AND [DataString] LIKE \'%'+qs.get('data_string')[0]+'%\'')
    else:
        query_text = query_text.replace('%data_string%', '')
        
    if qs.get('metadata_id'):
        query_text = query_text.replace('%metadata_id%', ' AND [MetadataId] = '+qs.get('metadata_id')[0])
    else:
        query_text = query_text.replace('%metadata_id%', '')
        
    if qs.get('date_start'):
        query_text = query_text.replace('%date_start%', ' AND [DateTime] >= CONVERT(DATETIME, \''+qs.get('date_start')[0]+' 00:00\', 103)')
    else:
        query_text = query_text.replace('%date_start%', '')
            
    if qs.get('date_end'):
        query_text = query_text.replace('%date_end%', ' AND [DateTime] <= CONVERT(DATETIME, \''+qs.get('date_end')[0]+' 23:59\', 103)')
    else:
        query_text = query_text.replace('%date_end%', '')
    
    cursor = get_mssql_conn()

    cursor.execute(query_text)  
    row = cursor.fetchone()  
    while row:  
        
        d.append(
            {
                #'date_time':'',
                #'comment':row[1],
                'data_string':row[0],
                'data_structure':row[1],
                #'user_name':row[4],
                #'computer_name':row[5]
                'ref_ones':row[2]
             }
            )

        row = cursor.fetchone()  

    return sorted(d, key=lambda e: e['data_string'])

def api_log_get_results(qs):
   
    #in:
    #data_structure
    #data_string    
    ##data_string

    d = []

    query_text = 'SELECT [DateTime], [Comment], [DataString], [DataStructure], [UsersName], [ComputerName], [MetadataName], [EventTypeName], [ApplicationName], [EventType], [EventID], [TransactionStatus] FROM [ExLogBook2].[dbo].[v_Events] WHERE [InfobaseCode]=1 %data_structure% %data_string% %metadata_id% %ref_ones% %date_start% %date_end%'

    if qs.get('data_string'):
        query_text = query_text.replace('%data_string%', ' AND [DataString] LIKE \'%'+qs.get('data_string')[0]+'%\'')
    else:
        query_text = query_text.replace('%data_string%', '')
    
    if qs.get('data_structure'):
        query_text = query_text.replace('%data_structure%', ' AND [DataStructure] = '+qs.get('data_structure')[0])
    else:
        query_text = query_text.replace('%data_structure%', '')         
        
    if qs.get('metadata_id'):
        query_text = query_text.replace('%metadata_id%', ' AND [MetadataId] = '+qs.get('metadata_id')[0])
    else:
        query_text = query_text.replace('%metadata_id%', '')
    
    if qs.get('ref_ones'):
        query_text = query_text.replace('%ref_ones%', ' AND [ref_ones] = \''+qs.get('ref_ones')[0]+'\'')
    else:
        query_text = query_text.replace('%ref_ones%', '') 
    
    if qs.get('date_start'):
        query_text = query_text.replace('%date_start%', ' AND [DateTime] >= CONVERT(DATETIME, \''+qs.get('date_start')[0]+' 00:00\', 103)')
    else:
        query_text = query_text.replace('%date_start%', '')
            
    if qs.get('date_end'):
        query_text = query_text.replace('%date_end%', ' AND [DateTime] <= CONVERT(DATETIME, \''+qs.get('date_end')[0]+' 23:59\', 103)')
    else:
        query_text = query_text.replace('%date_end%', '')
    
    cursor = get_mssql_conn()

    cursor.execute(query_text)  
    row = cursor.fetchone()  
    while row:  
        
        d.append(
            {
                'date_time':row[0],
                'comment':row[1],
                'data_string':row[2],
                'data_structure':row[3],
                'user_name':row[4],
                'computer_name':row[5],
                'metadata_name':row[6],
                'event_type_name':row[7],
                'application_name':row[8],
                'event_type':row[9],
                'event_id':row[10],
                'transaction_status':row[11]
             }
            )

        row = cursor.fetchone()  

    return sorted(d, key=lambda e: e['date_time'])

def callback(path, qs, self):

    res = eval('%s(qs)' % path[1:])

    return res

def api_log_get_result_mod_zn(qs):
   
    #in:
    #data_structure
    #data_string    
    ##data_string

    d = []

    query_text = 'SELECT DISTINCT DataString, UsersName, mod_post_doc, ref_ones, var_1, var_2, var_3, var_4 FROM (SELECT [DateTime], [Comment], [DataString], [DataStructure], [UsersName], [ComputerName], [MetadataName], [EventTypeName], [ApplicationName], [EventType], [EventID], [TransactionStatus], CASE WHEN [Comment] like \'%'+'Статус проведения документа до изменения:Да'+'%\' THEN 1 ELSE 0 END AS mod_post_doc, [ref_ones], CASE WHEN [Comment] like \'%<Контрагент>:%\' AND [Comment] like \'%<Автомобиль>:%\'THEN 1 ELSE 0 END AS var_1, CASE WHEN [Comment] like \'%<Автомобиль>:%\'THEN 1 ELSE 0 END AS var_2, CASE WHEN [Comment] like \'%<Контрагент>:%\'THEN 1 ELSE 0 END AS var_3, CASE WHEN [Comment] like \'%Таблица товаров до записи:%\' THEN 1 ELSE 0 END AS var_4 FROM [ExLogBook2].[dbo].[v_Events] WHERE [InfobaseCode]=1 and ([Comment] like \'%'+'Измененнные реквизиты шапки до записи:'+'%\' or [Comment] like \'%+'+'Таблица товаров до записи:'+ '%\' or [Comment] like \'%'+'Статус проведения документа до изменения:%\') %metadata_id% %date_start% %date_end% ) AS T1 WHERE (T1.mod_post_doc=0 and (T1.var_1=1 or T1.var_2=1 or T1.var_3=1)) or (T1.mod_post_doc=1 and T1.var_4=1)  order by var_1 desc, var_2 desc, var_3 desc, var_4 desc '

    query_text = query_text.replace('%metadata_id%', ' AND [MetadataId] = 12')

    if qs.get('date_start'):
        query_text = query_text.replace('%date_start%', ' AND [DateTime] >= CONVERT(DATETIME, \''+qs.get('date_start')[0]+' 00:00\', 103)')
    else:
        query_text = query_text.replace('%date_start%', '')
            
    if qs.get('date_end'):
        query_text = query_text.replace('%date_end%', ' AND [DateTime] <= CONVERT(DATETIME, \''+qs.get('date_end')[0]+' 23:59\', 103)')
    else:
        query_text = query_text.replace('%date_end%', '')
    
    cursor = get_mssql_conn()

    cursor.execute(query_text)  
    row = cursor.fetchone()  
    while row:  
        
        d.append(
            {
                #'date_time':row[0],
                #'comment':row[1],
                'data_string':row[0],
                #'data_structure':row[3],
                'user_name':row[1],
                #'computer_name':row[5],
                #'metadata_name':row[6],
                #'event_type_name':row[7],
                #'application_name':row[8],
                #'event_type':row[9],
                #'event_id':row[10],
                #'transaction_status':row[11],
                'mod_post_doc':row[2],
                'ref_ones':row[3],
                'var_1':row[4],
                'var_2':row[5],
                'var_3':row[6],
                'var_4':row[7]
             }
            )

        row = cursor.fetchone()  

    return d

def json_serial(obj):
  if isinstance(obj, (datetime, datetime.date)):
    return obj.isoformat()
  raise TypeError("Type is not serializable %s" % type(obj))

выполняет запросы к бд. (про сиквел инъекции я в курсе, про то, что параметры в запрос нужно устанавливать по-другому, я тоже в курсе, и про качество кода тоже в курсе)

Общая логика работы:

1. слушать порт

2. выполнить запрос

3.  преобразовать в json

4. отдать по запросу

Фронт енд

Фронт енд запиливал коллега. Ничего сказать не могу. Выглядит так:

web app готово.

Общий вид работы:

Пример получения данных из 1С:

Процедура ЗаполнитьДаннымиИзВнешнегоЖурналаРегистрации(ЖурналРегистрации, ОбъектСсылка)
	
	ИдОбъекта = Строка(ОбъектСсылка.УникальныйИдентификатор());
	Если Не ЗначениеЗаполнено(ИдОбъекта) Тогда 
		
		Возврат;
		
	КонецЕсли;
	
	HTTPСоединение = HTTPСоединение();

	Результат = Неопределено;
	
	ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
	
	Адрес = "/api_log_get_results?ref_ones="+ИдОбъекта;
	
	HTTPЗапрос = Новый HTTPЗапрос(Адрес);
	
	HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос, ИмяФайлаОтвета);
	
	Если HTTPОтвет.КодСостояния=200 Тогда 
		
		Результат = ПрочитатьФайлОтвета(ИмяФайлаОтвета);
		
	КонецЕсли;
	
	УдалитьФайлы(ИмяФайлаОтвета);
	
	HTTPОтвет = Неопределено;
	HTTPСоединение = Неопределено;
	
	Если Не Результат=Неопределено Тогда 
		
		Для Каждого ТекСтрокаРез Из Результат.Данные Цикл
			
			СтрТЗ = ЖурналРегистрации.Добавить();
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

Результат:

 

Тех требования:

1С Предприятие 8.Х (жр в sql lite)

nginx

python 3.5>

ms sql server

ОС не имеет значения, мы деплоили на debian, на windows тоже вполне себе работать будет

Результат работы над поделкой превзошел все мои ожидания (в плане скорости отклика жр)

В архивах сорцы. гуд лак

 

upd 04/03/2020

 
 update.py

 

См. также

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

21600 руб.

15.05.2017    42648    10    24    

38

Версионирование объектов для Альфа-авто, ред 4 и 5.

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

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

4800 руб.

03.09.2016    42317    33    24    

37

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

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

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

10000 руб.

23.05.2014    55604    52    16    

47

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

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

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

9000 руб.

28.08.2019    31144    14    21    

66

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

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

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

5000 руб.

28.11.2018    19639    13    6    

37

Регламентное сокращение журнала регистрации

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

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

1 стартмани

29.12.2023    1401    15    dima_gsv    1    

12

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

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

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

1 стартмани

13.11.2023    3155    4    AlexSTAL    0    

42

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

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

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

3 стартмани

26.09.2023    1842    11    doom2good    10    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. swenzik 09.07.18 20:52 Сейчас в теме
сейчас придёт Люстин и будет ругаться что не в грэйлог
делов-то

Запрос = Новый HTTPЗапрос();
	Запрос.АдресРесурса="/gelf";
	Запрос.Заголовки=Новый Соответствие();
	Запрос.Заголовки.Вставить("Content-Type","application/json");
	Запрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());

	Соединение = Новый HTTPСоединение("10.10.10.10",12203);
2. dmarenin 349 10.07.18 04:45 Сейчас в теме
3. AlexZhukov 17.09.18 12:02 Сейчас в теме
Автор, а можете пояснить что у вас в архиве "src win ser допиленный (EventLogLoader-master)"
там очень много всего и непонятно что в итоге рабочее?
Настройки подключения я так понял в config.json?
4. dmarenin 349 17.09.18 19:08 Сейчас в теме
5. D_E_S131 4 26.02.20 15:00 Сейчас в теме
К сожалению, за последние годы структура ЖР изменилась и конвертер более не работает. :(
6. dmarenin 349 26.02.20 15:04 Сейчас в теме
(5) если разговор идёт в плане поправить и собрать службу парсинга которая на vb.net, то могу докинуть парсер на питоне, от vb.net ушел давно уже из за мемори ликов. парсер на питоне дорабатывайте как нужно, код открыт
7. D_E_S131 4 03.03.20 18:29 Сейчас в теме
8. Fox-trot 158 03.03.20 19:48 Сейчас в теме
Оставьте свое сообщение