gifts2017

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

Опубликовал Артур Арабаджиян (kasperok) в раздел Программирование - Практика программирования

Тут описан метод пересоздания 1SJOURNAL.DBF в случае его разрушения.

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Артур Аюханов (artbear) 24.12.08 13:26
Где-то на этом сайте что-то подобное уже было вроде бы :)
kasperok; +1 Ответить
2. Артур Арабаджиян (kasperok) 24.12.08 14:04
Ну я поиском посмотрел и не чего не нашел.
3. LenaTorpeda 24.12.08 16:46
R = СоздатьОбъект("RainbowService");
{C:\DOCUMENTS AND SETTINGS\TORPEDA\РАБОЧИЙ СТОЛ\ВОССТАНОВЛЕНИЕ ЖУРНАЛА.ERT(39)}: Неудачная попытка создания объекта (RainbowService)
4. LenaTorpeda 24.12.08 16:48
У меня такой dll нет. Жаль .Штука наверное хорошая.
5. Руслан Харисов (fAngel) 24.12.08 18:31
6. LenaTorpeda 24.12.08 19:01
fAngel ,там вот это: Sorry, no matches were found containing rainbow.dll

7. Артур Арабаджиян (kasperok) 25.12.08 11:47
8. Piotr (Tolpinski) 25.12.08 13:22
Артур, ты в ворде Описьки проверяй :)
10. Андрей Поволокин (PovAndy) 07.10.13 16:10
Если честно, не совсем понял, как привязать обработку к 1С 7.7 УСН 1,3

Может кто-нибудь подсказать?

Пробовал использовать обработку http://1c.proclub.ru/modules/mydownloads/personal.php?lid=439&cid=76 , она всё создаёт, но в резуйльтате файл журнала система распознаёт как битый "Таблица - 1SJOURN. Длина записи не соотвествует ожидаемой
Проверка физической целостности таблиц ИБ. Неисправимая ошибка."
11. Епрст (Ёпрст) 07.10.13 18:28
Дык откройте его любым дбф редактором и посмотрите что унутри..
Тем более, все поделки по восстановлению 1сджоурн не усё восстанавливають.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа