Восстановление работоспособности файловой базы. 3. Конфигурация

21.04.13

Задачи пользователя - Корректировка данных

Восстановление работоспособности разрушенной файловой базы. Этап 3. Лечим конфигурацию.

Продолжение. Предыдущие этапы:

0. Введение

1. Обследование

2. Лечение


Этап 3. Лечим конфигурацию.

Проблемы в таблицах конфигурации - одна из самых частых причин "падения" файловой БД. Последствия бывают как лёгкие (невозможность открытия определённых объектов в режиме Предприятия и/или Конфигуратора, обновления конфигурации), так и тяжёлые (невозможность открытия БД ни в режиме Предприятия, ни в режиме Конфигуратора).


Как мы помним, конфигурация хранится в двух таблицах: CONFIG - содержит файлы конфигурации БД, CONFIGSAVE - содержит файлы основной (сохранённой, редактируемой) конфигурации. Если на этапе обследования были выявлены проблемы в этих таблицах ("битые" записи/файлы, существенно меньшее количество файлов по сравнению с типовой конфигурацией или конфигурацией из последнего бэкапа (это не касается таблицы CONFIGSAVE, т.к. для неё уменьшение количества записей может являться нормальной ситуацией, означающей, что изменения из основной конфигурации перенесли в конфигурацию БД), наличие файлов с окончаниями ".new" в имени, и пр.), то пора приступать к их лечению (для этого прибегнем к помощи компоненты 1CDLib).

Начнём с лёгкого - таблицы CONFIGSAVE. Поскольку утеря содержимого этой таблицы не очень страшна (будут лишь утеряны сохранённые, но не перенесённые в БД изменения конфигурации), то самым кардинальным способом является полная очистка содержимого данной таблицы:

    FileDB=Новый("AddIn.T1CDLib.DB1CD");
   
Состояние("Чтение структуры файла");
   
FileDB.Open1CDFile(ИмяФайла);

   
FileDB.OpenTable(0,"CONFIGSAVE");
   
FieldFileName="FILENAME";

   
Состояние("Перебор записей");
   
Рез=FileDB.MoveFirstRecord(0);
    Пока
Рез Цикл
        Если НЕ
FileDB.IsRecordDeleted(0) Тогда
           
FileDB.DeleteRecord(0);
        КонецЕсли;

       
Рез=FileDB.MoveNextRecord(0);
    КонецЦикла;

   
FileDB.CloseFile();



В результате основная конфигурация будет приведена к конфигурации БД.


Также можно попытаться перенести данные этой таблицы из последнего бэкапа, но только в том случае, если с момента бэкапа изменения не переносились в конфигурацию БД. Хочется отметить, что вероятность наличия такого бэкапа ничтожно мала, но, всё-таки, отметим эту возможность.

Теперь перейдём к таблице CONFIG. Если содержимое этой таблицы сильно повреждено, пути восстановления следующие:

  • 1.Если есть бэкап, с момента которого изменения в конфигурацию БД не вносились, или вносились незначительные изменения, не повлёкшие за собой реструктуризацию БД, то самый простой путь - перенести данные этой таблицы из бэкапа:

        МасПереносТаб=Новый Массив;
       
    МасПереносТаб.Добавить("CONFIG");

       
    ПапкаБазы="ПутьКПроблемнойБазе";
       
    ПапкаБазыПред="ПутьКБазеИзБэкапа";
       
    ИмяФайла=ПапкаБазы+"1Cv8.1CD";
       
    ИмяФайлаПред=ПапкаБазыПред+"1Cv8.1CD";

       
    FileDB=Новый("AddIn.T1CDLib.DB1CD");
       
    Состояние("Чтение структуры файла");
       
    FileDB.Open1CDFile(ИмяФайла);

       
    FileDB2=Новый("AddIn.T1CDLib.DB1CD2");
       
    FileDB2.Open1CDFile(ИмяФайлаПред);

       
    Состояние("Перенос таблиц");

        Для каждого
    ТекТаб из МасПереносТаб Цикл
           
    TableName=ТекТаб;
           
    ПапкаТаб=ПапкаБазыПред+TableName+"\";
           
    ВремКат=Новый Файл(ПапкаТаб);
            Если (НЕ
    ВремКат.Существует()) Тогда
               
    СоздатьКаталог(ПапкаТаб);
            КонецЕсли;

           
    FileNameDescription=ПапкаТаб+"Description";
           
    FileNameRecords=ПапкаТаб+"Records";
           
    FileNameBLOB=ПапкаТаб+"BLOB";
           
    FileNameIndexes=ПапкаТаб+"Indexes";

           
    FileDB2.SaveTableDataToFile(TableName,FileNameDescription,FileNameRecords,FileNameBLOB,FileNameIndexes);

           
    FileDB.LoadTableDataFromFile(TableName,FileNameDescription,FileNameRecords,FileNameBLOB,FileNameIndexes);
        КонецЦикла;

       
    FileDB.CloseFile();

       
    FileDB2.CloseFile();

  • Естественно, конфигурация откатится на момент бэкапа, т.е., если за это время были внесены какие-то изменения в модули или макеты, то они будут утеряны.
  • 2. Если конфигурация является полностью типовой, либо типовой с незначительными изменениями, не повлёкшими за собой реструктуризацию БД, и которыми можно пренебречь, то можно перенести конфигурацию из развёрнутой новой базы с типовой конфигурацией. Но здесь есть одна проблемка - как точно узнать нужный релиз, если база не открывается ни в одном режиме? Выход есть: открываем декомпрессированное содержимое файла "root" - там мы увидим GUID нужного нам файла (например, для БП 2.0 это "e0666db2-45d6-49b4-a200-061c6ba7d569"), далее открываем декомпрессированное содержимое этого файла - там, недалеко от начала файла, мы увидим название конфигурации, редакцию, название и копирайты разработчика, и, что самое важное, номер релиза.
  • Номер релиза
  • Далее - дело техники, нужно найти нужный релиз типовой конфигурции и перенести содержимое таблицы CONFIG в нашу проблемную базу. (Извлечь содержимое таблицы CONFIG можно при помощи обработки ViewRecords.epf из 1. Обследование.)
  • 3.Если база рухнула во время обновления конфигурации БД (характерным признаком этого является наличие файлов с окончаниями ".new" в имени), то может помочь вот такой скрипт (удаляет файлы с окончаниями ".new"):

        FileDB=Новый("AddIn.T1CDLib.DB1CD");
       
    Состояние("Чтение структуры файла");
       
    FileDB.Open1CDFile(ИмяФайла);

       
    FileDB.OpenTable(0,"CONFIG");
       
    FieldFileName="FILENAME";

       
    Состояние("Перебор записей");
       
    Рез=FileDB.MoveFirstRecord(0);
        Пока
    Рез Цикл
            Если НЕ
    FileDB.IsRecordDeleted(0) Тогда
               
    FileName=FileDB.ReadSimpleValue(0,FieldFileName);
                Если (
    Прав(FileName,4)=".new") Тогда
                   
    FileDB.DeleteRecord(0);
                КонецЕсли;
            КонецЕсли;

           
    Рез=FileDB.MoveNextRecord(0);
        КонецЦикла;

       
    FileDB.CloseFile();

В данной статье приведены наиболее типичные скрипты. Путей восстановления конфигурации, конечно, намного больше, можно написать любой скрипт с использованием функций компоненты 1CDLib - переименование, удаление файлов по определённым условиям, перенос определённых файлов из другой базы, и т.д.
Например, рецепты восстановления клиент-серверных БД типа //infostart.ru/public/138797/ (приведён рецепт лечения после неудачного динамического обновления) легко и непринуждённо можно применять и для файловых баз, причём безо всяких лазаний в дебрях файла БД с Hex-редакторами и прочими "напильниками".
Сравните, например, шаманские танцы с бубном в //infostart.ru/public/154556/ , которые ещё и не всегда могут увенчаться успехом, и простенький скрипт

    FileDB.OpenTable(0,"CONFIG");
   
FieldFileName="FILENAME";

   
Состояние("Перебор записей");
   
Рез=FileDB.MoveFirstRecord(0);
    Пока
Рез Цикл
        Если НЕ
FileDB.IsRecordDeleted(0) Тогда
           
FileName=FileDB.ReadSimpleValue(0,FieldFileName);
            Если (
FileName="сommit") ИЛИ (FileName="dbStruFinal") Тогда
               
FileDB.DeleteRecord(0);
            КонецЕсли;
        КонецЕсли;

       
Рез=FileDB.MoveNextRecord(0);
    КонецЦикла;




Надеюсь, что данная статья поможет Вам в восстановлении базы, но ещё лучше не забывать про ежедневные бэкапы.

См. также

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    32666    106    152    

73

SALE! 20%

Корректировка данных Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 2880 руб.

10.02.2017    110496    662    174    

702

Закрытие периода Корректировка данных Бухгалтер Пользователь Платформа 1С v8.3 Оперативный учет 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

4800 руб.

27.10.2021    23918    241    35    

78

Корректировка данных Программист Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет НДС Платные (руб)

Обработка предназначена для корректировки входящего НДС при смене системы налогообложения индивидуального предпринимателя с УСН на ОСНО в 1С:Бухгалтерия предприятия 3.0

4000 руб.

18.07.2024    688    1    0    

1

Корректировка данных Зарплата Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    1680    11    5    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1375 22.04.13 07:00 Сейчас в теме
данная статья (предварительно) завершает цикл
2. TrinitronHome 22.04.13 17:55 Сейчас в теме
большое спасибо вам за данную статью, очень содержательно и полезно для меня, как начинающему осваивать платформу v8
3. ЮлияМ 23.04.13 00:29 Сейчас в теме
Спасибо большое. Грамотно и интересно изложена статья.
4. fibrsb 23.04.13 15:53 Сейчас в теме
5. DAnry 9 24.04.13 17:58 Сейчас в теме
Спасибо, очень доходчиво!
6. LexSeIch 211 29.04.13 10:10 Сейчас в теме
Мир этому дому!
Пока не доводилось восстанавливать БД подобными методами (больше надеюсь на Бэкап еще и территориально разнесенный...), но взял статью на заметку. Спасибо.
7. shira84 226 30.04.13 08:41 Сейчас в теме
Автор молодец. Не поленился, не пожадничал и поделился опытом. (я про все статьи в целом).+++++
8. pumbaE 31.05.13 08:29 Сейчас в теме
А подскажи каким образом можно сохранить конфигурацию из таблицы "CONFIG" ?
9. andrewks 1375 31.05.13 08:42 Сейчас в теме
(8) pumbaE, сохранить в cf? или перенести в другую базу?
10. pumbaE 31.05.13 09:41 Сейчас в теме
(9) сохранить, интересно именно сохранить конфигурацию в cf файл.
Штатное сохранение конфигурации очень долго делается. Для SQL есть решения от Dmitro (GameWithFire) , а для файлового варианта не быстрого сохранения. Хочется из снегопата сделать быстрое сохранение cf файла , для последующего фонового разбора в git.
11. Модератор раздела 31.05.13 10:21 Сейчас в теме
(10) +1
Нужная задача.
И просто быстрое сохранение конфигурации не помешает :)
Сейчас невозможно из командной строки вытащить конфигурацию из файла 1С :(
12. andrewks 1375 31.05.13 10:27 Сейчас в теме
(10) pumbaE, а зачем сохранять (паковать) в cf, чтобы потом его тут же разбирать(распаковывать)?
это же дольше получится.
мне кажется, проще и быстрее напрямую тянуть записи (объекты) из таблички
13. pumbaE 31.05.13 11:52 Сейчас в теме
(12) что-бы потом отдельной задачей распаковать его с помощью 8.3.
Прочитать можно, только ведь все во внутреннем формате, а хотелось бы в понятном для последующей сборке для 1С.

Альтернативные системы контроля версий выигрывают у хранилища возможностью вести не только линейную историю версий, но к сожалению хранилище в плане помещения одного объекта выигрывает в скорости. Хотелось бы для разработчика сделать прозрачную систему: надо закомитить, делаем быстрое сохранение конфигурации и комитим именно cf файл, при этом в фоне стартуем задачу по разбору из cf файла в xml с помощью 8.3 и аналогичный коммит только в другую ветку.

В этом случаи мы получаем скорость, я надеюсь на это, и альтернативные системы контроля версий. Но хотелось бы еще и быстрого сохранения именно cf файла.
14. andrewks 1375 31.05.13 13:08 Сейчас в теме
(13) pumbaE, а скорость сохранения в cf тулзом от Валерия awa не устраивает?
15. pumbaE 31.05.13 13:14 Сейчас в теме
(14) устраивает :). Даже попросили Валерия в командный режим вынести возможность выгрузки cf файла, но я еще хотел бы с помощью твоей компоненты на linux тоже такое проворачивать (надеюсь снегопат на qtscript не за горами и любимая кдешечка начнет дома работать в полной мере).
16. andrewks 1375 31.05.13 13:31 Сейчас в теме
(15) pumbaE, а, теперь понял, вопрос в линуксе.
запишу в свои будущие планы, только по срокам не сориентирую - свободного времени в обрез
17. Ele1234567 23.12.13 10:21 Сейчас в теме
18. San4opa 11.04.18 01:04 Сейчас в теме
У меня когда доходит до кода OpenMetadata() или OpenTable вылетает 1с. подскажите плиз в чем дело как обойти?
19. Oleshko_G 16.03.20 14:53 Сейчас в теме
Андрей, привет
Файл базы восстановлен после вируса шифровальщика.
При открытии и в режиме Предприятие и Конфигуратор:
Файл базы данных поврежден

chbfl много раз :
Повреждена таблица размещения внутреннего файла <Описание базы данных>

Tool1CD много раз:
Попытка чтения блока за пределами файла

И в конце "файл не является базой 1С."

Что возможно сделать для восстановления?
20. Online-Ufa 16.03.20 16:26 Сейчас в теме
(19)
Что возможно сделать для восстановления?

Восстановить архивную копию
Оставьте свое сообщение