Книга знаний

1С:Предприятие / Типовые конфигурации / Торговля и склад 7.7

Востановление 1SJOURNAL.DBF для ТиС и Бухгалтерии

Тут описан метод пересоздания 1SJOURNAL.DBF в случае его разрушения.Автор статьи: Kasperok | Редакторы:
Последняя редакция №2 от 27.12.07 | История
URL: http://kb.mista.ru/article.php?id=622

Ключевые слова: 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;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика