И так начнем с того, что восстановление данных для ТиС не всегда сработает. Сработает 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;