База данных 1С, запускается без ошибок, но при входе в список документов Реализации вылетает с ошибкой, в тексте которой особо ничего полезного не дано.
Тестирование из конфигуратора дает такую же ошибку. Тестирование chdbfl.exe дает это (без галочки "исправлять"):
Повреждена таблица размещения внутреннего файла <Данные таблицы '_DOCUMENT233'>
Повреждена таблица размещения внутреннего файла <Данные неограниченной длины таблицы '_COMMONSETTINGS'>
Повреждены данные таблицы '_DOCUMENT254'
И это (с галочкой "исправлять"):
Повреждена таблица размещения внутреннего файла <Данные таблицы '_DOCUMENT233'>
Повреждена таблица размещения внутреннего файла <Данные неограниченной длины таблицы '_COMMONSETTINGS'>
Повреждены данные таблицы '_DOCUMENT233'. Восстановлено 3317 из 3466 записей.
Повреждены данные таблицы '_DOCUMENT254'. Восстановлено 3470 из 3471 записей.
После этого база прекрасно работает, но в ней исчезает около сотни документов Реализации.
В Tool1CD в таблице _DOCUMENT254 (это счет-фактуры выданные) последние две записи кривые, с непонятными данными. В таблице _DOCUMENT233 Тоже последние записи кривые, при этом все усложняется тем, что они не хотят нормально читаться: выходит сообщение "Попытка чтения блока за пределами файла". При этом адрес смещения у этих последних строк вообще какой-то непонятный. Такого нет, если смотреть через HEX-редактор.
Возникают следующие гипотезы:
1. Нужно удалить некорректные строки в таблицах
2. Возможно, в заголовке таблицы Реализации указан не верный размер самой таблицы с данными. Возможно, нужно его поправить.
Но вопрос как редактировать БД? Tool1CD и прочие инструменты не работают с базой, так как она в формате 8.3.8. Конвертировать ее не получается - она выдает ошибку. Остается только HEX, но я совершенно не знаю как в нем искать эти самые строки. Понимаю, что где-то есть таблица размещения, где должны быть адреса, но я не смог ее найти.
Опыта в восстановлении у меня совершенно нет, но я честно двое суток нон-стоп пытался разобраться самостоятельно, но, кажется, придется прибегнуть к помощи сообщества.
Проблему удалось решить !!
Проблема была в том , что слетел номер страницы таблицы размещения Данная таблица описывалась полной структурой размещения (подробнее можно почитать тут) . Таблица данных имела 2 массив страниц. Ссылка на первый массив была корректной , а вот на второй была неверна и указывала на пустые записи .
Поэтому пришлось искать записи данной таблицы (наверное это самое сложное в данной задачи ) , по найденной записи получать номер блока этой записи и искать номер этого блока в каких таблицах размещения он участвует (а должен он участвовать только в одной таблице размещения) и уже этот адрес указывать как правильный адрес на массив страниц.
В результате при прогонке через chdbfl теперь теряется только одна запись
(14) Пробовал. Только данные, которые мне нужны - битые. Они отображаются не верно. И нет уверенности, что они не утеряны безвозвратно. Но надеюсь, что проблема только с неправильными размерами.
1) сделайте 2 копии вашей базы
2) одну из копий прогоните через chdbfl с исправлением
3) откройте 2 файла в HEX и сравните что поменялось (там есть функция сравнить файлы )
после этого надо попытаться выяснить где идет косяк
Еще вариант можно попробовать перейти по смещению последней нормальной записи и посмотреть что идет после этой записи (если мы знаем размер одной записи можно вычислить начало и конец следующих записей)
(17) надо по смещениям ориентироваться , возможно что они немного разбросаны , но не думаю что очень сильно, опять же в Tools 1c можно отследить как идут записи (не считая конечно последних битых)
(21) в описании tools 1cd смотрим размер записи в данном примере она равняется 185 - переводим в 16- ричную систему получаем B9 (см . описание таблицы)
чтобы получить начало послед. . записи прибавим B9 к смещению к предпоследней - можешь проверить ))) AE01ABF6 + B9 = AE01ACAF (см. расчет записи)
столбец file offset в tools 1cd отсортирован по возрастанию
(24) Есть еще один лайф хак , правда не знаю будет ли он работоспособный в вашем случае
Tools 1cd для 8.3.8 не совсем не работоспособный ,выбрать нужную таблицу и через меню файл можно выгрузить файлы с данными (decr, data,index,blob) и открыть в Hex так вы получить все записи таблицы с данными , по которым можно искать в основной базе
(25) Сохранил таблицу data, открыл в HEX. Я правильно понимаю, что в ней данные именно по порядку должны идти? И это по сути те же самые данные, которые мы можем увидеть в HEX самой базы данных?
Tool1CD - данная программа уже дано не дает возможности редактировать файловые базы, она если не ошибаюсь даже уже не поддерживается и следовательно не дорабатывается, а структура базы меняется от релиза к релизу.
НЕХ редактором мне кажется нереально найти битые строки.
Если сделать тестирование и исправление стандартными средствами то думаю он просто почистит таблицы базы.
Хотя как вариант можно попробовать это сделать, вдруг он битые ссылки на документы почистит
(11) тестирование из конфигуратора не работает. В chdbfl нет возможности "не заказывать очистку ссылок". И это вообще никак не относится к этой конкретной проблеме. Тут беда не в битых ссылках
Проблему удалось решить !!
Проблема была в том , что слетел номер страницы таблицы размещения Данная таблица описывалась полной структурой размещения (подробнее можно почитать тут) . Таблица данных имела 2 массив страниц. Ссылка на первый массив была корректной , а вот на второй была неверна и указывала на пустые записи .
Поэтому пришлось искать записи данной таблицы (наверное это самое сложное в данной задачи ) , по найденной записи получать номер блока этой записи и искать номер этого блока в каких таблицах размещения он участвует (а должен он участвовать только в одной таблице размещения) и уже этот адрес указывать как правильный адрес на массив страниц.
В результате при прогонке через chdbfl теперь теряется только одна запись