Востановление 1SJOURNAL.DBF для ТиС и Бухгалтерии Ключевые слова: 1SJOURNAL.DBF
И так начнем с того, что восстановление данных для ТиС не всегда сработает. Сработает 100% если все документы введены либо на основании либо являются основании т.к. все на это и строиться. Для Бухгалтерии все строиться на файле с проводками.
Все началось с того что клиент позвонил и сказал что база не запускается и пишет что 1SJOURNAL.DBF кердык. Конечно я попытался тестировать, выгружать и т.д. но не помогло. Войти пришлось выдумывать на пару с smaharbA.
И так создаем новый отчет. На кнопку сформировать вешаем функцию Выполнить() и добавляем 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;
|