gifts2017

[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С:Предприятие с возможностью чтения таблиц

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

Обработка позволяет просматривать файловые базы 1CD на низком уровне средствами встроенного языка. Реализована часть функциональности Tool_1CD, но на языке 1С Предприятия. Показываются таблицы, параметры таблиц, поля таблиц, записи таблиц, есть 16-ричный просмотр страниц базы и консоль кода. Можно использовать для изучения структуры файлов 1CD, просмотра баз 1CD для выявления повреждений, создания своих обработок для выгрузки данных без открытия исследуемой базы в 1С:Предприятии.

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

Сначала благодарности:

В первую очередь выражаю огромную благодарность Валерию Агееву (awa) - автору статей о формате файлов 1CD и утилиты Tool_1CD.

Также выражаю благодарность andrewks за статьи о восстановлении работоспособности файловой базы, которые помогли глубже разобраться со структурой файлов 1CD.

Функционал:

  1. Просмотр базы 1CD из любой другой конфигурации на управляемых формах (работает в "Такси")
  2. Просмотр общей информации о таблицах базы (описание, размер записи, данные, BLOB, индексы и т.д.)
  3. Просмотр общей информации о полях таблицы (тип, длина, NULL и т.д.)
  4. Просмотр записей таблиц
  5. Есть 16-ричный вьюер страниц базы
  6. Возможность выгружать файлы таблицы: Файл данных, Файл BLOB, Файл индексов
  7. Консоль кода (с примерами) для вывода любой необходимой информации

Для чего можно использовать:

  1. Изучение физического представления базы
  2. Выгрузка данных на низком уровне
  3. Навигация по поврежденным базам (с ограничениями) для выявления повреждений
  4. Можно рассматривать как пример работы с бинарными данными (функции обработки можно использовать для любых других файлов, например, для графических или звуковых)

Особенности работы:
Само двоичное чтение осуществляет ActiveX "SAPI.spFileStream", установленный практически в любой Windows, дальше идет работа средствами языка 1С через COMSafeArray. Кому интересно, простой пример работы из 1С с этим ActiveX - http://forum330.com/forum/86/all Документация - http://msdn.microsoft.com/en-us/library/ms722561%28v=vs.85%29.aspx

Интерфейс:
Почти весь функционал этой обработки был написан в рамках рабочей задачи, которая не требовала интерфейса. В итоге для этой обработки интерфейс был просто "прикручен" и дописано немного функций, а чтобы не изобретать велосипед, интерфейс был сделан похожим на интерфейс утилиты Tool_1C, автором которой является awa. Однако стоит сказать, что функционал данной обработки скорее дополняет Tool_1CD, нежели чем дублирует его.

Информация о таблицах базы:

Информация о таблицах базы

Информация о полях таблицы:

Информация о полях таблицы

Операции над файлами таблицы:

Операции над файлами таблицы


Просмотр записей таблиц:

 При чтении данных таблицы добавляются поля, начинающиеся с префикса "B1C_". В поле "B1CD_Deleted" записывается признак удаленной записи (для записи, помеценной в таблице на удаление, устанавливается ИСТИНА). Также для полей типа BINARY создается поле "B1CD_<ИмяПоля>", которое содержит бинарные данные в строке формата Base64.

Информация о записях таблицы

16-ричный просмотр базы:

16-ричный просмотр базы

Консоль кода:

Консоль кода

 

Ограничения и работоспособность:

Поддерживаются только базы версии 8.2.14.0 (сейчас практически все такие).

Обработка тестировалась на Windows 8 (32bit) и на релизе платформы 8.3.5.1119.

На данный момент не на все варианты повреждений файла 1CD есть проверка, этот функционал планируется доработать в будущем.

Планы по развитию функционала:

Сделать возможность редактирования страниц базы в 16-ричном режиме;

Автоматическое выявление некоторых повреждений баз;

Работа с базой в "Режиме поврежденной базы";

Запись в базу ранее выгруженных и измененных данных;

Жду содержательных комментариев и замечаний по обработке.

История версий:

0.0.2.8a от 02.10.2014 Первая публичная версия (альфа)

0.0.3.0a от 24.01.2015

Новое в версии:

  • добавлена возможность вывода записей таблиц (функции чтения таблиц пока находятся в состоянии тестирования)
  • ускорена работа с файлом 1CD (spMemoryStream)                                                                                                  
  • ускорена работа HEX-просмотра
  • ускорено открытие базы примерно в 2 раза (3500 таблиц около 15 секунд)
  • добавлена форма выхода
  • добавлена форма предупреждения привыгрузке файла
  • добавлена обработка типа поля T (text)
  • исправлена ошибка повторного сохранения
  • исправлены другие мелкие ошибки

 

 

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

Наименование Файл Версия Размер Кол. Скачив.
x1c_1cdbin_20150124_0_0_3_0a.epf
.epf 54,68Kb
30.07.15
99
.epf 0.0.3.0a 54,68Kb 99 Скачать
x1c_1cdbin_20141002_0_0_2_8a.epf
.epf 29,53Kb
30.07.15
100
.epf 0.0.2.8a 29,53Kb 100 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. BigB (BigB) 07.10.14 15:19
2. ediks (ediks) 07.10.14 16:12
Интересное решение, но не понял как выгружать - "Выгрузить Файл данных" и "Выгрузить файл BLOB". Нажимаю - ничего не происходит.
Если два раза нажать на эти кнопки, то выскакивает ошибка.
Прикрепленные файлы:
3. Николай Гусев (GusevNA) 07.10.14 19:37
(2) ediks, файлы появляются в рабочем каталоге. Имена файлов типа:
_ENUM200_Blob
_ENUM200_Data
_ENUM200_Index
То есть к имени таблицы добавляется суффикс (Data, Blob, Index)
Насчет повторной выгрузки - действительно баг, спасибо, поправлю.
4. Николай Гусев (GusevNA) 07.10.14 20:01
"Детские" баги иногда вылезают, поскольку интерфейс "прикручивался", а не писался одновременно с функционалом, поэтому спасибо всем, кто о них напишет - исправлю быстро, могу всем отписавшимся по поводу багов скинуть свежий релиз. Кому нужно, пишите в личку
5. Николай Гусев (GusevNA) 07.10.14 23:08
Сейчас идет активная доработка функционала для навигации по базе и по выявлению повреждений. Поэтому:
1) Если кому нужен какой функционал - пишите, может, заодно и его реализуем в первую очередь
2) Если у кого есть битые базы (только 1CD, не .DT) и есть желание их попробовать восстановить, пишите, быстро не обещаю, но по мере свободного времени могу повосстанавливать.
6. Евгений Мартыненков (JohnyDeath) 08.10.14 10:07
Реально ли выполнять запросы к таблицам этого файла?
Для чего это надо именно мне. Работаю с хранилищем конфигурации, перегружая исходники в git-репозитарий и пытаюсь прикрутить сервер непрерывной интеграции TeamCity. В связи с чем возникают следующие потребности:
1) Из хранилища 1С выбрать номер последнего помещения (таблица VERSIONS)
2) Выбрать из таблицы HISTORY строки по определенному фильтру (например, номер версии )
7. Алексей Ко (Жолтокнижниг) 08.10.14 11:21
Так по моему есть множество аналогов уже написанных(даже у меня) в чем плюсы конкретно вашего решения в сравнении с другими
8. Николай Гусев (GusevNA) 08.10.14 13:12
(6) JohnyDeath, Запросы к таблицам пока не поддерживаются, хотя реализовать несложно - после открытия базы есть структуры и типы данных всех таблиц и всех их полей с размерами. Можно прочитать файл данных любой таблицы (функции в обработке готовые есть), поместить его во временную таблицу и делать выборки из нее.
Насчет хранилища - сейчас пока поддерживаются только файлы 1Cv8.1CD, детально с файлами хранилища не разбирался, но по-моему, там файлы организованы аналогично 1CD. Если так, то теми же самыми функциями этой обработки можно их разбирать, потом читать нужные таблицы, помещать во временные таблицы ну и запросом дальше.
Кстати, если будет большой интерес к теме хранилища, могу реализовать чуть попозже.
SeiOkami; +1 Ответить
9. Николай Гусев (GusevNA) 08.10.14 13:14
(7) Жолтокнижниг, (7) Я знаю пока знаю только одну разработку с подобным функционалом на языке 1С - https://code.google.com/p/restoration-base-1c8/
Во-вторых, это конфигурация, а не обработка. К тому же там последние релизы от 2012 года и непонятно, будет она развиваться дальше или нет. У меня она в начале работы стала выдавать какие-то ошибки еще до открытия базы.
Если еще где-то нашли аналоги - буду благодарен за ссылки - интересно и мне посмотреть на них.
10. Сергей Вн (EmpireSer) 08.10.14 13:32
Есть аналог в виде компоненты native для 1С (включая линукс):
http://infostart.ru/public/166557/
artbear; 1yh1; +2 Ответить 1
11. Николай Гусев (GusevNA) 08.10.14 15:00
(10) EmpireSer, Она написана не на языке 1С. Соответственно, для ее, к примеру, доработки нужно знать соответствующий язык программирования, на котором она написана, иметь эту среду разработки и каждый раз при внесении изменений перекомпилировать А тут открыл Конфигуратор - доработал под свои задачи и, собственно, все - можно пользоваться. Любой 1С-разработчик может это сделать. К тому в этой обработке есть 16-ричный просмотр страниц базы.
12. Сергей Вн (EmpireSer) 08.10.14 18:30
(11) GusevNA,
Не совсем всё так радужно как вы говорите:
1. Вы работаете с COM объектами, а специфику их работы тоже нужно знать.
2. Из-за этих же COM объектов есть ограничение в ОС. Работа же Native компонентов под разными ОС обеспечивается 1С (т.к. в данном случаи есть библиотека компонеты под Linux).

НО! :-)))

Ваши изыскания похвальны! Я их только поддерживаю!

Если это превратиться в удобный механизм и позволяющий вносить изменения в базу (с блокировками участков файла конечно), при чём лишённый проблем не обновления индексов изменённых таблица (такая проблема есть в аналоге), то будет ещё круче.
13. Сергей Одинесников (monsta) 08.10.14 20:04
Занятная разработка, плюсую. Если бы она еще говорила на что именно "Ошибка формата потока" при работе с конфигурацией жалуется...
14. Николай Гусев (GusevNA) 08.10.14 20:06
(12) EmpireSer, Во-первых, спасибо за поддержку. Что касается изысканий, то, на мой взгляд, здесь они были минимальны - была рабочая задача по чтению данных из файлов 1CD без запуска базы, потом был прикручен интерфейс. А что касается COM-объектов, то это Виндовые COM-ы, входящте в состав Microsoft Speech API (SAPI). На форумах есть информация о том, что эти COM-ы есть практически в любой Винде, так что здесь тоже потенциальные проблемы минимальны. А что касается Linux, то использование обработки под него не планировалось (хотя можно переписать, если нужно будет, все чтение/запись под что-нибудь еще - кода там немного). А вот насчет 1CDLib (сам пользовался неоднократно, очень хорошая разработка, на мой взгляд) - есть ее исходники в публичном доступе?
15. Николай Гусев (GusevNA) 08.10.14 20:09
(13) monsta, Ошибка формата потока - у меня такое было с битыми файлами конфигурации в файле 1CD, а не со структурой файла 1CD (пока ни разу не встречал, чтобы структура 1CD была порушена при такой ошибке, хотя быть может и, наверно, бывает часто). Если интересно, могу Вашу базу посмотреть.
16. andrewks 08.10.14 20:27
а что насчёт производительности?
сразу скажу: тесты не делал, но что-то мне подсказывает, что подобная реализация на языке 1с не может быть очень быстрой
17. andrewks 08.10.14 20:34
(13) monsta, "Ошибка формата потока" - это одно из самых бесполезных сообщений об ошибке, наряду с "System Error"

это ошибка при чтении потока (stream) с данными 1с-формата (текстовый файл с фигурными скобками, запятыми и значениями)

что именно не понравилось - да что угодно, начиная с испорченного содержимого до банального расположения строкового значения там, где 1с ожидает увидеть, например, число
18. Николай Гусев (GusevNA) 08.10.14 21:16
(16) andrewks, Пока не замерял. Для текущих задач пока хватает скорости.
Tool_1CD, например, даже визуально шустрее. Но в коде есть еще возможности для оптимизации, на которую все времени не хватает ((
19. Николай Гусев (GusevNA) 08.10.14 21:17
(17) andrewks, Согласен, можно написать Global fatal error, смысл бы нисколько не поменялся :-)
20. Александр Буганов (buganov) 09.10.14 05:08
(7) Жолтокнижниг, где же у вас есть? Я не нашел. И аналогов отнюдь не множество. Их как раз мало. Для чего это нужно? Как минимум посмотреть алгоритмы, как максимум восстановить базу. Просто стягивают такие умники "чем лучше, чем другие?". Скачайте и посмотрите, чай не чайник. А если чайник, то лучше не лезть к базе, а позвать взрослых.
21. Сергей Вн (EmpireSer) 09.10.14 09:52
(14) GusevNA,
Исходники 1CDLib видимо закрыты :-(

P.S. Вот если бы кто-то ещё "V8Unpack" написал бы на 1С... а то у меня это самое узкое место в создании полиморфной конфигурации. Очень не хватает механизмов оттуда "Pack" и "UnPack"...
22. Николай Гусев (GusevNA) 09.10.14 12:46
(21) EmpireSer, Вообще есть мысли попробовать в будущем, только те реализации алгоритмов, которые я пока вижу, будут, скорее всего, медленными, потому что распаковка требуется, которую в v8unpack zlib.dll делает.
23. Николай Гусев (GusevNA) 09.10.14 12:51
(20) buganov, Да, сейчас основные доработки делаются в направлении восстановления баз.

Так что если у кого есть битые базы, которые не жалко (не содержат больших комм.тайн:-)), просьба присылать для тестов и экспериментов.
Своих 2 восстановил, 1 в процессе, а больше пока не попадаются.
24. Д П (crazydimka) 20.10.14 16:20
А сможет ли эта компонента когда-нибудь читать файл 1CD хранилища конфигураций для чтения метаданных ? Или если она это уже умеет подскажите как ?
25. Николай Гусев (GusevNA) 20.10.14 18:33
(24) crazydimka, Это обработка (EPF), а не компонента. На хранилищах особо не тестировалась, но файлы 1cv8ddb.1CD открывает, как обычные 1CD файлы. Таблицы (типа Config и ConfigSave) можно выгрузить в файл. Чтение и разбор метаданных в рамках этой обработки пока не планируется.
26. Ololo Anonim (ololoanonim) 21.01.15 13:51
Такой вот вопрос, а можно ли просмотреть содержимое таблиц?
27. Николай Гусев (GusevNA) 21.01.15 16:40
(26) ololoanonim, В этой версии нельзя, сейчас идет разработка новой версии - там чтение и просмотр содержимого таблиц будет реализовано.
28. Ololo Anonim (ololoanonim) 22.01.15 06:33
(27) GusevNA, а как долго займет разработка? просто очень надо. Может поделитесь как это лучше сделать?
29. Николай Гусев (GusevNA) 22.01.15 14:44
(28) ololoanonim, В принципе, там все готово, но нужно ее протестировать, а тестировать сейчас нет времени. Если потестируете и отпишетесь по результатам - хотя бы на уровне "работает-не работает", могу выложить в течение 1-2 дней.
30. Ololo Anonim (ololoanonim) 23.01.15 05:13
Конечно протестирую. И отписаться не составит труда.
31. Ololo Anonim (ololoanonim) 23.01.15 11:17
(29) GusevNA, можете пока подсказать как считывать данные? просто маленько поработал с Вашей обработкой и фиксированные строки стали считываться прям строками. А вот остальное не могу. Вот прошу Вашей помощи.
32. Николай Гусев (GusevNA) 23.01.15 16:01
(31) ololoanonim, Сегодня-завтра выложу обработку, там несложные алгоритмы - нетрудно будет разобраться, и заранее спасибо за тестирование :-)
33. Ololo Anonim (ololoanonim) 23.01.15 18:25
(32) GusevNA, Вам спасибо! Очень жду когда выложите.
34. Олеся Шамшурина (gerkon1980) 24.01.15 07:23
(5) GusevNA,
У меня горе - прямо горе - рухнула база. Проверяла через внутренний файл 1 C chdbfl - сказал "База данных разрушена. Восстановление не возможно". Последний раз сохранялась 28.04.14. А сейчас год закрывать а у меня база рухнула. Я просто не представляю как ее восстанавливать, если документы заново вводить. Помогите, пожалуйста, восстановить
35. Николай Гусев (GusevNA) 24.01.15 19:25
(34) gerkon1980, Могу попробовать Вам помочь. Емейл для связи указал в ЛС
36. Ololo Anonim (ololoanonim) 26.01.15 04:47
(35) GusevNA, Чтение работает, только при чтении больших таблиц вызывается исключение. Причины устанавливаются. :-)
37. Николай Гусев (GusevNA) 26.01.15 07:15
(36) ololoanonim, Во-первых, еще раз спасибо за тестинг, на который не хватает времени.
Во-вторых, в принципе, обработка тестировалась на разных таблицах, в том числе и больших. Надо смотреть конкретную базу и конкретную таблицу. Я там в ЛС на всякий случай написал свой емейл.
38. Ololo Anonim (ololoanonim) 26.01.15 09:24
(37) GusevNA, Хорошо. Вечером, когда буду дома, я Вам напишу.
39. Сергѣй Батанов (baton_pk) 06.07.15 16:06
Ой, спасибо :) Вытащил данные о продажах из битой базы кассового узла.
40. Игорь Недавний (INed) 31.12.15 01:59
Николай, добрый день!

Можно ли решить с помощью Вашей конфигурации проблему: "Ошибка СУБД: Длина ключа индекса превышает максимально допустимую '_Documen831..."?
41. dskull86 Алексеев (dskull86) 28.01.16 17:15
эта обработка считает таблицу IBVERSION?
42. Николай Гусев (GusevNA) 28.01.16 21:35
(41) dskull86, В нескольких базах, которые были под рукой, нормально считывает.
43. Николай Гусев (GusevNA) 28.01.16 21:37
(40) INed, Обработка на данный момент только читает из базы, но ничего не исправляет. Так что Вашу проблему решить вряд ли получится.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа