Работа с 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

24.02.2017

  • Добавлена возможность распаковки EFD файлов (файлы поставки конфигурации)

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

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

См. также

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

совсем не наверняка и не очевидно, что нарушает.
(2) pumbaE, на гитхабе ищется в две секунды https://github.com/Infactum/1C-dtools
6. Алексей Ко (Жолтокнижниг) 233 28.10.15 19:47 Сейчас в теме
Сам хотел такое написать на питоне, с удовольствем посмотрю ваше творение.
11. Сергей Докторов (doctorov_s) 41 29.10.15 13:44 Сейчас в теме
Ну так ссылку то ты дашь на свое творение??
12. Егор Иванов (Infactum) 212 29.10.15 13:50 Сейчас в теме
(11) doctorov_s, стоит быть внимательнее немного.
Или вам мало того, что пакет опубликован в PiPy, и есть исходники во вложении к статье / ссылка на гитхаб в комментариях?
13. Евгений Стоянов (quick) 557 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) 212 04.11.15 12:45 Сейчас в теме
(17) Asis, на данный момент заявлена поддержка python 3.4 и 3.5.
Возможно заработает и на более ранних версиях 3.х - не тестировал.
Я в курсе, что Python 2.x по прежнему очень популярен, но в моим планах обеспечить его поддержку пока нет. Если желаете помочь в этом - добро пожаловать на гитхаб.
P.S. Указанная ошибка должна устраниться просто переименованием _datetime в datetime. Но я не думаю, что это будет единственная причина несовместимости с python 3
19. Николай Мищенко (enwony) 1 09.12.15 21:37 Сейчас в теме
Это же github! Дорабатывайте, делайте свою ветку или делайте pull request автору. У меня на python 2.7.8 немного не завелась - поправил, работает (на более ранних версиях может не работать).
Кстати, автору большое спасибо - отличное начинание и хороший код.
20. Куджо Колтовский (Cujoko) 3 30.12.15 12:38 Сейчас в теме
А зачем совместимость с Python 2.7? Люди обычно думают, как бы сделать совместимость с 3.х. Вообще проблемы поставить несколько версий интерпретатора под разные нужды быть не должно.
21. Егор Иванов (Infactum) 212 30.12.15 14:00 Сейчас в теме
(20) Cujoko, на самом деле полно людей, которые принципиально до сих пор предпочитают python 2.x.
Я сам ничего бэкпортировать не буду, но если найдется желающий - почему бы и нет? Это ж опенсорс.
Меня больше работа с DT интересует.
22. Егор Иванов (Infactum) 212 13.02.16 22:56 Сейчас в теме
Обновлено. Теперь в части чтения 1CD работает намного быстрее и читать строки можно не только итеративно, но и по индексу. Так же исправлено много разных ошибок.
23. Егор Иванов (Infactum) 212 05.09.16 08:10 Сейчас в теме
Добавил поддержку 8.3.8, благодаря описанию из этой статьи. Вроде бы сейчас onec_dtools единственная open source библиотека, которая работает с этим форматом.
24. Котэ Пруидзе (kote) 450 05.03.17 00:00 Сейчас в теме
.. так бы и ставил лайки после каждого обновления :) спасибо, что не забрасываете это неблагодарное дело!
25. Сергей Толмачев (sss999) 35 09.03.17 12:24 Сейчас в теме
по строению dt файла есть инфа?
26. Егор Иванов (Infactum) 212 09.03.17 12:48 Сейчас в теме
(25) Нету.
Если бы было готовое описание формата, то я бы уже добавил его в библиотеку.
А так надо за хекс редактор садиться. В планах есть, но пока не до этого.
27. Сергей Толмачев (sss999) 35 09.03.17 13:13 Сейчас в теме
28. Егор Иванов (Infactum) 212 09.03.17 14:38 Сейчас в теме
(27) Описания формата DT нет в открытом доступе насколько мне известно. Это вовсе не означает, что никто в нем не разобрался.
Про сабж по ссылке мне известно, но это коммерческий продукт. Очевидно, что его автор помогать мне не будет.
Собственно по распаковке EFD я тоже к нему обращался, т.к. у него был плагин для Total Commander, и он готов был предоставить исходники, но сказал, что они были утеряны. Поэтому пришлось самому разбираться. Видимо DT ждет та же судьба.