gifts2017

Работа с 1CD средствами Python

Опубликовал Егор Иванов (Infactum) в раздел Программирование - Инструментарий

Библиотека работы с 1CD средствами Python. Opensource / Cross platform / Python.

Структура данных файлов 1CD уже давно ни для кого не является секретом. Благодарим за это awa. Без его статьи этой библиотеки не было бы.

В остальном история разработки крайне простая: возникло желание изучить Python. А какой лучший способ изучения языка программирования? Конечно же, написать на нем небольшой проект. В голову пришла идея написать извлекатель паролей (точнее их хэшей) из файловой базы 1С. Поначалу думал сделать простую обертку над tool_1cd, но потом решил, что это как-то не спортивно. Из готовых аналогов нашел только проприетарные библиотеки / приложения и реализацию средствами 1С (медленно, только под Windows, но все равно круто). В итоге решил написать библиотеку для Python. А потом уже и экстрактор на ней сделать.

Что из этого получилось, можно увидеть во вложении.

Как работатать:

1. Ставим модуль через pip:

pip install onec_dtools

2.  Импортируем библиотеку в приложение и смотрим, что она может.

import onec_dtools

with open('1Cv8.1CD', 'rb') as f:
    db = onec_dtools.DatabaseReader(f)
    print("База данных 1С (вер. {}/{})".format(db.version, db.locale))
    print("Всего таблиц: {}".format(len(db.description)))
    if row.is_empty:
            continue
    for row in db.tables['V8USERS']:
        print(row.as_list(True))

В db у нас будет класс для взаимодействия файловой базой. Инициализация класса, пожалуй, самая длительная операция, т.к. она считывает всю структуру БД. После инициализации нам сразу доступна информации о версии формата файла (тестировалось все только с базами формата 8.2.14 - этого должно быть достаточно для работы со всеми актуальными версиями платформы), языка БД и описание таблиц.

Чтение таблиц БД возвращает генератор. Таким образом данные считываются и загружаются в память построчно, а не всей таблицей сразу. Этот же механизм используется при работе с полями неограниченной длины: при считывании строки они возвращают не целиковое значение, а его длину и генератор для чтения.

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

27.12.2015

С момент публикации этой статьи модуль был "причесан" и теперь вполне может считаться production ready.

Из основных изменений:

  • Добавлена возможность работы с контейнерами по аналогии с v8unpack. Об этом даже есть отдельная статья.
  • Добавлены тесты, которые не смотря на свою простоту обеспечивают 98% покрытие кода проекта.
  • Появилась документация.

Если среди вас есть те, кто желает присоединиться к разработке, то добро пожаловать на Github. Что хотелось бы реализовать:

  • Обратную совместимость с Python 2.7.
  • Возможность работы с файлами DT. К сожалению я не нашел достаточно хорошего описания формата и не смог до конца разобраться в нем сам, поэтому буду рад помощи.

13.02.2016

Большое обновление.

  • Рефакторинг механизмов чтения формата 1CD
  • Новый API работы с файловой базой
  • Значительно улучшена документация
  • Исправлена ошибка преобразования значений типа Numeric
  • Исправлена ошибка чтения значений полей, допускающих NULL
  • Ускорено чтение информации о страницах размещения объектов БД
  • Ускорен разбор описаний таблиц БД
  • Ускорено преобразование полей типа DateTime
  • Преобразование значение в полях таблиц теперь происходит в момент обращения к ним, а не в момент чтения строк

05.09.2016

  • Добавлена поддержка 8.3.8

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

Наименование Файл Версия Размер
onec_dtools 9
.zip 17,17Kb
05.09.16
9
.zip 0.0.4 17,17Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
2. Евгений Сосна (pumbaE) 28.10.15 13:04
Спасибо через pip найдем, я бы советовал убрать из начала названия "1C" и заменить на что-нибудь другое, ато могут придраться.
3. Михаил Курилов (MishaHD) 28.10.15 13:48
Автор молодец, только ради спортивного интереса можно покопаться в структуре файловой базы. Но надо бы убрать из названия 1с, а то могут быть проблемы. Да и вообще наверняка программа нарушает лицензионное соглашение.
4. Егор Иванов (Infactum) 28.10.15 14:02
(2) pumbaE, (3) MishaHD,
От греха подальше переименую 1С в onec пожалуй.
Нарушений лицензии я тут никаких не вижу, тем более аналогичных решений достаточно и существуют они давно.
5. Ийон Тихий (cool.vlad4) 28.10.15 14:10
(3) MishaHD,
Да и вообще наверняка программа нарушает лицензионное соглашение.

совсем не наверняка и не очевидно, что нарушает.
(2) pumbaE, на гитхабе ищется в две секунды https://github.com/Infactum/1C-dtools
6. Алексей Ко (Жолтокнижниг) 28.10.15 19:47
Сам хотел такое написать на питоне, с удовольствем посмотрю ваше творение.
11. Сергей Докторов (doctorov_s) 29.10.15 13:44
Ну так ссылку то ты дашь на свое творение??
12. Егор Иванов (Infactum) 29.10.15 13:50
(11) doctorov_s, стоит быть внимательнее немного.
Или вам мало того, что пакет опубликован в PiPy, и есть исходники во вложении к статье / ссылка на гитхаб в комментариях?
13. Евгений Стоянов (quick) 29.10.15 15:44
Я тут недавно для 7-ки задел подобное
https://github.com/WorldException/v7py
myr4ik07; zarius; +2 Ответить
17. Андрей (Asis) 04.11.15 12:18
(0)
В python 2 не работает:
>>> import onec_dtools
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\onec_dtools\__init__.py", line 1, in <module>
    from onec_dtools.db import Database
  File "C:\Python27\lib\site-packages\onec_dtools\db.py", line 5, in <module>
    from onec_dtools.db_row import Row
  File "C:\Python27\lib\site-packages\onec_dtools\db_row.py", line 3, in <module>
    from _datetime import datetime
ImportError: No module named _datetime
...Показать Скрыть

18. Егор Иванов (Infactum) 04.11.15 12:45
(17) Asis, на данный момент заявлена поддержка python 3.4 и 3.5.
Возможно заработает и на более ранних версиях 3.х - не тестировал.
Я в курсе, что Python 2.x по прежнему очень популярен, но в моим планах обеспечить его поддержку пока нет. Если желаете помочь в этом - добро пожаловать на гитхаб.
P.S. Указанная ошибка должна устраниться просто переименованием _datetime в datetime. Но я не думаю, что это будет единственная причина несовместимости с python 3
19. Николай Мищенко (enwony) 09.12.15 21:37
Это же github! Дорабатывайте, делайте свою ветку или делайте pull request автору. У меня на python 2.7.8 немного не завелась - поправил, работает (на более ранних версиях может не работать).
Кстати, автору большое спасибо - отличное начинание и хороший код.
20. Куджо Колтовский (Cujoko) 30.12.15 12:38
А зачем совместимость с Python 2.7? Люди обычно думают, как бы сделать совместимость с 3.х. Вообще проблемы поставить несколько версий интерпретатора под разные нужды быть не должно.
21. Егор Иванов (Infactum) 30.12.15 14:00
(20) Cujoko, на самом деле полно людей, которые принципиально до сих пор предпочитают python 2.x.
Я сам ничего бэкпортировать не буду, но если найдется желающий - почему бы и нет? Это ж опенсорс.
Меня больше работа с DT интересует.
22. Егор Иванов (Infactum) 13.02.16 22:56
Обновлено. Теперь в части чтения 1CD работает намного быстрее и читать строки можно не только итеративно, но и по индексу. Так же исправлено много разных ошибок.
23. Егор Иванов (Infactum) 05.09.16 08:10
Добавил поддержку 8.3.8, благодаря описанию из этой статьи. Вроде бы сейчас onec_dtools единственная open source библиотека, которая работает с этим форматом.