| 
    
        
     
     | 
    
    
  | 
v7: Самописное восстановление ГП | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        never_sleep    
     04.06.14 
            ✎
    07:21 
 | 
         
        Господа! )
 
        Так как штатная восстановлялка ГП зарыта в глубинах 1С, и поправить её возможности не существует, а поправить нужно, было принято решение писать свою обработку с блекджеком и путанами. Но, чтобы не наломать дров, хотелось бы прояснить сразу несколько важных моментов. Правильно ли я понимаю, что весь смысл восстановления ГП в простом последовательном перепроведении всех документов входящих в данную последовательность с ГП по нужную дату? Т.е. самый простой вариант такой восстановлялки основной последовательности что-то вроде этого: ДокГП = СоздатьОбъект("Документ"); ДокГП = Последовательность.Основная.ПолучитьДокумент(); Пока ДокГП.ПолучитьДокумент()=1 Цикл Если ДокГП.Проведен()=1 Тогда ДокГП.Провести(); КонецЕсли; КонецЦикла; Последовательность.Основная.Установить(ДокГП); Понимаю, что не все так просто. Поэтому прошу помощи, подскажите, что важного упустил.  | 
|||
| 
    1
    
        dk    
     04.06.14 
            ✎
    08:04 
 | 
         
        Последовательность.Основная.Установить(ДокГП);
 
        это лишнее - ГП сама переносится автоматом, если ты пропуски не делаешь если надо быстро ГП восстанавливать, то нужно еще с перенососм ТА заморочиться --- поищи готовые восстановлялки - тема не нова мягко говоря  | 
|||
| 
    2
    
        Тюря    
     04.06.14 
            ✎
    08:38 
 | 
         
        Написанное 100 лет назад, не монопольное восстановление.
 
        Перем ДатаПослед; //******************************************* Процедура Сформировать() ДатаПослед=Последовательность.ОсновнаяПоследовательность.ПолучитьДату(); ДатаАктуал=ПолучитьДатуТА(); Док=СоздатьОбъект("Документ"); //Док.УстановитьФильтр(1,0,,2); Док.ВыбратьДокументы(ДатаПослед,РабочаяДата()); КолДокВТранз=0; НачатьТранзакцию(); Пока Док.ПолучитьДокумент()=1 Цикл Если Док.Проведен()=0 Тогда Продолжить; КонецЕсли; КолДокВТранз=КолДокВТранз+1; Если Последовательность.ОсновнаяПоследовательность.ПринадлежитПоследовательности(Док.Вид())=1 Тогда Сообщить(Строка(Док.ТекущийДокумент())); // УстановитьТаНа(Док.ТекущийДокумент()); Если Док.Провести()<>1 Тогда Прервать; КонецЕсли; Последовательность.ОсновнаяПоследовательность.Установить(Док.ТекущийДокумент()); Если КолДокВТранз>=КолДок Тогда ЗафиксироватьТранзакцию(); КолДокВТранз=0; НачатьТранзакцию(); Конецесли; КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); КонецПроцедуры КолДок=10; ДатаПослед=Последовательность.ОсновнаяПоследовательность.ПолучитьДату(); НеПроверятьДатуДоговора=1;  | 
|||
| 
    3
    
        Тюря    
     04.06.14 
            ✎
    08:41 
 | 
         
        Монопольное 
 
        Перем ДатаПослед; //******************************************* Процедура Сформировать() ДатаПослед=Последовательность.ОсновнаяПоследовательность.ПолучитьДату(); ДатаАктуал=ПолучитьДатуТА(); Док=СоздатьОбъект("Документ"); //Док.УстановитьФильтр(1,0,,2); Док.ВыбратьДокументы(ДатаПослед,РабочаяДата()); КолДокВТранз=0; НачатьТранзакцию(); Пока Док.ПолучитьДокумент()=1 Цикл Если Док.Проведен()=0 Тогда Продолжить; КонецЕсли; КолДокВТранз=КолДокВТранз+1; Если Последовательность.ОсновнаяПоследовательность.ПринадлежитПоследовательности(Док.Вид())=1 Тогда Сообщить(Строка(Док.ТекущийДокумент())); УстановитьТаНа(Док.ТекущийДокумент()); Если Док.Провести()<>1 Тогда Прервать; КонецЕсли; Последовательность.ОсновнаяПоследовательность.Установить(Док.ТекущийДокумент()); Если КолДокВТранз>=КолДок Тогда ЗафиксироватьТранзакцию(); КолДокВТранз=0; НачатьТранзакцию(); Конецесли; КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); КонецПроцедуры КолДок=100; ДатаПослед=Последовательность.ОсновнаяПоследовательность.ПолучитьДату();  | 
|||
| 
    4
    
        peal    
     04.06.14 
            ✎
    08:46 
 | 
         
        Еще можно заморочиться на обработку ожидания вместо цикла и запускать во время работы остальных пользователей, медленно но верно за пару недель обычно пару лет восстановить     
         | 
|||
| 
    5
    
        varelchik    
     04.06.14 
            ✎
    10:32 
 | 
         
        Держи.
 
        Процедура Выполнить() //СкладыСвоб=0; //глСкладыПрихода=0; //глЗапретМаршЛисты=0; //ОбработкаОжидания("ОбработкиОжиданияДляВыхода",0); Счетчик=20; Блокировано=1; Для н=1 По Счетчик Цикл глПауза(1); ФайлБлокировкиЦН=СоздатьОбъект("BinaryData"); ИмяФайлБлокировкиЦН=КаталогИБ()+"lock.dat"; Стат=ФайлБлокировкиЦН.ПодключитьсяКФайлу(ИмяФайлБлокировкиЦН,0); Если Стат=1 Тогда Блокировано=0; Прервать; КонецЕсли; КонецЦикла; Если Блокировано=1 Тогда Возврат; КонецЕсли; ЗаписьЖурналаРегистрации("Начало "+ТекущееВремя()); глЗапросСоединениеВыход=0; Запрос=глСоединение(); УсловиеПоследовательностей=""; ТекстПоследовательностей=фПоследовательности(УсловиеПоследовательностей); Если ТекстПоследовательностей="" Тогда Возврат; КонецЕсли; ТексГраницы=" |select |j.date_time_iddoc iddoc, |j.iddoc [Док $Документ], |j.iddocdef Док_вид |from _1sjourn j (nolock) |WHERE left(j.date_time_iddoc,14) in |( |select |left(min(DATE_TIME_DOCID),14) |from _1SSTREAM (nolock) |WHERE id IN ("+ТекстПоследовательностей+") |)"; Структура=Запрос.ВыполнитьСкалярный(ТексГраницы); ИДД=Структура.Получить(1); НачПозиция=Структура.Получить(2); //Сообщить(ИДД); //Сообщить(НачПозиция); //Сообщить(Структура.Количество()); НачПозиция=""; //Возврат; //Сообщить(НачПозиция); //Возврат; Время=""; Если ТипЗначенияСтр(НачПозиция)="Документ" Тогда Запрос.УстановитьТекстовыйПараметр("НачДата",СформироватьПозициюДокумента(НачПозиция,0)); Иначе ч=0;м=0;с=0; ДатаПосл=Последовательность.ПолучитьАтрибут("ОсновнаяПоследовательность").ПолучитьДату(); Последовательность.ПолучитьАтрибут("ОсновнаяПоследовательность").ПолучитьВремя(ч,м,с); ВремяПосл=(ч*3600+м*60+с)*10000; Время=_IdToStr(ВремяПосл); Запрос.УстановитьТекстовыйПараметр("НачДата",Формат(ДатаПосл,"Д ГГГГММДД")+Время); КонецЕсли; Если фПозиция=1 Тогда Запрос.УстановитьТекстовыйПараметр("КонДата",ПолучитьДатуТА()); Иначе Запрос.УстановитьТекстовыйПараметр("КонДата",ДатаВосстановления); КонецЕсли; Текст=" |SET NOCOUNT ON |select |j.iddoc [Док $Документ], |j.iddocdef Док_вид |from _1SJourn j (NOLOCK) |WHERE |j.closed &1=1 |--and j.ismark=0 |and j.date_time_iddoc between :НачДата AND :КонДата~ |and ("+УсловиеПоследовательностей+") |ORDER BY |j.date_time_iddoc |"; ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ=Запрос.ВыполнитьИнструкцию(Текст); //ТЗ.ВыбратьСтроку(); //Возврат; Всего=ТЗ.КоличествоСтрок(); Счетчик=1; Тран=0; Если Регистрировать=0 Тогда Текст=" |update Служебная |set value=1 |WHERE |id='lock_mod' |"; Запрос.ВыполнитьСкалярный(Текст); КонецЕсли; Если КвоВТранзакции>0 Тогда НачатьТранзакцию(); КонецЕсли; глГрупповаяОбработка=1; глПроведение=1; НеРегистрироватьИзмененияМОД=1; ТЗ.ВыбратьСтроки(); лДок=СоздатьОбъект("Документ"); НачатьЛогирование(); Путь=глВернутьПараметрСтрПоКоду("ПутьКиев"); Если ПустоеЗначение(Путь)=0 Тогда УдЗапрос=глСоединение("SQL",СокрЛП(Путь)); Иначе УдЗапрос=глСоединение(); КонецЕсли; //Стат=УдЗапрос.Подготовить("insert into НеВыгружатьМОД (id,dataprov) values(?,?)"); //Если Стат=0 Тогда // Сообщить(УдЗапрос.ПолучитьОписаниеОшибки()); // Возврат; //КонецЕсли; //УдЗапрос.ДобПараметр(1,14,13,0); //УдЗапрос.ДобПараметр(1,8,0,0); Пока ТЗ.ПолучитьСтроку() = 1 Цикл лДок.НайтиДокумент(ТЗ.Док); Если фВыводитьИнформацию=1 Тогда Если ПустоеЗначение(Форма.Параметр)=1 Тогда Сообщить("Проведение :"+Строка(лДок)+" "+лДок.ПолучитьВремя()); КонецЕсли; ЗаписьЖурналаРегистрации("Проведение :"+Строка(лДок)+" "+лДок.ПолучитьВремя(),,,лДок.ТекущийДокумент()); КонецЕсли; Инфо="Обработано "+Строка(Окр(Счетчик/Всего*100,2))+" % |Транзакция "+Строка(Тран); Если лДок.Провести()=0 Тогда глПроведение=0; Если КвоВТранзакции>0 Тогда НеРегистрироватьИзмененияМОД=0; ОтменитьТранзакцию(); КонецЕсли; ФайлБлокировкиЦН.Закрыть(); Возврат; КонецЕсли; //УдЗапрос.УстПараметр(1,"'"+глМетаДата.ЗначениеВДлиннуюСтрокуБД(лДок.ТекущийДокумент())+"'"); //УдЗапрос.УстПараметр(2,ТекущаяДата()); УдЗапрос.УстановитьТекстовыйПараметр("ВыбДок",лДок.ТекущийДокумент()); УдЗапрос.УстановитьТекстовыйПараметр("ВыбДата",ТекущаяДата()); УдЗапрос.ВыполнитьСкалярный("insert into НеВыгружатьМОД (id,dataprov) values(:ВыбДок~,cast(:ВыбДата as smalldatetime))"); Если КвоВТранзакции>0 Тогда Если Счетчик%КвоВТранзакции=0 Тогда ЗафиксироватьТранзакцию(); Тран=Тран+1; лДок=0; глПауза(5); //База=СоздатьОбъект("ODBCDataBase"); //База.ReconnectNative(); лДок=СоздатьОбъект("Документ"); НачатьТранзакцию(); КонецЕсли; КонецЕсли; Счетчик=Счетчик+1; Форма.Обновить(); КонецЦикла; Если ПустоеЗначение(Форма.Параметр)=1 Тогда Предупреждение("Восстановление завершено!",20); КонецЕсли; ЗаписьЖурналаРегистрации("Восстановление завершено "+ТекущееВремя()); Если КвоВТранзакции>0 Тогда ЗафиксироватьТранзакцию(); КонецЕсли; ФайлБлокировкиЦН.Закрыть(); Текст=" |update Служебная |set value=0 |WHERE |id='lock_mod' |"; Запрос.ВыполнитьСкалярный(Текст); глПроведение=0; ЗаписьЖурналаРегистрации("Окончание "+ТекущееВремя()); ЗакончитьЛогирование(); Если ПустоеЗначение(Форма.Параметр)=0 Тогда глВыходВопрос=1; ЗавершитьРаботуСистемы(0); КонецЕсли; НеРегистрироватьИзмененияМОД=0; КонецПроцедуры // Выполнить  | 
|||
| 
    6
    
        Тюря    
     04.06.14 
            ✎
    11:00 
 | 
         
        (5) силен )))
 
        для какой конфы ?  | 
|||
| 
    7
    
        varelchik    
     04.06.14 
            ✎
    13:13 
 | 
         
        (6) для любой.
 
        главное шоб была как минимум база SQL и 1С++. этого фатит.  | 
|||
| 
    8
    
        varelchik    
     04.06.14 
            ✎
    13:14 
 | 
         
        (6) если интересно стучись в аську.     
         | 
|||
| 
    9
    
        Ёпрст    
     гуру 
    04.06.14 
            ✎
    13:18 
 | 
         
        мод есть не у всех, смысл в файле "для блокировки" не ясен     
         | 
|||
| 
    10
    
        torgm    
     04.06.14 
            ✎
    14:19 
 | 
         
        (3) Писал подобное, + добавочный вариант не прерывать перепроведение при ошибках а продолжать, чтобы разом потом проанализировать все косяки , чохом исправить и заново перепровести...     
         | 
|||
| 
    11
    
        varelchik    
     04.06.14 
            ✎
    14:39 
 | 
         
        (9) ще какой смысл.
 
        можно восстанавливать во время работы, но блокируя определенные обработки которые занимаються тежеловесными весчами. ну дык от туда можно много чего по убирать. это я просто все текст выложил, влом было чистить.  | 
|||
| 
    12
    
        varelchik    
     04.06.14 
            ✎
    14:39 
 | 
         
        я ж ее по мере надобности допиливал.     
         | 
|||
| 
    13
    
        Ёпрст    
     гуру 
    04.06.14 
            ✎
    14:45 
 | 
         
        если есть мод, всё делается проще - перепровод в копии и потом заливка последних изменений туда ну и замена баз местами. Можно хоть года перепроводить     
         | 
|||
| 
    14
    
        Тюря    
     04.06.14 
            ✎
    14:48 
 | 
         
        (13) ++++
 
        зачем канителиться с таким кодом. С УРИБ можно и с простым кодом или даже типовым.  | 
|||
| 
    15
    
        varelchik    
     04.06.14 
            ✎
    15:22 
 | 
         
        (14)(13) не нравится код?
 
        ну так каждый под себя делает. а предложил, оскорблять то зачем?  | 
|||
| 
    16
    
        varelchik    
     04.06.14 
            ✎
    15:23 
 | 
         
        (13) а видал загрузку МОД-а?
 
        нуну затолкай год я посмотрю скоко времений уйдет.  | 
|||
| 
    17
    
        Тюря    
     04.06.14 
            ✎
    15:35 
 | 
         
        (15) я не хотел обидеть, извиняюсь     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |