Предупреждения, отказ от ответственности:
Разработчик данной обработки не может нести и не несет ответственность за любой ущерб, полученный при использовании данного программного продукта. Рекомендуется использование этого программного продукта на копиях баз.
Сначала благодарности:
В первую очередь выражаю огромную благодарность Валерию Агееву (awa) — автору статей о формате файлов 1CD и утилиты Tool_1CD.
Также выражаю благодарность andrewks за статьи о восстановлении работоспособности файловой базы, которые помогли глубже разобраться со структурой файлов 1CD.
Благодарю Алексея Ермилова (Alex_E) за помощь в создании обработки.
Также благодарю Андрея Лукина за внешнюю компоненту для работы с deflate.
Функционал:
- Просмотр базы 1CD из любой другой конфигурации на управляемых формах (работает в "Такси")
- Поддержка форматов 8.2.14.0 и 8.3.8.0.
- Просмотр общей информации о таблицах базы (описание, размер записи, данные, BLOB, индексы и т.д.)
- Просмотр общей информации о полях таблицы (тип, длина, NULL и т.д.)
- Просмотр записей таблиц
- Работа с полями BLOB:
- просмотр в 16-ричном виде
- просмотр в виде текста (используется ВК для распаковки deflate)
- сохранение значения поля BLOB в файл
- Возможность выгружать файлы таблицы: Файл данных, Файл BLOB, Файл индексов
- 16-ричный вьюер страниц базы
- Консоль кода 1С (КК) для вывода любой необходимой информации
- Для записи в базу можно использовать скрипты на языке 1С в консоли кода. Для этого есть функция постраничной записи База1С_ЗаписатьСтраницыПоНомеру(…)
Для чего можно использовать:
- Изучение физического представления базы
- Выгрузка данных на низком уровне
- Навигация по поврежденным базам (с ограничениями) для выявления повреждений. С помощью этой обработки были выявлены дефекты 3 "битых" баз, 2 из них полностью восстановлены. Для выявления дефектов писались скрипты для консоли кода, исправления вносились через сторонний 16-ричный редактор.
- Можно рассматривать как пример работы с бинарными данными (функции обработки можно использовать для любых других файлов, например, для графических или звуковых)
Особенности работы:
Само двоичное чтение осуществляет 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, без поддержки функций записи в базу из интерфейса.
Информация о таблице:
Информация о полях таблицы:
Операции над файлами таблицы:
Просмотр записей таблиц:
При чтении данных таблицы добавляются поля, начинающиеся с префикса "B1C_". В поле "B1CD_Deleted" записывается признак удаленной записи (для записи, помещенной в таблице на удаление, устанавливается ИСТИНА).
Для полей типа BINARY выводится строка вида #BLOB,<Тип>,<БЛОКНАЧАЛА>,<РАЗМЕР>. Например, #BLOB,I,1,19024.
|
16-ричный просмотр страниц базы:
Консоль кода (КК):
Обработка содержит примеры скриптов. Вот, например, простой скрипт для получения DBNames из таблицы PARAMS:
лДатаС = ТекущаяДата();
лИмяТаблицы = "PARAMS";
лТекТаб = КК_ПолучитьСтруктуруТвблицыПоИмени (лИмяТаблицы);
мсЗаписи = Х1С_Б1СД_ПолучитьЗаписиТаблицы (лИмяТаблицы,,,,,3,Истина);
лСтрокаБлоб = "";
Для Каждого цЗапись Из мсЗаписи Цикл
Если цЗапись["FILENAME"] = "DBNames" Тогда
лСтрокаБлоб = цЗапись["BINARYDATA"];
Прервать;
КонецЕсли;
КонецЦикла;
стрБлоб = База1С_ПолучитьСтруктуруBLOBИзСтроки (лСтрокаБлоб);
хБуфер = База1С_ПолучитьДанныеБлоб (лТекТаб.ФайлБлоб, стрБлоб.НомерБлока, стрБлоб.Размер);
лТекст = База1С_РаспаковатьБуфер (хБуфер);
КонсольКода_ОкноОтладки = лТекст;
лСекунд = ТекущаяДата() - лДатаС;
Сообщить("Выполнено за (сек): "+лСекунд);
Ограничения и работоспособность:
Версии до 2.0 тестировались на Windows 8 (32 bit) и на релизе платформы 8.3.5.1119.
Версия 2.0 тестировалась на Windows 10 Home (64 bit) и на релизе платформы 8.3.14.1630.
На данный момент не на все варианты повреждений файла 1CD есть проверка, этот функционал планируется доработать в будущем.
Планы по развитию функционала:
Сделать возможность редактирования страниц базы в 16-ричном режиме;
Для чтения двоичных данных использовать БуферДвоичныхДанных вместо компонент ActiveX;
Автоматическое выявление некоторых повреждений баз;
Работа с базой в "Режиме поврежденной базы";
Запись в базу ранее выгруженных и измененных данных;
Жду содержательных комментариев и замечаний по обработке.
История версий:
0.0.2.8a от 02.10.2014 Первая публичная версия (альфа)
0.0.3.0a от 24.01.2025
Новое в версии:
- добавлена возможность вывода записей таблиц (функции чтения таблиц пока находятся в состоянии тестирования)
- ускорена работа с файлом 1CD (spMemoryStream)
- ускорена работа HEX-просмотра
- ускорено открытие базы примерно в 2 раза (3500 таблиц около 15 секунд)
- добавлена форма выхода
- добавлена форма предупреждения при выгрузке файла
- добавлена обработка типа поля T (text)
- исправлена ошибка повторного сохранения
- исправлены другие мелкие ошибки
2.0.3.20a от 11.04.2025
Новое в версии:
- Поддержка формата 8.3.8.0
- Работа с BLOB:
- просмотр в 16-ричном виде
- просмотр в виде текста (используется ВК для распаковки deflate)
- сохранение значения поля BLOB в файл
- Оптимизирована работа с памятью при работе с полями BLOB
- Ускорение некоторых операций с файлами и полями BLOB
- Сохранение и загрузка записей таблиц в MXL-фвйлы для ускорения работы с таблицами с большим количеством записей
- FIX: исправлена ошибка при просмотре записей и выгрузке больших файлов (DATA и BLOB)
- FIX: исправлена ошибка при выводе неверной версии формата 1CD
- FIX: исправлены другие мелкие ошибки
Ух ты! Здорово!
Интересное решение, но не понял как выгружать — «Выгрузить Файл данных» и «Выгрузить файл BLOB». Нажимаю — ничего не происходит.
Если два раза нажать на эти кнопки, то выскакивает ошибка.
(2) ediks, файлы появляются в рабочем каталоге. Имена файлов типа:
_ENUM200_Blob
_ENUM200_Data
_ENUM200_Index
То есть к имени таблицы добавляется суффикс (Data, Blob, Index)
Насчет повторной выгрузки — действительно баг, спасибо, поправлю.
«Детские» баги иногда вылезают, поскольку интерфейс «прикручивался», а не писался одновременно с функционалом, поэтому спасибо всем, кто о них напишет — исправлю быстро, могу всем отписавшимся по поводу багов скинуть свежий релиз. Кому нужно, пишите в личку
Сейчас идет активная доработка функционала для навигации по базе и по выявлению повреждений. Поэтому:
1) Если кому нужен какой функционал — пишите, может, заодно и его реализуем в первую очередь
2) Если у кого есть битые базы (только 1CD, не .DT) и есть желание их попробовать восстановить, пишите, быстро не обещаю, но по мере свободного времени могу повосстанавливать.
Реально ли выполнять запросы к таблицам этого файла?
Для чего это надо именно мне. Работаю с хранилищем конфигурации, перегружая исходники в git-репозитарий и пытаюсь прикрутить сервер непрерывной интеграции TeamCity. В связи с чем возникают следующие потребности:
1) Из хранилища 1С выбрать номер последнего помещения (таблица VERSIONS)
2) Выбрать из таблицы HISTORY строки по определенному фильтру (например, номер версии )
Так по моему есть множество аналогов уже написанных(даже у меня) в чем плюсы конкретно вашего решения в сравнении с другими
(6) JohnyDeath, Запросы к таблицам пока не поддерживаются, хотя реализовать несложно — после открытия базы есть структуры и типы данных всех таблиц и всех их полей с размерами. Можно прочитать файл данных любой таблицы (функции в обработке готовые есть), поместить его во временную таблицу и делать выборки из нее.
Насчет хранилища — сейчас пока поддерживаются только файлы 1Cv8.1CD, детально с файлами хранилища не разбирался, но по-моему, там файлы организованы аналогично 1CD. Если так, то теми же самыми функциями этой обработки можно их разбирать, потом читать нужные таблицы, помещать во временные таблицы ну и запросом дальше.
Кстати, если будет большой интерес к теме хранилища, могу реализовать чуть попозже.
(7) Жолтокнижниг, (7) Я знаю пока знаю только одну разработку с подобным функционалом на языке 1С —https://code.google.com/p/restoration-base-1c8/
Во-вторых, это конфигурация, а не обработка. К тому же там последние релизы от 2012 года и непонятно, будет она развиваться дальше или нет. У меня она в начале работы стала выдавать какие-то ошибки еще до открытия базы.
Если еще где-то нашли аналоги — буду благодарен за ссылки — интересно и мне посмотреть на них.
Есть аналог в виде компоненты native для 1С (включая линукс):
http://infostart.ru/public/166557/
(10) EmpireSer, Она написана не на языке 1С. Соответственно, для ее, к примеру, доработки нужно знать соответствующий язык программирования, на котором она написана, иметь эту среду разработки и каждый раз при внесении изменений перекомпилировать А тут открыл Конфигуратор — доработал под свои задачи и, собственно, все — можно пользоваться. Любой 1С-разработчик может это сделать. К тому в этой обработке есть 16-ричный просмотр страниц базы.
(11)
Не совсем всё так радужно как вы говорите:
1. Вы работаете с COM объектами, а специфику их работы тоже нужно знать.
2. Из-за этих же COM объектов есть ограничение в ОС. Работа же Native компонентов под разными ОС обеспечивается 1С (т.к. в данном случаи есть библиотека компонеты под Linux).
НО! :-)))
Ваши изыскания похвальны! Я их только поддерживаю!
Если это превратиться в удобный механизм и позволяющий вносить изменения в базу (с блокировками участков файла конечно), при чём лишённый проблем не обновления индексов изменённых таблица (такая проблема есть в аналоге), то будет ещё круче.
Занятная разработка, плюсую. Если бы она еще говорила на что именно «Ошибка формата потока» при работе с конфигурацией жалуется…
(12) EmpireSer, Во-первых, спасибо за поддержку. Что касается изысканий, то, на мой взгляд, здесь они были минимальны — была рабочая задача по чтению данных из файлов 1CD без запуска базы, потом был прикручен интерфейс. А что касается COM-объектов, то это Виндовые COM-ы, входящте в состав Microsoft Speech API (SAPI). На форумах есть информация о том, что эти COM-ы есть практически в любой Винде, так что здесь тоже потенциальные проблемы минимальны. А что касается Linux, то использование обработки под него не планировалось (хотя можно переписать, если нужно будет, все чтение/запись под что-нибудь еще — кода там немного). А вот насчет 1CDLib (сам пользовался неоднократно, очень хорошая разработка, на мой взгляд) — есть ее исходники в публичном доступе?
(13) monsta, Ошибка формата потока — у меня такое было с битыми файлами конфигурации в файле 1CD, а не со структурой файла 1CD (пока ни разу не встречал, чтобы структура 1CD была порушена при такой ошибке, хотя быть может и, наверно, бывает часто). Если интересно, могу Вашу базу посмотреть.
а что насчёт производительности?
сразу скажу: тесты не делал, но что-то мне подсказывает, что подобная реализация на языке 1с не может быть очень быстрой
(13) monsta, «Ошибка формата потока» — это одно из самых бесполезных сообщений об ошибке, наряду с «System Error»
это ошибка при чтении потока (stream) с данными 1с-формата (текстовый файл с фигурными скобками, запятыми и значениями)
что именно не понравилось — да что угодно, начиная с испорченного содержимого до банального расположения строкового значения там, где 1с ожидает увидеть, например, число
(16) andrewks, Пока не замерял. Для текущих задач пока хватает скорости.
Tool_1CD, например, даже визуально шустрее. Но в коде есть еще возможности для оптимизации, на которую все времени не хватает ((
(17) andrewks, Согласен, можно написать Global fatal error, смысл бы нисколько не поменялся 🙂
(7) Жолтокнижниг, где же у вас есть? Я не нашел. И аналогов отнюдь не множество. Их как раз мало. Для чего это нужно? Как минимум посмотреть алгоритмы, как максимум восстановить базу. Просто стягивают такие умники «чем лучше, чем другие?». Скачайте и посмотрите, чай не чайник. А если чайник, то лучше не лезть к базе, а позвать взрослых.
(14)
Исходники 1CDLib видимо закрыты 🙁
P.S. Вот если бы кто-то ещё «V8Unpack » написал бы на 1С… а то у меня это самое узкое место в создании полиморфной конфигурации. Очень не хватает механизмов оттуда «Pack» и «UnPack»…
(21) EmpireSer, Вообще есть мысли попробовать в будущем, только те реализации алгоритмов, которые я пока вижу, будут, скорее всего, медленными, потому что распаковка требуется, которую в v8unpack zlib.dll делает.
(20) buganov, Да, сейчас основные доработки делаются в направлении восстановления баз.
Так что если у кого есть битые базы, которые не жалко (не содержат больших комм.тайн:-)), просьба присылать для тестов и экспериментов.
Своих 2 восстановил, 1 в процессе, а больше пока не попадаются.
А сможет ли эта компонента когда-нибудь читать файл 1CD хранилища конфигураций для чтения метаданных ? Или если она это уже умеет подскажите как ?
(24) crazydimka, Это обработка (EPF), а не компонента. На хранилищах особо не тестировалась, но файлы 1cv8ddb.1CD открывает, как обычные 1CD файлы. Таблицы (типа Config и ConfigSave) можно выгрузить в файл. Чтение и разбор метаданных в рамках этой обработки пока не планируется.
Такой вот вопрос, а можно ли просмотреть содержимое таблиц?
(26) ololoanonim, В этой версии нельзя, сейчас идет разработка новой версии — там чтение и просмотр содержимого таблиц будет реализовано.
(27) а как долго займет разработка? просто очень надо. Может поделитесь как это лучше сделать?
(28) ololoanonim, В принципе, там все готово, но нужно ее протестировать, а тестировать сейчас нет времени. Если потестируете и отпишетесь по результатам — хотя бы на уровне «работает-не работает», могу выложить в течение 1-2 дней.
Конечно протестирую. И отписаться не составит труда.
(29) можете пока подсказать как считывать данные? просто маленько поработал с Вашей обработкой и фиксированные строки стали считываться прям строками. А вот остальное не могу. Вот прошу Вашей помощи.
(31) ololoanonim, Сегодня-завтра выложу обработку, там несложные алгоритмы — нетрудно будет разобраться, и заранее спасибо за тестирование 🙂
(32) Вам спасибо! Очень жду когда выложите.
(5)
У меня горе — прямо горе — рухнула база. Проверяла через внутренний файл 1 C chdbfl — сказал «База данных разрушена. Восстановление не возможно». Последний раз сохранялась 28.04.14. А сейчас год закрывать а у меня база рухнула. Я просто не представляю как ее восстанавливать, если документы заново вводить. Помогите, пожалуйста, восстановить
(34) gerkon1980, Могу попробовать Вам помочь. Емейл для связи указал в ЛС
(35) Чтение работает, только при чтении больших таблиц вызывается исключение. Причины устанавливаются. 🙂
(36) ololoanonim, Во-первых, еще раз спасибо за тестинг, на который не хватает времени.
Во-вторых, в принципе, обработка тестировалась на разных таблицах, в том числе и больших. Надо смотреть конкретную базу и конкретную таблицу. Я там в ЛС на всякий случай написал свой емейл.
(37) Хорошо. Вечером, когда буду дома, я Вам напишу.
Ой, спасибо 🙂 Вытащил данные о продажах из битой базы кассового узла.
Николай, добрый день!
Можно ли решить с помощью Вашей конфигурации проблему: «Ошибка СУБД: Длина ключа индекса превышает максимально допустимую ‘_Documen831…»?
эта обработка считает таблицу IBVERSION?
(41) dskull86, В нескольких базах, которые были под рукой, нормально считывает.
(40) INed, Обработка на данный момент только читает из базы, но ничего не исправляет. Так что Вашу проблему решить вряд ли получится.
Может у меня база слишком хорошо битая, может ещё что, но при попытке чтения записей по объекту выдает вот такую ошибку (не сразу, а после нескольких минут обработки данных)
и еще одна ошибочка
(45)Если база битая, ошибки могут вылезать запросто. В этом случае лучше смотреть в HEX-редакторе, что и как, можно писать скрипты для КК. Вообще, сначала была идея сделать кучу проверок, но стала падать скорость работы.
Добрый день, есть битая база, с вашей замечательной обработкой получилось увидеть структуру и даже прочитать часть таблиц. Но тут везение закончилось. Подскажите как можно с вами связаться на предмет сотрудничества по этой проблеме
Здравствуйте, крутая разработка, сейчас уже ни кто таким не занимается.Есть простая задача, выгрузить все таблицы из одной базы и загрузить их в другую, исключая системные таблицы,не подскажите как это реализовать?
(48)Здравствуйте, выгрузить все таблицы можно скриптом в «Консоли кода», в обработке есть примеры. Загрузки через интерфейс нет, но опять же можно через скрипты. Можно загружать таблицы в SQL-базу, так проще и быстрее.
(49)обработка очень крутая, мне как чистому 1с нику тяжело конечно понимать весь код на низком уровне, не представляю как такое написать можно было, посоветуйте что почитать по двоичным данным?Я выгрузил блоб а он меньше на 250, 250 это размер страницы или чего, это в чем измеряется, я не понимаю.А можно пример если мне нужно blob загрузить таблицы params для dbname, если можно в личку.
Здравствуйте , меня заинтересовала ваша обработка , восстановление баз данных это одна из интересующих меня областей , обработка действительно крутая , но как по мне не хватает нормального мануала к ней , Например есть консоль кода , но что в ней писать хз так как нет справки. Есть ли возможность предоставить справку по доступным функция и параметрам к ним с описанием назначения функции
Есть ли возможность удалять таблицы как в формате 8.2.14 так и формате 8.3.8 .
(50)blob он целиком идет или он может раскидан по базе быть я не понял тоже.
(52) Читайте описание форматов 8.2.14 и 8.3.8 Например это
там же ссылка на старый формат 8.2.14
На сколько я знаю данные могут идти не по порядку поэтому возможно что часть данных окажется в другом месте . В любом случае есть таблица размещения данных , где перечислены номера страниц данных
(53)пытался это читать, ниче не понятно, как понимаю нужно классические книги почитать по строению баз, вот такое я бы почитал, думаю 1с не сами это придумали ведь, и по двоичному представлению данных тоже надо читать что-то..
Это аналог Sql studio для 1С без возможности делать бэкап.
(0) И еще вопрос где можно посмотреть какие функции (и их описание ) экспортирует внешняя компонента
(51)Здравствуйте. В ближайшее время выложу пример отдельной обработки, которая будет вызывать функции 1CDBin как функции библиотеки.
Функций записи в базу 1CD из интерфейса нет, поэтому через обработку удалить таблицы не получится. Удалять таблицы легко в 16-ричном редакторе, я, например, активно использую HxD, Для удаления таблицы нужно всего несколько байтов подправить. В принципе, это можно и без этой обработки сделать.
Насчет скриптов — в модуле формы есть процедуры «_КК_Тест_Скрипт1 ()» «_КК_Тест_Скрипт2 ()» итд, это и есть примеры скриптов. Открываете базу, копируете код такой процедуры из Конфигуратора в буфер обмена, вставляете в поле на закладке «Консоль кода» и нажимаете «Выполнить код 1С». Все имена функций и процедур, которые имеют отношение к скриптам для КонсолиКода, имеют префикс КК_
Если, например, скрипт получает данные из какой-то функции, можете в конце скрипта дописать вывод результата в файл, текстовое поле или ОкноСообщений.
(56)А какая именно компонента?
(57) Сегодня пробовал выгружать файлы таблиц по папкам , немного изменив код обработки
Показать
В самой консольке написал следующий код
Показать
Выгружает пару таблиц , а потом валится с ошибкой — «преобразование к типу число не может быть выполнено»
причем если потом отдельно через закладку операции выгрузить эту таблицу , и снова запустить через консоль то таблица выгружается
Посмотрите пример _КК_Тест_Скрипт1 () в модуле формы, там написан правильный обход таблиц.
У Вас в коде вместо
База1С.МассивТаблиц [НомерТаблицы];
Нужно вызывать функцию:
КК_ПолучитьСтруктуруТвблицыПоИмени ()
Это связано с постепенным получением данных, для ускорения работы некоторых функций
(59) В итоге код выгрузки таблиц для «Консоли кода» будет выглядеть так:
Показать
(61) у меня так получилось
Показать
(0) Добрый день! Подскажите, можно ли обратиться к вам за помощью в восстановлении базы? Ситуация следующая — умер hdd на котором хранилась база. Резервные копии делались ежедневно в Acronis Cloud. Базу восстановили, но она не запускается(( пишет — файл базы данных повреждён. У нас этих резервных копий глубиной в 2 месяца и заработала только самая первая (двух месячной давности), но за эти 2 месяца было проделано очень много работы. Если не вы, то может быть подскажете к кому можно обратиться? Заранее спасибо!
(63) Пробовали проверять утилитой Chdbfl ?
(64) Да, выдаёт кучу ошибок. Если поставить галку на исправление найденных ошибок, то утилита тупит несколько секунд и закрывается. Tools_1c также сыпет море ошибок. Чуть попозже выложу скриншоты с ошибками
(64) вот что показывает chdbfl
Есть надежды на оживление? Или с этим сразу в морг?
(66) Надежда всегда есть , пришлите файл гляну как раз и эту обработку опробую
(67) Почему то не могу вам отправить личное сообщение. Не могли бы написать ваш email? в личные сообщения конечно же
(68) vadim1985@yandex.ru
(69) Отправил вам ссылку нашу базу в акронисе.
Здравтсвуйте,
был сбой на сервере,
chdbfl выдал такие ошибки:
Повреждены данные таблицы ‘FILES’. Восстановлено 30 из 30 записей.. Потеряно 2 значений полей неограниченной длины
Повреждены данные таблицы ‘_DOCUMENTJOURNAL6806’. Восстановлено 48135 из 48140 записей.
Повреждены данные таблицы ‘_DOCUMENTJOURNAL6840’. Восстановлено 14348 из 14349 записей.
Повреждены данные таблицы ‘_DOCUMENT207’. Восстановлено 9725 из 9725 записей.. Потеряно 2 значений полей неограниченной длины
решили через вашу обработку посмотреть ‘_DOCUMENT207’
в нерабочей базе при чтении записей выдало сообщение об ошибке.
Хотелось, чтобы ошибочные записи ваша обработка могла выводить, или хотя бы пропускать.
А так же сообщить номер строки. в таблице. У нас есть бэкап на предыдущий день. Мы можем по нему сверить, какие данные повредились. Но не можем понять какой документ повреждён. Предположительно это банковская выписка.
Судя по картинке, где-то есть повреждение описания таблицы. В новой версии, которая сейчас тестируется, поврежденные описания таблиц будут обрабатываться более гибко.
Также в новой версии будет более информативный вывод ошибок в записях таблиц, с номером страницы в базе, номером записи в таблице и смещением записи в таблице.
(72) жду новую версию , очень удобный инструмент. А не рассматривается возможность добавление и удалении таблиц ?
Добавление/удаление таблиц не планируется. Есть вариант через SQL-версию. Перетащить в SQL базу все, что перетащится, а там уже делать все, что нужно.
В планах есть набор функций для изменения записей и полей, а сами изменения предполагается делать скриптами в КонсолиКода, но это не в ближайшей версии.
(74) жаль что не планируется , придётся самому думать как это реализовать , так как это необходимый инструмент для починки баз