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

30.03.22

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Парсинг полного технологического журнала 1С и выгрузка в таблицу СУБД (MSSQL, Postgres, SQLight) с помощью python
.zip 27,88Kb
10
10 Скачать (1 SM) Купить за 1 850 руб.

Некоторое время назад, анализируя запросы в 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С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    24698    163    86    

161

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

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

15000 руб.

10.11.2023    13730    57    33    

77

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

19200 руб.

06.12.2023    12704    56    8    

85

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

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

14400 руб.

29.04.2020    35548    115    152    

79

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

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

6000 руб.

06.11.2012    74863    631    45    

90

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

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    10654    11    4    

19

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

В процессе работы  возникла необходимость управления последовательностями в разрезе измерений. Штатные возможности не позволяют этого сделать. Но бывает очень необходимо восстановить последовательность только по одному измерению (например, подразделению, организации и т.д.). (Возможность покупки за рубли и StartMoney).

2400 руб.

24.08.2018    17731    12    0    

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

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

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