И так начнем с того, что восстановление данных для ТиС не всегда сработает. Сработает 100% если все документы введены либо на основании либо являются основании т.к. все на это и строиться. Для Бухгалтерии все строиться на файле с проводками.
Все началось с того что клиент позвонил и сказал что база не запускается и пишет что 1SJOURNAL.DBF кердык. Конечно я попытался тестировать, выгружать и т.д. но не помогло.
И так создаем новый отчет. На кнопку сформировать вешаем функцию Выполнить() и добавляем 2 радио кнопки с идентификатором Конфа. Первая кнопка Бухгалтерия а вторая ТиС. И еще кидаем на форму Текст в формуле которого пишем Mess. А ниже код вставляем в модуль.
Да этот отчет надо запустить в той нофе что грохнулась в разделенном режиме. Для того чтобы запустить базу надо удалить битый файл 1SJOURNAL.DBF и пересохранить конфу в конфигураторе. после этого заходите и запускайте отчет. Он создаст файл __temp.dbf после чего вы его переименовываете на 1SJOURNAL.DBF и вот и все.
Кстати вот этот кусок кода я указал руками название колонок - это коды таблиц отборов и общих реквизитов. Так что учтите это для ТиС.
    Если Конфа = 2 Тогда
        Ф1.ДобавитьПоле("SP74",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP798",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP4056",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP5365",  "C",  9, 0);
        Ф1.ДобавитьПоле("DS1946",  "N",  1, 0);
        Ф1.ДобавитьПоле("DS4757",  "N",  1, 0);
        Ф1.ДобавитьПоле("DS5722",  "N",  1, 0);    
    КонецЕсли;
И вот сам код:
Перем Mess;
Функция Догнать(Стр, Длина, Символ = " ")
    Пока СтрДлина(Стр) < Длина Цикл
        Стр = Символ + Стр;
    КонецЦикла;
    Возврат Стр;
КонецФункции
Функция ДогнатьПрав(Стр, Длина, Символ = " ")
    Пока СтрДлина(Стр) < Длина Цикл
        Стр =  Стр + Символ;
    КонецЦикла;
    Возврат Стр;
КонецФункции
Процедура Выполнить()
    // ---------------------------------------------------------------------------------------------------
    Mess = "Инициализация данных ...";
    Форма.Обновить();
    R = СоздатьОбъект("RainbowService");
    M = СоздатьОбъект("MetaDataWork");
    ТЗ0 = СоздатьОбъект("ТаблицаЗначений");  // сопоставление журналов
    ТЗ0.НоваяКолонка("IDDOCDEF");
    ТЗ0.НоваяКолонка("IDJOURNAL");
    ТЗ0.НоваяКолонка("NUMBERPERIOD");
    ТЗ0.НоваяКолонка("NUMBERTYPE");
    ТЗ0.НоваяКолонка("NUMBERLEN", "Число", 5);
    ТЗ1 = СоздатьОбъект("ТаблицаЗначений");  // сопоставление даты и времени
    ТЗ1.НоваяКолонка("IDDOC");
    ТЗ1.НоваяКолонка("DATE", "Дата", 8);
    ТЗ1.НоваяКолонка("TIME");
    ТЗ1.НоваяКолонка("STATUS","Число");  
    Если Конфа = 2 Тогда
        Для инд = 1 По Метаданные.Регистр() Цикл
            ТЗ1.НоваяКолонка("RF"+СокрЛП(M.GetMetaDataID(Метаданные.Регистр(инд))),"Число");
        КонецЦикла;    
    КонецЕсли;  
    ТЗ2 = СоздатьОбъект("ТаблицаЗначений");  // нумерация по периодам
    ТЗ2.НоваяКолонка("DNPREFIX", "Строка", 18);
    ТЗ2.НоваяКолонка("LASTNUMBER", "Число", 20);
    Ф = СоздатьОбъект("XBase");     // dh*.dbf
    Ф0 = СоздатьОбъект("XBase");    // 1sentry.dbf
    Ф1 = СоздатьОбъект("XBase");    // __temp.dbf (1sjourn.dbf)
    Ф2 = СоздатьОбъект("XBase");    // ra*.dbf
    // ---------------------------------------------------------------------------------------------------
    Для инд = 1 По Метаданные.Документ() Цикл
        ТЗ0.НоваяСтрока();
        ID10 = M.GetMetaDataID(Метаданные.Документ(инд));
        ТЗ0.IDDOCDEF = ВРег(СокрЛП(R.IntToBase(ID10, 36)));
        ТЗ0.NUMBERPERIOD = Метаданные.Документ(инд).ПериодичностьНомера;
        ТЗ0.NUMBERTYPE = Метаданные.Документ(инд).ТипНомера;
        ТЗ0.NUMBERLEN = Число(Метаданные.Документ(инд).ДлинаНомера);
        ID10 = 0;
        ТЗ0.IDJOURNAL = СокрЛП(0);
        Для инд1 = 1 По Метаданные.Журнал() Цикл
            Если Метаданные.Журнал(инд1).Представление() = 
            Метаданные.Документ(инд).Журнал.Представление() Тогда
                ID10 = M.GetMetaDataID(Метаданные.Журнал(инд1));
                ТЗ0.IDJOURNAL = ВРег(СокрЛП(R.IntToBase(ID10, 36)));
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    // ---------------------------------------------------------------------------------------------------
    Если Конфа = 2 Тогда
        //ТОРГОВЛЯ
        Mess = "Считываем данные о времени и дате документа из 1SCRDOC.dbf";
        Форма.Обновить();
        Ф0.ОткрытьФайл(КаталогИБ() + "1SCRDOC.dbf", КаталогИБ() + "1SCRDOC.cdx", 1);
        Ф0.Первая();
        Пока Ф0.ВКонце() = 0 Цикл
            стр = 0;
            Если ТЗ1.НайтиЗначение(СокрЛП(Ф0.CHILDID), стр, "IDDOC") = 0 Тогда
                ТЗ1.НоваяСтрока();
                ТЗ1.IDDOC = СокрЛП(Ф0.CHILDID);
                ТЗ1.DATE = Ф0.CHILDDATE;
                ТЗ1.TIME = Ф0.CHILDTIME;  
                ТЗ1.STATUS = 0;
            КонецЕсли;
            Ф0.Следующая();
        КонецЦикла;            
        
        //Считывем из регистров документы и понимаем что они проведены
        ТекФайл = ФС.НайтиПервыйФайл(КаталогИБ() + "ra*.dbf");
        Пока ПустоеЗначение(ТекФайл) = 0 Цикл  
            Форма.Обновить();
            Mess = "Считываем данные из "+ТекФайл;
            Ф2.ОткрытьФайл(КаталогИБ() + ТекФайл,, 1);
            Ф2.Первая();
            Пока Ф2.ВКонце() = 0 Цикл
                стр1 = 0;
                Если ТЗ1.НайтиЗначение(СокрЛП(Ф2.IDDOC), стр1, "IDDOC") = 1 Тогда
                    ТЗ1.УстановитьЗначение(стр1,"STATUS",1);   
                    ИДРегистра = СтрЗаменить(ТекФайл,"RA","");
                    ИДРегистра = СтрЗаменить(ИДРегистра,".DBF","");
                    ТЗ1.УстановитьЗначение(стр1,"RF"+ИДРегистра,1);   
                КонецЕсли;
                Ф2.Следующая();
            КонецЦикла;
            Ф2.ЗакрытьФайл();
            ТекФайл = ФС.НайтиСледующийФайл();
        КонецЦикла;
        
    ИначеЕсли Конфа = 1 Тогда    
        //БУХГЕЛТЕРИЯ
        Форма.Обновить();
        Mess = "Считываем данные о времени и дате документа из 1sentry.dbf";
        Ф0.ОткрытьФайл(КаталогИБ() + "1sentry.dbf", КаталогИБ() + "1sentry.cdx", 1);
        Ф0.ТекущийИндекс("DATETIME");
        Ф0.Первая();
        Пока Ф0.ВКонце() = 0 Цикл
            стр = 0;
            Если ТЗ1.НайтиЗначение(СокрЛП(Ф0.DOCID), стр, "IDDOC") = 0 Тогда
                ТЗ1.НоваяСтрока();
                ТЗ1.IDDOC = СокрЛП(Ф0.DOCID);
                ТЗ1.DATE = Ф0.DATE;
                ТЗ1.TIME = Ф0.TIME;     
                ТЗ1.STATUS = 0;
            КонецЕсли;
            Ф0.Следующая();
        КонецЦикла;
    КонецЕсли; 
    Сообщить("Удалось найти дату и время у "+ТЗ1.КоличествоСтрок()+" документов","!");
    // ---------------------------------------------------------------------------------------------------
    Mess = "Создаем структуру __temp.dbf ...";
    Форма.Обновить();
    Ф1.ДобавитьПоле("IDJOURNAL", "C",  4, 0);
    Ф1.ДобавитьПоле("IDDOC",     "C",  9, 0);
    Ф1.ДобавитьПоле("IDDOCDEF",  "C",  4, 0);
    Ф1.ДобавитьПоле("APPCODE",   "N",  3, 0);
    Ф1.ДобавитьПоле("DATE",      "D",  8, 0);
    Ф1.ДобавитьПоле("TIME",      "C",  6, 0);
    Ф1.ДобавитьПоле("DNPREFIX",  "C", 18, 0);
    Ф1.ДобавитьПоле("DOCNO",     "C", 10, 0);
    Ф1.ДобавитьПоле("CLOSED",    "N",  1, 0);
    Ф1.ДобавитьПоле("ISMARK",    "C",  1, 0);
    Ф1.ДобавитьПоле("ACTCNT",    "C",  6, 0);
    Ф1.ДобавитьПоле("VERSTAMP",  "C",  6, 0);
    Для инд = 1 По Метаданные.Регистр() Цикл
        Ф1.ДобавитьПоле("RF" + СокрЛП(M.GetMetaDataID(Метаданные.Регистр(инд))), 
        "N",  1, 0);
    КонецЦикла;    
    Если Конфа = 2 Тогда
        Ф1.ДобавитьПоле("SP74",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP798",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP4056",  "C",  9, 0);
        Ф1.ДобавитьПоле("SP5365",  "C",  9, 0);
        Ф1.ДобавитьПоле("DS1946",  "N",  1, 0);
        Ф1.ДобавитьПоле("DS4757",  "N",  1, 0);
        Ф1.ДобавитьПоле("DS5722",  "N",  1, 0);    
    КонецЕсли;
    
    Ф1.СоздатьФайл("__temp.dbf");
    // ---------------------------------------------------------------------------------------------------
    Mess = "Сохраняем структуру __temp.dbf ...";
    Форма.Обновить();
    ТекФайл = ФС.НайтиПервыйФайл(КаталогИБ() + "dh*.dbf");
    _ТекВрем = ТекущееВремя();
    _Час = Число(Сред(_ТекВрем,1,2));
    _Мин = Число(Сред(_ТекВрем,4,2));
    _Сек = Число(Сред(_ТекВрем,7,2));
    _ТекВрем = _Час * 3600 + _Мин * 60 + _Сек;
    Пока ПустоеЗначение(ТекФайл) = 0 Цикл  
        Форма.Обновить();
        Mess = "Считываем данные из "+ТекФайл;
        Ф.ОткрытьФайл(КаталогИБ() + ТекФайл,, 1);
        Ф.Первая();
        Пока Ф.ВКонце() = 0 Цикл
            стр1 = 0;    
            Проведен = 0;
            Если ТЗ1.НайтиЗначение(СокрЛП(Ф.IDDOC), стр1, "IDDOC") = 1 Тогда
                _Дата = ТЗ1.ПолучитьЗначение(стр1, "DATE");
                _Время = ТЗ1.ПолучитьЗначение(стр1, "TIME"); 
                Проведен = ТЗ1.ПолучитьЗначение(стр1, "STATUS");
            Иначе
                _Дата = РабочаяДата();
                _ТекВрем = _ТекВрем + 1;
                _Время = ВРег(СокрЛП(R.IntToBase(_ТекВрем * 10000, 36)));
                Сообщить("Не удалось найти дату и время для документа "+Ф.IDDOC+". У него будет дата "+_Дата+" и время "+_Время,"!!");
            КонецЕсли;
            Ф1.Добавить();
            Ф1.УстановитьЗначениеПоля("IDDOC", Догнать(Ф.IDDOC, 6));
            Ф1.УстановитьЗначениеПоля("DATE", _Дата);
            Ф1.УстановитьЗначениеПоля("TIME", _Время); 
            Ф1.УстановитьЗначениеПоля("CLOSED", Проведен); 
        
            Если Конфа = 2 Тогда
                Если стр1<>0 Тогда
                    Для инд = 1 По Метаданные.Регистр() Цикл
                        Ф1.УстановитьЗначениеПоля("RF" + СокрЛП(M.GetMetaDataID(Метаданные.Регистр(инд))), ТЗ1.ПолучитьЗначение(стр1,"RF" + СокрЛП(M.GetMetaDataID(Метаданные.Регистр(инд))))); 
                    КонецЦикла;    
                КонецЕсли;
            КонецЕсли;
            
            _IDDOCDEF = Врег(R.IntToBase(Число(Сред(ТекФайл, 3, СтрДлина(ТекФайл) - 
            6)), 36));
            Ф1.УстановитьЗначениеПоля("IDDOCDEF", Догнать(_IDDOCDEF, 4));
            стр0 = 0;
            Если ТЗ0.НайтиЗначение(СокрЛП(_IDDOCDEF), стр0, "IDDOCDEF") = 1 Тогда
                _DNPREFIX = Сред(ТекФайл, 3, СтрДлина(ТекФайл) - 6);
                Если СокрЛП(ТЗ0.ПолучитьЗначение(стр0, "NUMBERPERIOD")) = "Год" Тогда
                    _DNPREFIX = Догнать(_DNPREFIX + СокрЛП(ДатаГод(_Дата)), 14);
                ИначеЕсли СокрЛП(ТЗ0.ПолучитьЗначение(стр0, "NUMBERPERIOD")) = "Квартал" 
                Тогда
                    _DNPREFIX = Догнать(_DNPREFIX + СокрЛП(ДатаГод(_Дата)) + 
                    СокрЛП(ДатаМесяц(НачКвартала(_Дата))), 16);
                ИначеЕсли СокрЛП(ТЗ0.ПолучитьЗначение(стр0, "NUMBERPERIOD")) = "Месяц" 
                Тогда
                    _DNPREFIX = Догнать(_DNPREFIX + СокрЛП(ДатаГод(_Дата)) + 
                    СокрЛП(ДатаМесяц(_Дата)), 16);
                ИначеЕсли СокрЛП(ТЗ0.ПолучитьЗначение(стр0, "NUMBERPERIOD")) = "День" 
                Тогда
                    _DNPREFIX = Догнать(_DNPREFIX + СокрЛП(ДатаГод(_Дата)) + 
                    СокрЛП(ДатаМесяц(_Дата)) + СокрЛП(ДатаЧисло(_Дата)), 18);
                Иначе
                    _DNPREFIX = Догнать(_DNPREFIX, 10);
                КонецЕсли;
                Ф1.УстановитьЗначениеПоля("DNPREFIX", _DNPREFIX);
                стр2 = 0;
                Если ТЗ2.НайтиЗначение(ДогнатьПрав(_DNPREFIX, 18), стр2, "DNPREFIX") = 0 
                Тогда
                    ТЗ2.НоваяСтрока();
                    ТЗ2.DNPREFIX = _DNPREFIX;
                    ТЗ2.LASTNUMBER = 1;
                    стр2 = ТЗ2.КоличествоСтрок();
                Иначе
                    ТЗ2.УстановитьЗначение(стр2, "LASTNUMBER", ТЗ2.ПолучитьЗначение(стр2, 
                    "LASTNUMBER") + 1);
                КонецЕсли;
                Если ТЗ0.ПолучитьЗначение(стр0, "NUMBERTYPE") = "Текстовый" Тогда
                    Ф1.УстановитьЗначениеПоля("DOCNO", 
                    Догнать(СокрЛП(ТЗ2.ПолучитьЗначение(стр2, "LASTNUMBER")), 
                    ТЗ0.ПолучитьЗначение(стр0, "NUMBERLEN"), "0"));
                Иначе
                    Ф1.УстановитьЗначениеПоля("DOCNO", ТЗ2.ПолучитьЗначение(стр2, 
                    "LASTNUMBER"));
                КонецЕсли;
                Ф1.УстановитьЗначениеПоля("IDJOURNAL", 
                Догнать(ТЗ0.ПолучитьЗначение(стр0, "IDJOURNAL"), 4));
            КонецЕсли;
            Ф1.Записать();
            Ф.Следующая();
        КонецЦикла;
        Ф.ЗакрытьФайл();
        ТекФайл = ФС.НайтиСледующийФайл();
    КонецЦикла;
    Ф.ЗакрытьФайл();
    // ---------------------------------------------------------------------------------------------------
    Mess = "Закончили. Переименуйте __temp.dbf в 1SJOURNAL.DBF и замените !";
    Форма.Обновить();
КонецПроцедуры
Процедура ПриОткрытии()
    Mess = "Для начала восоздания 1SJOURNAL.DBF необходимо зайти в разделенном режиме !!!";
КонецПроцедуры
Попытка
    ЗагрузитьВнешнююКомпоненту("rainbow.dll");
Исключение
    Сообщить("Не удается загрузить внешнюю компоненту.","!");
    Сообщить("Проверьте расположение необходимых библиотек:
    |"+КаталогПрограммы()+"Rainbow.dll или "+КаталогИБ()+"Rainbow.dll
    |"+ФС.WindowsКаталог()+"system\mfc42.dll
    |"+ФС.WindowsКаталог()+"system\msvcrt.dll");
    Форма.Закрыть();
КонецПопытки;
                         
Конфа = 1;
                            Вступайте в нашу телеграмм-группу Инфостарт
