Парсинг полного технологического журнала 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 технологический журнал

См. также.

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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.

14400 руб.

06.12.2023    5096    22    1    

49

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

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

10000 руб.

10.11.2023    6554    17    2    

42

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

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

3600 руб.

14.01.2013    180744    1100    0    

873

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

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

14400 руб.

29.04.2020    29453    87    151    

63

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

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

4200 руб.

10.11.2015    61924    90    59    

75

Мониторинг Инструменты администратора БД Системный администратор Платформа 1С v8.3 Россия Платные (руб)

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

1500 руб.

01.12.2020    14840    37    0    

52

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

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней.

6000 руб.

06.11.2012    70947    622    44    

81
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1307 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 1307 30.03.22 12:16 Сейчас в теме
Картинку с результатом в таблице растянуло, сделать скрин части экрана и подрезать до 600 px при загрузке
3. FreeArcher 162 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 162 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 162 05.03.23 12:16 Сейчас в теме
(8) Очень странно, что не попадает. Можете прислать кусок файла в котором проблема я проверю.

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

вот пример лога, по которому не попадают данные по длительности блокировки. Предполагаю из-за того, что лог снимался с клиента с файловой БД.
Прикрепленные файлы:
23012310.zip
12. FreeArcher 162 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 162 06.03.23 18:31 Сейчас в теме
(13) Доработал скрипт
Оставьте свое сообщение