Восстановление файловой версии базы данных *.1CD после ошибки динамического обновления.

Публикация № 154556

Администрирование - Сервисные утилиты

198
Восстановление работоспособности файл-серверной базы данных (файл *.1CD) после критической ошибки, возникшей в результате динамического обновления с последующим предупреждением "Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?".

Предистория:
Очередное динамическое обновление файловой базы данных ничего не предвещало плохого. Как вдруг выскочило окно "ошибка кэша...". :) или просто завис конфигуратор во время обновления.
На первый взгляд ничего страшного: ну не сохранилась конфигурация в базе данных, снова откроем конфигуратор и обновим базу данных. Но не тут-то было...
В ответ на вопрос хотим ли мы повторить обновление 1С благополучно падает и не поднимается. Вот здесь начинаешь подозревать что-то неладное. Пробуешь еще раза три...тоже самое. Хуже того пользователи тоже не могут входит в базу данных с сообщением "Завершить" или "Перезапустить".
Тут включается мозг и вспоминаешь: есть же еще утилита для проверки файловой версии "chdbfl.exe", но как ни странно утилита сообщает что ни одной ошибки нет, но база все равно не открывается. Запуск 1С из коммандной строки с параметрами: /UpdateDBCfg,  /RollbackCfg или /IBCheckAndRepair -Rebuild   - тоже не исправляют ситуацию...


Поиском по интернету и по сайту infostart нашел решения только для клиент-серверной (SQL) версии базы данных:

//infostart.ru/public/138797/

Смысл в котором заключается в удалении пары строчек из таблицы Config, но как удалить в файле *.1CD???

Решение:
С помощью программы Tool_1CD, которая позволяет просмотреть структуру и содержимое таблиц 1CD, нашел, что в таблице "Config" присутствуют строки со следующими значениями в колонке "FileName":
сommit
dbStruFinal
DynamicallyUpdated
dynamicCommit
Опытным путем, было установлено что важными являются строки: "сommit" и "dbStruFinal" - их нам и надо удалить.
Если бы программа Tool_1CD еще бы позволяла редактировать - цены бы ей не было... А так пришлось экспериментировать...

Можно воспользоваться либо любым Unicode-редактором, либо HEX-редактором с поиском по Unicode.
Я использовал программу HxD (т.к. она позволяет быстро работать с файлами большого объема). Открываем файл *.1CD. В меню выбираем поиск, ставим обязательно галку "Юникодовая строка" и вводим в поле "Искать" слово "сommit".

 Поиск

Программа находит нужную строку. Но удалять нельзя, т.к. измениться смещения всех других объектов в файле. Тогда заменим первую букву этого слова на любую другую, например, "b"("63" заменить на "62").

То же самое проделать со словом "dbStruFinal".
Закрываем и сохраняем файл, запускаем 1С и, ура, база начала открываться.


Буду рад, если кому-нибудь сэкономил нервы и время...


P.S.: все это применимо только для после ошибки динамического обновления и если утилита "chdbfl.exe" показывает, что нет ошибок

198

См. также

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. DrAku1a 1303 03.10.12 02:27 Сейчас в теме
Только недавно с таким боролся... Положили 17-гиговую базу... Интересно, что "падают" платформы версии 8.2.15 и 8.2.16, а после пробы на 8.2.14 обновление успешно завершилось и база стала работоспособна...
Правда ненадолго - через пару дней от того же динамического обновления опять легла - уже было хуже: "Ошибка считывания вторичной информации". Не восстановил. Так что, лучше юзайте SQL...
2. automatizator 289 03.10.12 02:27 Сейчас в теме
Плюсую за волю к победе!
Видимо резервной копии то и не было ;)
Она поди надежнее, чем пляска с коробкой динамита!
Podmoskvich; +1 Ответить
12. djserega 250 03.10.12 11:53 Сейчас в теме
(2) Ре(2) automatizator,
Резервная копия была, но проблема обнаружилась к концу дня, а было это начало месяца, в базу было столько документов набито, что восстанавливать их уйдет еще день с лишним, а надо сдавать отчеты
(7) GoodZone,
Меняем Идентификатор строки в Config c commit на bommit например, чтобы конфигуратор не нашел этой строки и открылся нормально
После этих изменений думал что с конфигурацией будут какие-нить проблемы - нет все работает, сохраняется и даже изменения сделанные перед сбоем сохранились
(10) bforce,
Тоже думал, что на файловой такое не может случиться - все таки другая система хранения данных (недавно только на SQL-базе восстанавливал). Но 1С решила не делать исключений для файловой версии :)
3. program_km 3 03.10.12 06:38 Сейчас в теме
Можно попробовать утилитой от 1с C:\Program Files\1cv82\bin\chdbfl
4. Serj1C 476 03.10.12 07:30 Сейчас в теме
(3) program_km, автор же уточнил, что утилита ошибок в структуре не нашла.
(0) спасибо, берем на заметку!
5. MAXXL 8 03.10.12 07:50 Сейчас в теме
Был такой случай. Помогло выполнение обновления через CF, а не через CFU. правда в дальнейшем, при попытке обновления через CFU ошибка повторялась.
9. Xytras 30 03.10.12 10:01 Сейчас в теме
(5) MAXXL,
при данной проблеме не дает зайти в конфигуратор, поэтому обновить ни через cf ни cfu не получится

(6) Воронкин,
пробовал, на компе с другой платформой (посвежее) тож ничего не получалось

(7) GoodZone,
все он знал где и что менять. утилитой Tool_1CD посмотрел битую и рабочую базу из архива и увидел, что секции commit в рабочей базе нет. следовательно это и есть корень зла =)
14. Воронкин 03.10.12 15:57 Сейчас в теме
(9) Наоборот - платформа была очень старая, а на такой-же и посвежее - первый раз не получилось
6. Воронкин 03.10.12 08:08 Сейчас в теме
Был подобный случай. Сделал следующее: Перенес CD-шник на другой компьюер, с другой платформой, обновление прошло, вернул назад.
Но так и не понял такой вариант - это частный (конкретный) случай или универсальный и проходит всегда.
7. GoodZone 9 03.10.12 09:19 Сейчас в теме
Танцы с бубном )))) А пообщаться с "1С" не пробовали? Поменяли символы - это считается решением?
Надо же понимать что и где меняете.
38. psa247 13.10.12 17:54 Сейчас в теме
(7) GoodZone,
это все круто - написать в 1С, дождаться ответа, сделать...
Особенно можно не спешить, когда сидишь у клиента, отчетность какая-нибудь - да и фиг с ней. Надо делать так: восстанавливаешь из копии и с невозмутимой мордой гришь - у вас база битая, приду, когда из 1С ответят
IvanovAV; DanMan; CaSH_2004; +3 Ответить
8. Xytras 30 03.10.12 09:48 Сейчас в теме
сам недавно так же решал проблему. только я проставил нули в секции commit. после этого база запустилась
потом добавил новый справочник и это позволило дообновить базу. Ваше решение элегантнее =)
10. bforce 428 03.10.12 10:59 Сейчас в теме
Удивительно! До вашей статьи считалось, что ошибка динамического обновления не затрагивает файловые базы. В том числе на партнерском форуме об этом писали.

PS/ Архивную копию нерабочей базы сделали для истории?
15. Воронкин 03.10.12 15:59 Сейчас в теме
(10) Теория это одно - а на практике получается по другому.
11. lusilda 03.10.12 11:37 Сейчас в теме
Спасибо огромное за решение проблемы)) Позавчера у меня файловая база полетела с теме же симптомами.
Испробованных chdbfl.exe и запуск 1С из командной строки с параметрами: /IBCheckAndRepair -Rebuild - тоже не исправили ситуацию.Так как база была копией филиальной- для просмотра, пришлось попросить выслать ее копию.
Но копия покалеченной базы у меня осталась, на ней и воспользовалась вашим советом. сommit нашла и подменила первую букву, а строка dbStruFinal не нашлась. В итоге база запустилась с предложением преобразования на новую платформу))
13. keln 65 03.10.12 14:25 Сейчас в теме
Был точно такой же случай. Благо клиент обновлял базовую версию программы автоматическим обновлнием, при котором программа сама создает архивную копию в папочку Temp. Возьму этот способ восстановления себе на заметку, на всякий случай.
16. Масянька 03.10.12 18:59 Сейчас в теме
Недавно тоже боролась с такой шнягой....страшно было жуть(база 26г), пришлось востановить config. Статья очень полезная. молодец.
17. Il 11 04.10.12 04:01 Сейчас в теме
Тоже не так давно была подобная проблемка, восстановил с копии,
а с битую базу сохранил - сейчас помучаю!
Автору респект!
18. Angeros 04.10.12 06:25 Сейчас в теме
Господа в топку динамическое обновление от 1с. Они его уже 5 лет не могут сдеать, кривожопорукие.
spy-83; IvanovAV; Vladimir87; +3 Ответить
19. Anyxwar 112 04.10.12 08:53 Сейчас в теме
да динамическое обновление это зло.Риб не любит динамичское обновление.При создании 2 распределенной базы идет ругань пока не переобновишь конфигурацию не динамически.Так что поддержу в топку динамическое обновление.Люди никогда не пользуйтесь им.
20. awa 2497 04.10.12 11:23 Сейчас в теме
(0) Вместо поиска строки (а вдруг такая строка найдется в другом месте базы?) можно просто включить в Tool_1CD отображение адресов записи и сразу увидеть адрес, по которому нужно править.
21. djserega 250 04.10.12 17:26 Сейчас в теме
(20) awa,
1)Таблица config размещается всегда в начале файла поэтому первым найдется нужная строка
2)А вы пробовали найти строку с commit в программе Tool_1CD? Кроме как перемещением слайдера больше никак не получиться, поиска и сортировки по Modified - НЕТ.
3)По адресу поподаем чуть раньше этого слова
22. awa 2497 04.10.12 17:55 Сейчас в теме
(21) Хм.
1) Таблица CONFIG размещается в начале базы как правило, но не всегда. Более того, она может быть фрагментирована, и блок именно с commit может оказаться ближе к концу файла 1CD.
2) Конечно, пробовал. Промотать до конца всех записей, начинающихся на "c" и перед началом записей на "d" - совсем не трудно. Главное, отсортировать по имени, по умолчанию, эта сортировка и включается.
3) Конечно, чуть раньше. Адрес записи указывает на признак удаленности записи, это будет байт 00 (удаленная запись - 01), потом идут 2 байта длины имени (для "commit" это будет 06 00, естественно), и затем уже идут сами байты юникодной строки. Из этого следует, что достаточно поменять по адресу, отображаемому Tool_1CD байт с 00 на 01, чтобы пометить на удаление запись.
25. djserega 250 06.10.12 01:56 Сейчас в теме
(22) awa,
>вдруг такая строка найдется в другом месте базы
В теории конечно, но не все так хорошо знают структуру как Вы. Можно использовать смещение адреса. Но на практике я не видел ни одного случая чтобы это имело место. Поэтому как дополнение можно использовать. Но следуя Вашей логике: а почему надо удалять именно строку с "commit"?. Это также было определено практически и это работает. В теории на вопрос: "...произошла ошибка. Повторить обновление?" должна была обновиться база и запуститься. А на практике несколько десятков пользователей сидят без дела и ты думаешь откатываться тебе до резервной копии и потерять день с кучей документов в начале месяца или все таки попробовать восстановить базу....Легко рассуждать сидя за кружкой пива ( :) не в обиду...)
(24) vvr908,
Я думаю это будет не всегда и с последующими релизами они это поправят. А универсального патча на все случаи жизни не придумаешь...
23. vasja_yar 05.10.12 16:19 Сейчас в теме
спасибо автору за труд в его статье , хоть данный метод уже как баян, но будет новичкам как методичка)))
+ за это,
Минус можно ставить , так как не понятно на сколько данный метод безопасен) хоть база уже и "положена" но могут сделать еще хуже))
Не понятно как выбирать эти байты, в слепую удалять тоже не хочеться ))))))
Все равно спасибо автору
24. vvr908 395 05.10.12 23:23 Сейчас в теме
Вот если бы кто-нибудь сваял и выложил автоматический патчер для таких битых баз на основе опубликованной автором методики - было бы здорово!
Можно было бы сразу использовать его в случае, когда chdbfl не помогает поднять базу, а не заниматься воспоминаниями на тему "блин, где же я видел методику восстановления"... ))
26. elis99 06.10.12 12:08 Сейчас в теме
А что обязательно обновлять именно динамически? Есть либо утро, либо вечер (что хуже, ибо юзвери сидят до конца) - и обновляй на здоровье, не рискуя.
27. Dimasik2007 404 06.10.12 21:57 Сейчас в теме
Столкнулся с такой ошибкой, поправил - вошел в конфигуратор. Вопрос. Как теперь выгрузить конфигурацию? При выгрузке ругается на файл "bommit", естественно что у нас его нет))) Как удалить вообще эту запись? Нулями затереть или как?
28. djserega 250 07.10.12 18:01 Сейчас в теме
(27) Dimasik2007,
Тест и исправление сделай или пересохрани конфигурацию в обычном режиме
Нулями не надо
29. Dimasik2007 404 07.10.12 19:04 Сейчас в теме
Тест и исправление не помогли. Что значит "пересохрани конфигурацию в обычном режиме"? Это как?
31. djserega 250 07.10.12 21:54 Сейчас в теме
(29) Dimasik2007,
Измени что-нить в конфигурации (например, создай реквизит и удали) и сохрани, не динамически
30. DitriX 1690 07.10.12 19:48 Сейчас в теме
Могу даже подсобить :) вот вам vbs скрипт всем известный:
File="1Cv8.1CD"
тут я заменил под commit из картинки, надо сделать еще один скрипт для dbStruFinal
arr =split("00 63 00 6F 00 6D 00 6D 00 69 00 74"," ")
А сюда пихаем то, на что хотим заменить. Учтите, все на нули менять нельзя, можно например на 20 поменять, т.е. в итоге выйдет строка типа 00 20 00 20 00 20 00, что соответствует пустому значению, но без здвига. Так же и удаляют информацию о пользователях, получая полный доступ к базе данных :).
arr2=split("00 62 00 6F 00 6D 00 6D 00 69 00 74"," ")
for each c in arr
r=r & chrb(clng("&H" & c))
next
for each c in arr2
r2=r2 & chrb(clng("&H" & c))
next
set s=createobject("ADODB.Stream")
s.type=2
s.open
s.loadfromfile(File)
ss=s.readtext
s.position=0
s.writetext(replace(ss,r,r2))
s.position=0
s.type=1
s.position=2
ss=s.read
s.close
s.open
s.write(ss)
call s.savetofile(File,2)


Сохраняем как в файл с любым именем и расширением *.vbs, копируем в папку с файловой базой и запускаем.

Не тестировал, ибо не на чем. Кто может - протестите и выложите готовый скрипт
32. Dimasik2007 404 07.10.12 22:02 Сейчас в теме
Делал, и реквизит, и справочник - нифига) Пришлось копипастить, благо изменений не много было.
33. djserega 250 08.10.12 09:07 Сейчас в теме
(32) Dimasik2007,
У мне проблем с сохранением не было. Сразу как вошел сделал выгрузку, тест и исправление, и сохранил конфу - все прошло нормально
34. Gandalf Белый 09.10.12 16:19 Сейчас в теме
Большое спасибо! Очень интересный и позновательный материал!
35. Alex663 51 09.10.12 23:04 Сейчас в теме
Спасибо за полезную информацию, надеюсь не пригодится
36. Casey1984 3 10.10.12 05:04 Сейчас в теме
Хм... А я после сбоя динамического обновления файлы кеша 1С чистил и все работало...
37. Vladimir87 221 10.10.12 06:04 Сейчас в теме
Молодец чувак. Полезная информация. Я бы после такого эксперимента, всякий случай, сделал бы перенос данных на аналогичную конфигурацию. И с ней бы уже работал. Но возможно это лишнее ).
39. psa247 13.10.12 17:55 Сейчас в теме
Автору спасибо. Ценная инфа.
40. CaSH_2004 355 14.10.12 22:30 Сейчас в теме
Попробовал решить проблему через WinHex. Строк "commit" и "c o m m i t" не нашел, так же как и "dbStruFinal".А ошибка именно как в статье. У кого то получалось? Или не получалось? Отзовитесь - может это не панацея?
41. djserega 250 14.10.12 23:03 Сейчас в теме
(40) CaSH_2004, галку "Юникодовая строка" не забыл поставить,
если не забыл, то посмотри с помощью Tool_1CD, правда придется искать по алфавиту ручками
47. yartkin 26.10.12 16:04 Сейчас в теме
(40) CaSH_2004,
Мне помог вариант с использованием предыдущего релиза платформы. Открыл неработающую в 15-16 платформах базу 14-й платформой, накатил обновление, выгрузил, загрузил. Выдохнул =)
42. CaSH_2004 355 15.10.12 02:20 Сейчас в теме
Юникод вобще-то там выбирается в списке, а не флажком. Конечно выставил - не в первый раз работаю с ним. Вобщем решил проще - т.к. можно было зайти в режиме Предприятие хотя и ругалось на необновленную конфу, но когда делаеш повторно обновление он делает выгрузку - а она получилась вполне живой. Я ее загрузил в пустую базу и откатился к базовой конфе, после чего обновил повторно. Все заработало.
Так что может зря эти танцы с бубном? Хотя на большой базе наверно долше будет.
43. djserega 250 15.10.12 08:59 Сейчас в теме
(42) CaSH_2004, у тебя другой случай - у тебя конфигуратор открывается и можно базу выгрузить...
44. CaSH_2004 355 15.10.12 09:40 Сейчас в теме
(43) В том то и дело что в Конфигуратор не пускало с ошибкой потока. Перенос на другой ПК или chdbfl - не помогли. Заходить можно было только в Предприятие.
Удивительно что сам механиз динамического обновления умудрился сделать выгрузку в DT! Подозреваю что он делает это не типовыми средствами - что наводит на подозрительные мысли...
45. orfos 38 23.10.12 20:48 Сейчас в теме
Спасибо за инструкцию, если бы не вы мне была бы крышка! Ситуация такая-же при динамическом обновлении, завис и выкинуло из конфигуратора, а потом не открывается. Спасибо помогли!
46. djserega 250 24.10.12 10:38 Сейчас в теме
Еще один момент: после того как восстановили работоспособность базы, необходимо сделать выгрузку/загрузку, т.к. могут возникнуть глюки с обновлением конфигурации
48. Stim213 361 28.10.12 22:23 Сейчас в теме
Ждем новых кроликов-тестеров платформы 8.3, в которой якобы можно изменять структуру метаданных на живой базе с работающими пользователями =)
49. AlexO 126 29.10.12 11:20 Сейчас в теме
(0) автор, никакое это не "восстановление", а разлочивание залоченной базы после динамики..
Уберите тему, или назовите нормально.
А то начнут "восстанавливать" подобным образом.
50. awa 2497 29.10.12 11:34 Сейчас в теме
(49) С чего Вы взяли, что Ваша терминология правильная, а у автора статьи неправильная? В статье описана ситуация, когда ДО база не работает, а ПОСЛЕ работает. Вполне себе подходит под термин "Восстановление работоспособности файловой базы". А вот назвать данную ситуацию "база залочена" (по-русски правильнее все же "заблокирована") я бы не решился. Никто и ничто тут базу не блокирует, здесь налицо ошибка 1С, но не блокировка.
59. AlexO 126 07.11.13 17:23 Сейчас в теме
(50) awa,
Никто и ничто тут базу не блокирует

Как раз блокирует. А не снятый флаг - это ошибка, но не "восстановление базы".
51. djserega 250 29.10.12 13:22 Сейчас в теме
(49) AlexO,
"разлочивание залоченной базы после динамики" - Интересно кто может в поиске такую строку задать?
Повторюсь: когда база не поднимается и над тобой висят пользователи, руководство, телефон обзвонился, клиенты ругаются... то у тебя одна только мысль: "как восстановить базу...".
Согласен с (50). Мне думается так понятнее большинству участников форума.
52. Alexey55 13.11.12 19:10 Сейчас в теме
Спасибо автору! очень помогла информация!
53. 26178_mail.ru 22.11.12 23:51 Сейчас в теме
Спасибо большое помогло для восстановления БД, открыли поправили удалили и база снова в норме, благо автору.
54. prestige 02.12.12 13:52 Сейчас в теме
Спасибо, спасибо, спасибо!!!
55. Necytij 28.12.12 00:45 Сейчас в теме
Насчет релизов платформы. Посмотрели программисты из 1С, что с падением при динамических обновлениях РИБ разобрались, и добавили в новой платформе баг-фичу с падениями и без РИБ - в клиент-серверном варианте. Потом нашел хороший человек выход и из такого положения, тогда суровые программисты из 1С добавили начиная с 15й версии: падения в файловых базах... боже, что же они дальше добавлять-то будут?..
ТС спасибо.
56. redgoll 27.01.13 16:37 Сейчас в теме
Большое спасибо за текст. Теперь динамически больше обновлять не стану, от греха по дальше.
57. Kashemir 352 18.03.13 13:33 Сейчас в теме
Спасибо за статью. Метод подошел, несмотря на другие условия возникновения проблемы. Ошибка возникала при ночном сбросе сессии в момент реструкторизации. После в конфиг не пускало с аналогичной описанной в теме проблемой ( 15 платформа), chdbfl уходил в ошибку. Исправление commit помогло.
58. 1cmax 150 18.03.13 22:10 Сейчас в теме
мда, чем только 1с баги не порадують...
60. ildarik90 24.06.14 12:20 Сейчас в теме
Спасибо очень помогла информация!
61. Balabassko 5 30.01.15 12:06 Сейчас в теме
Автору респект.
Восстановил таким образом работоспособность БД.
62. igor1c2012 11.06.15 17:03 Сейчас в теме
Дай Бог тебе здоровья!
Помог
63. mmevteev 17.08.17 09:17 Сейчас в теме
Спасибо большое за информацию!
Тоже все получилось!
64. klimbna 30.08.17 12:54 Сейчас в теме
Спасибо Огромное!
Про лечение в sql версии читал - но что такое возможно на файловой не думал - пока не столкнулся, а вот на счет hex редактора не додумался.
65. Mirared 05.10.17 12:28 Сейчас в теме
66. Mirared 05.10.17 12:29 Сейчас в теме
Очень помогла Ваша публикация!
67. mvk4d 24.10.17 10:31 Сейчас в теме
Поднял базу!. Подтверждаю, что это работает и на платформе 8.3.10.
Нашел только commit и его изменил, этого оказалось достаточно.
68. djserega 250 24.10.17 17:48 Сейчас в теме
(67) Очень рад за вас, хотя сам такую проблему давно уже не встречал...
69. @Sonya 25 15.02.18 17:23 Сейчас в теме
Спасибо, помогло восстановить базу!
70. MarkMart 21.03.18 12:51 Сейчас в теме
Сергей, спасибо, что Вы есть ! Дай бог тебе здоровья и всего остального.

Несколько часов маялся, помог Ваш отличный совет, правил строчки правда прям из tool_1CD (у меня редактирует и удаляет)
71. alladdin 41 29.08.18 19:48 Сейчас в теме
Благодарность Вам преогромная, прямо спасатель Вы!
72. user623828_lord10545 31.01.19 17:57 Сейчас в теме
Для 1С:Предприятие 8.3 (8.3.10.2650) помогло. Спасибо!
Оставьте свое сообщение