Парсинг полного технологического журнала 1С и выгрузка в таблицу СУБД (MSSQL, Postgres, SQLight) с помощью python

30.03.22

База данных - Инструменты администратора БД

Разработан скрипт, который разбирает полный технологический журнал 1С и загружает результат в различные СУБД.

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

Наименование Файл Версия Размер
Парсинг полного технологического журнала 1С и выгрузка в таблицу СУБД (MSSQL, Postgres, SQLight) с помощью python
.zip 27,88Kb
8
.zip 27,88Kb 8 Скачать

Некоторое время назад, анализируя запросы в SQLPrifiler, я обнаружил, что очень удобно работать с результатами, если они сохранены в таблицу. Получается, что мы легко можем, выполняя SQL запросы, фильтровать данные как угодно и строить нужную нам аналитику.

Я подумал, почему бы так не сделать для технологического журнала? К тому же я давно хотел освоить скриптовый язык.

Изначально проект начинался на perl, и параллельно я повторял функционал на python. В итоге я понял, что работа с perl гораздо сложнее и есть ряд трудно решаемых проблем, в итоге готовый результат сделан на python.

 

Проблемы perl
 
 

 

 
 Немного пожалуюсь на структуру технологического журнала

 

Скрипт находится на GITHUB: https://github.com/free-archer/read-tj-pl

Содержит подробное описание, как его использовать. Тут я не буду описывать как клонировать репозиторий и устанавливать python (в README.md это есть если нужно). Опишу, как использовать.

 

Работа со скриптом

После клонирования у вас будут доступны следующие файлы:

 

 

parse_orm.py - сам скрипт

start.bat.simple - батник для запуска (его нужно переименовать убрав .simple )

21103114.log - пример лога

full_logcfg.xml - настройки техжурнала, которые были использованы для тестов

 

Первое, что нужно сделать это перейти в папку проекта и создать виртуальное окружение python, чтобы не засорять модулями систему. Выполните команду:

python -m virtualenv env

Активируйте виртуальное окружение:

.\env\Scripts\activate.bat

После установите необходимы зависимости из файла:

pip install -r .\requirements.txt

Буду установлены следующие пакеты поддержки СУБД:

psycopg2==2.9.3 - поддержка postgress

pymssql==2.2.4 - поддержка  MS SQL

SQLAlchemy==1.4.32 - сама ОРМ это обязательно

 

Лишнее можно убрать, sqlight поддерживается из коробки.

 

Работа с программой

Параметры запуска и параметры подключения к СУБД вынесены в переменные окружения, чтобы не держать их в коде. Все параметры содержаться в файле start.bat.simple

Переименуйте файл удалив ".simple". Останется "start.bat".

Задайте в файле необходимые параметры, они вполне понятны.

 

@echo off
REM Путь к файлу с логами технологического журнала 1С
set filename=21103114.log

REM Параметры соединения с базой данных. Для MSSQL и postgres совпадают.
set sql_type=sqlight
REM sql_type может принимать заначения: mssql, postgres, sqlight
set server=localhost
set database=tempdb
set username=sa
set password=pass
set table=table_name
REM Для SQLight достаточно указать только имя или путь к файлу. Файл будет создан в текущей директории запуска.
set db_file=foo2.db

После чего выполните запуск bat-файла.

Пример файла сделан для windows, но его несложно изменить для Linux.

Для просмотра результата SQLight базы удобно использовать бесплатную программу: https://sqlitebrowser.org/

 

Замеры времени выполнения

Ниже я приведу замеры времени, которы я выполнил на своем компьютере: Core i5-7400 3.00GHz, SSD, 16 Гб.

Был взят полный технологический журнал property=all размером 1032 Мб (1 Гб)

Количество строк в журнале: 290760

 

Время выполнения с использованием модуля pyodbc

(сейчас тот скрипт не используется, находится в папке /deprecated/parse.py)

Время выполнения: 0:04:10

Потребление памяти 3,344 Gb

 

Время выполнения с использованием модуля SqlAlchemy

Вставка происходит в цикле по одному запросу, в качестве драйвера используется pymssql

Время выполнения: 0:09:39 mssql сервер

Время выполнения: 0:09:28 postgres сервер

Время выполнения: 0:41:00 Sqlight

Потребление памяти 3,365 Gb

 

Кстати в DB Browser for SQLite есть также удобные фильтры наподобие Excel, имя удобно делать выборки. Возможно этот вариант будет проще для ознакомления или для работы с небольшим объемом лога. Единственное время выгрузки значительно дольше.

 

Напоследок ещё раз ссылка на репозиторий:

https://github.com/free-archer/read-tj-pl

 

И приложу архив.

Python techlog технологический журнал

См. также

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

12000 руб.

06.12.2023    2980    13    1    

34

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3545    11    1    

34

SALE! 30%

PowerTools

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177760    1073    0    

849

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27383    79    146    

59

Система хранения присоединенных файлов в томах на диске

Инструменты администратора БД Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    61320    88    59    

73

"Менеджер потоков 2.1": УПП: "Восстановление партий"

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

Как оптимизировать то, что, считалось, не поддается оптимизации? Как повысить доступность базы данных? Как проводить самую «времяемкую» операцию не по паре раз в неделю, а по несколько раз в день*? Ответ есть!

20000 руб.

12.09.2019    11746    5    9    

7

Брандмауэр для сервера 1С Предприятие 8 - внешнее управление сеансами

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

Управление возможностью начала и возобновления сеансов пользователей по различным условиям, ограничение общего числа возможных сеансов для работы с информационной базой, резервирование возможности работы с информационной базой определенных польззователей, запрет запуска нескольких сеансов для пользователя, журнализация событий начала (возобновления) и завершения (гибернации) сеансов, ведение списка активных сеансов для информационных баз кластера серверов

3600 руб.

06.02.2017    31111    31    18    

47

Хранилище файлов на SQL

Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Управленческий учет Платные (руб)

Привязка файлов / сканов к объектам 1С с сохранением их на SQL-сервере

12000 руб.

09.10.2019    10986    5    8    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1292 30.03.22 12:14 Сейчас в теме
Плюсанул.

"ссылка на репозиторий:" - оформить в виде ссылки, чтобы удобнее переходить было.

"print" - желательно заменить на logger c доп выводом на экран.

сделать обертку в main() чтобы можно было подключать при необходимости (хороший тон)

обработка filename= os.environ.get('filename'), вариант сделать на argparse, еще лучше через Click https://click.palletsprojects.com/en/8.1.x/ или Typer https://typer.tiangolo.com/

config = file_handler.load_config('pg_copy_prod_to_test_config.json') (https://infostart.ru/1c/articles/1625361/)
2. malikov_pro 1292 30.03.22 12:16 Сейчас в теме
Картинку с результатом в таблице растянуло, сделать скрин части экрана и подрезать до 600 px при загрузке
3. FreeArcher 158 31.03.22 07:46 Сейчас в теме
(1) (2) Спасибо за советы, замечания учел.
Насчет последних 3 пунктов, посмотрю. Изначально я избегал лишних зависимостей, поэтому не использовал модули работы с параметрами.
Но идея мне понравилась, логер уже начал внедрять, посмотрю и остальное.
4. user610020_lepestov 14.02.23 10:35 Сейчас в теме
Здравствуйте!

Есть замечания по скрипту:

Первое:
...
if (re.match(r'\d{2}:\d{2}.\d{6}-\d', str)):
...
Каждый раз приводи к компиляции регулярного выражения, расходуя ресурсы.
Правильнее 1 раз скомпилировать выражение и в дальнейшем и использовать переменную
regex_newevent = re.compile(r"\d{2}:\d{2}.\d{6}-\d")

Второе:
По результату цикла with open(...) as f: в массив строк не добавляется последняя строка события техжурнала. Закрывайте with так же добавлением последней строки события
5. FreeArcher 158 14.02.23 12:13 Сейчас в теме
(4) Спасибо, за советы!

Только по второму пункту можно чуть подробнее, я не понял, по чему может не добавляться последняя строка?
6. user610020_lepestov 14.02.23 18:03 Сейчас в теме
(5) потому что в mainArray строка str_log добавляется, когда идёт уже следующая итерация str, а в конце файла, когда не остается итераций str, то последняя str_log пропадает
7. so-quest 140 15.02.23 18:14 Сейчас в теме
"Сказать, что она ужасная, это ничего не сказать. Скорее технологический журнал не имеет структуры. Нельзя взять и обработать его каким-то одним регулярным ворожением."

Вы не тот инструмент используете. Регулярки для разбора это в корне неверно. Для питона есть десятки генераторов лексеров и парсеров. Есть генераторы для PEG
Используйте их, экономьте свое время
8. TemArt 04.03.23 16:04 Сейчас в теме
подскажите, почему в итоговую таблицу не попадает длительность события, можно ли его добавить отдельной колонкой?
9. TemArt 04.03.23 16:57 Сейчас в теме
Изменил немного start.bat, чтобы не один файл анализировал, а папку с файлами:
не уверен в 100% правильности, т.к. пользовался для написания скрипта нейросетью, но у меня сработало и в БД упал парсинг всех логов.

@echo off
REM Параметры соединения с базой данных. Для MSSQL и postgres совпадают.
set sql_type=sqlight
REM sql_type может принимать заначения: mssql, postgres, sqlight
set server=localhost
set database=tempdb
set username=sa
set password=pass
set table=table_name
REM Для SQLight достаточно указать только имя или путь к файлу. Файл будет создан в текущей директории запуска.
set db_file=foo2.db

REM Рекурсивный перебор файлов в папке IT_Log и всех вложенных подпапках
for /R IT_Log %%f in (*.log) do (
REM Установка текущего имени файла в переменную filename
set filename=%%f
REM Вызов парсера для текущего файла
python parse_orm.py
)

pause
Показать
10. FreeArcher 158 05.03.23 12:16 Сейчас в теме
(8) Очень странно, что не попадает. Можете прислать кусок файла в котором проблема я проверю.

(9) Были мысли дописать парсер, а вы реализовали на уровне батника. Курто нейросеть рулит!
11. TemArt 05.03.23 22:50 Сейчас в теме
(10)

вот пример лога, по которому не попадают данные по длительности блокировки. Предполагаю из-за того, что лог снимался с клиента с файловой БД.
Прикрепленные файлы:
23012310.zip
12. FreeArcher 158 06.03.23 14:24 Сейчас в теме
(11) Скрит разбирает все параметры по шаблону. Тут в самом фале нет параметра длительности.

Судя по статье
https://its.1c.ru/db/metod8dev/content/5809/hdoc

Длительность определяют по времени начала блокировки. Т.е. этот скрит её не покажет.
13. TemArt 06.03.23 15:16 Сейчас в теме
(12)

Длительность это же параметр ТЖ duration, он пишется после таймкода в начале строки через дефис в сотнях микросекунд

31:06.410140-6,TLOCK - в данном примере это 6 сотен микросекунд
11:36.509002-14964,TLOCK,2 - тут 14964
я так это понял.
14. FreeArcher 158 06.03.23 18:31 Сейчас в теме
(13) Доработал скрипт
Оставьте свое сообщение