Обрезание или свертка базы (оперативный учет)

Опубликовал ahmet в раздел Обработки - Свертка базы

Документ ОБРЕЗКА. Формирует при проведении фиксацию остатков на определенную дату по всем регистрам оперативного учета. Универсален - конфигурация может быть любой (стандартной или самодельной). Обрезание по полной программе - база 10 гиг. ТОРГОВЛИ обрезается за 15 мин.

Формирует при проведении фиксацию остатков на определенную дату по всем регистрам оперативного учета.
Универсален - конфигурация может быть любой (стандартной или самодельной).
Очень быстр - обрабатывает 10 гиг. базу за 5 мин.

Вообщем сам режу и другим обрезаю...

Обрезание по полной программе
Проводится только один раз - последний
Все документы до этого необходимо удалить!!!
Проведение документа необратимо
- поэтому все пробуем на копии
- в отчетах могут появиться надписи типа
страшного в этом нет
Наверное есть и недостатки

22.11.2011 г.

Порядок обрезки

- Запускаем обработку

- У меня база 20 гиг обработка отработала 30 мин. Сервер 4 ядра 8 гиг

- Далее переносим ТА на самый первый документ - Переносилось окло 20 мин

- Удаляем все доки до дакумента Обрезки - заняло 4 часа.

- Переносим ТА на документ ОБРЕЗКА. -  по времени еще 2-3 часа...

Вот и все.

 

Этот код полностью устраняет ошибку битых ссылок, но он заточен под мою конфигурацию.
 
[CODE]   //Расчитываем регистры
    СписокРег = СоздатьОбъект("СписокЗначений");
    СписокРег.ИзСтрокиСРазделителями(СокрЛП(РегистрОстатка));
    Если Проведен() = 0 Тогда
        ВремРег=СоздатьОбъект("Регистры");
        //Пробезаем по всем регистрам, которые отмечаны галочкой
        Для й=1 по СписокРег.РазмерСписка() Цикл
            РегОст = Строка(СокрЛП(СписокРег.ПолучитьЗначение(й,"")));    
            Рег=ВремРег.ПолучитьАтрибут(РегОст);
           // Рег=СоздатьОбъект("Регистр."+РегОст);
            Рег.Временныйрасчет(1);
            // РассчитатьРегистрыНа(ДатаДок);
            ВремРег.РассчитатьРегистрыНа(ТекущийДокумент());           
            //Присваеваем значений переменным
            РегистрПроведения = Метаданные.Регистр(РегОст);
            ГлавРег = Регистр.ПолучитьАтрибут(РегОст);
            КолИзмерений = РегистрПроведения.Измерение();
            КолРесурсов = РегистрПроведения.Ресурс();
            КолРеквизитов = РегистрПроведения.Реквизит();
            ТЗ = СоздатьОбъект("ТаблицаЗначений");
   Сообщить("регистр "+РегОст+" измерений "+КолИзмерений+" ресурсов "+КолРесурсов+" реквизитов "+КолРеквизитов);
            Рег.ВыгрузитьИтоги(ТЗ);
   КолСтрок = ТЗ.КоличествоСтрок();
          
   Если  КолСтрок = 0 Тогда
    Сообщить("регистр "+РегОст+" нет данных по движению - ПРОПУСКАЕМ..." );
    Продолжить;
   КонецЕсли;
   // взаиморасчеты свернем чего копить
   Если РегОст="Взаиморасчеты" Тогда
    Сообщить(""+ТекущееВремя()+" свертка взаиморасчетов "+КолСтрок);
    ТЗ.Свернуть("Клиент,Фирма","Сумма");
    ТЗ.ВставитьКолонку("КредДокумент",3,"Документ");
    КолСтрок = ТЗ.КоличествоСтрок();
   КонецЕсли;
   Если РегОст="ТП" Тогда
    Сообщить(""+ТекущееВремя()+" свертка долгов ТП "+КолСтрок);
    ТЗ.Свернуть("ТП,Клиент","Сумма");
    ТЗ.ВставитьКолонку("КредДокумент",2,"Документ");
    КолСтрок = ТЗ.КоличествоСтрок();
   КонецЕсли;
   Если РегОст="ОстаткиТоваров" Тогда
    Сообщить(""+ТекущееВремя()+" ДО свертка остатков товаров "+КолСтрок);
    ТЗ.Свернуть("Товар,Склад,Фирма","Остаток,Сумма");
    //ТЗ.ВставитьКолонку("КредДокумент",2,"Документ");
    КолСтрок = ТЗ.КоличествоСтрок();
    Сообщить(""+ТекущееВремя()+" после свертка остатков товаров "+КолСтрок);
   КонецЕсли;
   Сообщить(""+ТекущееВремя()+" начинаем обработку регистра "+РегОст+" всего  строк "+КолСтрок);
   //
   Если ИдетТест=1 Тогда
    ТЗ.ВыбратьСтроку();
    Продолжить;
   КонецЕсли;
   
   //
          // 
            //Делаем движение по этим остаткам, тем самым делаем полную копиб регистров на данное число
            Для А=1 по ТЗ.КоличествоСтрок() Цикл
                Состояние("Обрабатывается "+Строка(А)+" из "+Строка(КолСтрок));
                Для А1=1 по КолИзмерений Цикл
                    Рег=РегистрПроведения.Измерение(А1);
     Значение = ТЗ.ПолучитьЗначение(А,А1);
     Если ТипЗначения(Значение)=12 Тогда
      // документ всё равно будет удален подменяем текущим
      Значение  = ТекущийДокумент();
     КонецЕсли;
     
                    ГлавРЕГ.УстановитьАтрибут(Рег.Идентификатор,ТЗ.ПолучитьЗначение(А,А1));
                КонецЦикла;  
                Для А2=1 по КолРесурсов Цикл
                    Рег=РегистрПроведения.Ресурс(А2);
                    ГлавРЕГ.УстановитьАтрибут(Рег.Идентификатор,ТЗ.ПолучитьЗначение(А,А2+КолИзмерений));
    КонецЦикла;
    
                ГлавРЕГ.ДвижениеПриходВыполнить();
            КонецЦикла;
  КонецЦикла;
  Сообщить(""+ТекущееВремя()+" завершено");
    Иначе
        Предупреждение("Данный документ нельзя перепровести !!!");
        СтатусВозврата(0);
    КонецЕсли;[/CODE]
Наименование
svertka_MD.rar
Бесплатно

См. также

Безопасное копирование файловых баз 1С
Мастер печатных форм v 2.2
PowerTools
Настраиваемый управленческий баланс V3.16
Изучение 1С Управление торговлей OnLine
Автоматизация службы доставки - Удобное решение: Служба доставки + Фастфуд 3.0 (1С Доставка)
TurboConf - турбина для Конфигуратора
Респект: Алкогольная декларация - Редактор XML файлов для сдачи алкогольной декларации (Формы 11 и 12)
Дайджест нововведений "1С форева!"
Выгрузка данных из Управления торговлей 10.3 в Бухгалтерию предприятия, ред. 3.0 (Версия 1.8.3)
Управление ИТ отделом 8, редакция 3.0
Универсальный Управленческий Баланс для УТ 10.3, УПП, КА (и др., где исп. Универсальный отчет)

Комментарии

1. Сhe Burashka 15.08.2007 13:54
> в отчетах могут появиться надписи типа <объект не найден>
страшного в этом нет
Есть! Как пример: обрезал базу. После обрезки есть документ "возврат от покупателя", который ссылался документом-основанием на уже удаленную расходную накладную. Подмену ссылок удаленных объектов ты не проводишь. В результате будешь иметь возратную партию по нулевой себестоимости = косяк в учете.
..
надо четко понимать, что делая "быстрые" обрезки базы - следует ясно представлять себе последствия таких обрезок в ОБЩИХ СЛУЧАЯХ. А не только в своем частном. Ты, судя по всему, последствия представляешь не совсем верно. Так что - выкладывая такие "универсальные" док - надо писать достаточно четко область применимости, возможные проблемы и прочее - чего в этом случае не сделано. Фраза "Наверное есть и недостатки" - таковым описанием не считается - это есть у всех программм.
По хорошему, конечно, надо вкатать минус именно за пункт
"в отчетах могут появиться надписи типа <объект не найден>
страшного в этом нет" - особенно если учесть что ПустоеЗначение(СсылканаДокКоторыйОбъектНенайден)=0 - что может привести к тяжелым поискам глюкавости алгоритмов...
Ответили: (22)
# Ответить
2. Страпот 15.08.2007 14:06
Просто -1.
Это даже не плохо, это вредно. Образец того как не надо делать.
# Ответить
3. ahmet 15.08.2007 14:39
Интересно в чем это не образец!!.
# Ответить
4. desty 15.08.2007 14:51
Мечта о том чтобы свернуть базу БЫСТРО рано или поздно посещает всех.
НО:
1. в релятивистских базах данных существует такое понятие как контроль ссылочной целостности.
2. появление надписи <объект не найден> - на самом деле страшно
3. чисто в прикладном смысле - в вашем случае 100% нарушится иерархия документов = например Счет в декабре - отгрузки в январе
4. как говорил один умный человек = "А Вы не подумали почему в 1С типовых сделано НЕ ТАК"
# Ответить
5. desty 15.08.2007 14:53
в качестве примера:
1. советую посмотреть штатную свертку 1С Торговли
2. Разработку Вадимко http://infostart.ru/projects/1021/
# Ответить
6. desty 15.08.2007 14:54
а также небеизвестный RL
http://infostart.ru/projects/66/
# Ответить
7. ahmet 15.08.2007 14:57
Вообщем судя по всему не обработка а ...
Тем не менее есть наверное живой интерес к проблеме и всегда существует возможность доработать. И если учесть мнения высказавшихся, то есть рациональное зерно. И если приложить усилия..
А давайте вместе доведем её до ума. А интересно узнать мнение по поводу, платной обрезки.
- И на посошок
Ну не у всех такие гигантские проблемы... Есть и те кому обработка поможет.
Всем спасибо!!!
Ответили: (23)
# Ответить
8. Страпот 15.08.2007 15:03
>- в отчетах могут появиться надписи типа <объект не найден>
>страшного в этом нет
Страшное в этом есть :). За одну эту фразу надо -1.

Я думал документ сам удаляет все документы до свертки и порождает "надписи типа <объект не найден>". Ан нет, это предлагается сделать вручную.
Явная недоработка. Правда если убрать эту недоработку, то вся "Очеь быстр - обрабатывает 10 гиг. базу за 5 мин. " накрывается медным тазом.
А без этой обработки документ просто неработоспособен, потому как приводи просто к задвоению всех остатков и все.

>Интересно в чем это не образец!!.
Я разве сказал что это не образец?! Нет я сказал что это образец :).
Образец потому как очень неграмотно сделано.
Начиная с хранения списка регистров в виде строки в шапке документа. Кончая отсутствием процедуры удаления документов до момента свертки.
# Ответить
9. ahmet 15.08.2007 15:16
Так мне застрелиться или как...
# Ответить
10. desty 15.08.2007 15:18
;-)
ну считай это публичной поркой
# Ответить
11. Страпот 15.08.2007 15:21
>Так мне застрелиться или как...
Ну зачем так круто :).
Просто убрать слово из описания:
>Универсален - конфигурация может быть любой (стандартной или самодельной).
>Очеь быстр - обрабатывает 10 гиг. базу за 5 мин.
>- в отчетах могут появиться надписи типа <объект не найден>
>страшного в этом нет

Собственно реакция на эти слова, а не на обработку. Сама обработка не заслуживает обсуждения :).
# Ответить
12. ahmet 15.08.2007 16:11
Ну и...
РосГосСтрах??????
Из песни слов не выкинуть. Добивайте до конца. Только по существу, желательно с уазанием строки дефекта и найденным решением...

НО согласны что обработка УНИВЕРСАЛЬНА А? +
А работает она - быстро??? +

Ну есть глюк, так мы его сообча и грохнем...
А потом ВАм всем памятник при жизни, а мне..? Мне бы день дожить, да ночь продержаться.
# Ответить
13. ahmet 15.08.2007 16:13
И потом в 10 гигаг удаление документов с проверкой целостности.. Кто пробовал откликнись
# Ответить
14. Страпот 15.08.2007 16:22
>Ну есть глюк, так мы его сообча и грохнем...
Глюк в самом подходе и плохом знании матчасти.
В общем РТФМ.

ЗЫ
Ну desty тебе же все разжевал и ссылки дал.
Ну може не совсем разжевал, но направление указал :).
Рой в сторону Яндекса, и скармливай ему все что написал desty.
# Ответить
15. ahmet 15.08.2007 17:27
Ну судя по комментариям хаять мастера, да и в Яндекс могут послать. А подсказать или помочь там...
для Страпот
А в подходе к решению никакого глюка нет. С матчастью тоже разберемся не боги горшки обжигают.
# Ответить
16. Вадимко 12.10.2007 01:29
Странно, у меня запрос в QA выполнялся полчаса на 10 Гигах
Это развот что ли?
"Все документы до этого необходимо удалить!!!" - а что делает выложенная свертка?
# Ответить
17. serguson 05.05.2009 06:28
Стандартная свертка предпринимателя думала над базой 6 гиг больше недели, после чего счастливо загнулась. Вашим документом свернулась за 4 часа.
Пусть не за 5 минут - все равно плюс.
# Ответить
18. maos 13.08.2009 14:01
Как раз то, что я искал
По поводу <объект не найден> - снова, как раз то что нужно
Мне необходимо было удалить всё-всё кроме остатков, другие обработки оставляют документы по ссылкам, а они мне тоже не нужны.
Большое спасибо!!!
# Ответить
19. Svetos 14.04.2010 08:31
А как ей установить? Я объединила конфигурацию, закинула компоненту DD в папку с базой, но теперь мой предприниматель стал называться сверткой 1.0 СКЛ и воще не запускается?
# Ответить
20. ahmet 14.04.2010 10:15
Думаю что Вам лучше пригласить специалиста!
# Ответить
21. yuraos 22.11.2011 06:56
Сhe Burashka пишет:
> в отчетах могут появиться надписи типа <объект не найден>
страшного в этом нет
Есть! Как пример: обрезал базу. После обрезки есть документ "возврат от покупателя", который ссылался документом-основанием на уже удаленную расходную накладную. Подмену ссылок удаленных объектов ты не проводишь. В результате будешь иметь возратную партию по нулевой себестоимости = косяк в учете.
..
надо четко понимать, что делая "быстрые" обрезки базы - следует ясно представлять себе последствия таких обрезок в ОБЩИХ СЛУЧАЯХ. А не только в своем частном. Ты, судя по всему, последствия представляешь не совсем верно. Так что - выкладывая такие "универсальные" док - надо писать достаточно четко область применимости, возможные проблемы и прочее - чего в этом случае не сделано. Фраза "Наверное есть и недостатки" - таковым описанием не считается - это есть у всех программм.
По хорошему, конечно, надо вкатать минус именно за пункт
"в отчетах могут появиться надписи типа <объект не найден>
страшного в этом нет" - особенно если учесть что ПустоеЗначение(СсылканаДокКоторыйОбъектНенайден)=0 - что может привести к тяжелым поискам глюкавости алгоритмов...

полностью согласен с Сhe Burashka!
<объект не найден> - это другими словами "битая ссылка"... и это не есть хорошо.
Это есть скорее плохо.
Для этого в конфигураторе есть тестирование-исправлении! :)))))
# Ответить
22. ahmet 22.11.2011 08:27
имеющий руки да сотворит лучшее!
Вот вариант проц. для рукасто головастых - ну а остальные... могут купить подобное здесь есть что то продажное.

Этот код полностью устраняет ошибку битых ссылок, но он заточен под мою конфигурацию.

   //Расчитываем регистры
    СписокРег = СоздатьОбъект("СписокЗначений");
    СписокРег.ИзСтрокиСРазделителями(СокрЛП(РегистрОстатка));
    Если Проведен() = 0 Тогда
        ВремРег=СоздатьОбъект("Регистры");
        //Пробезаем по всем регистрам, которые отмечаны галочкой
        Для й=1 по СписокРег.РазмерСписка() Цикл
            РегОст = Строка(СокрЛП(СписокРег.ПолучитьЗначение(й,"")));     
            Рег=ВремРег.ПолучитьАтрибут(РегОст);
           // Рег=СоздатьОбъект("Регистр."+РегОст);
            Рег.Временныйрасчет(1);
            // РассчитатьРегистрыНа(ДатаДок);
            ВремРег.РассчитатьРегистрыНа(ТекущийДокумент());            
            //Присваеваем значений переменным
            РегистрПроведения = Метаданные.Регистр(РегОст);
            ГлавРег = Регистр.ПолучитьАтрибут(РегОст);
            КолИзмерений = РегистрПроведения.Измерение();
            КолРесурсов = РегистрПроведения.Ресурс();
            КолРеквизитов = РегистрПроведения.Реквизит();
            ТЗ = СоздатьОбъект("ТаблицаЗначений");
			Сообщить("регистр "+РегОст+" измерений "+КолИзмерений+" ресурсов "+КолРесурсов+" реквизитов "+КолРеквизитов);
            Рег.ВыгрузитьИтоги(ТЗ);
			КолСтрок = ТЗ.КоличествоСтрок();
           
			Если  КолСтрок = 0 Тогда
				Сообщить("регистр "+РегОст+" нет данных по движению - ПРОПУСКАЕМ..." );
				Продолжить;
			КонецЕсли; 
			// взаиморасчеты свернем чего копить
			Если РегОст="Взаиморасчеты" Тогда
				Сообщить(""+ТекущееВремя()+" свертка взаиморасчетов "+КолСтрок);
				ТЗ.Свернуть("Клиент,Фирма","Сумма");
				ТЗ.ВставитьКолонку("КредДокумент",3,"Документ");
				КолСтрок = ТЗ.КоличествоСтрок();
			КонецЕсли;
			Если РегОст="ТП" Тогда
				Сообщить(""+ТекущееВремя()+" свертка долгов ТП "+КолСтрок);
				ТЗ.Свернуть("ТП,Клиент","Сумма");
				ТЗ.ВставитьКолонку("КредДокумент",2,"Документ");
				КолСтрок = ТЗ.КоличествоСтрок();
			КонецЕсли;
			Если РегОст="ОстаткиТоваров" Тогда
				Сообщить(""+ТекущееВремя()+" ДО свертка остатков товаров "+КолСтрок);
				ТЗ.Свернуть("Товар,Склад,Фирма","Остаток,Сумма");
				//ТЗ.ВставитьКолонку("КредДокумент",2,"Документ");
				КолСтрок = ТЗ.КоличествоСтрок();
				Сообщить(""+ТекущееВремя()+" после свертка остатков товаров "+КолСтрок);
			КонецЕсли;
			Сообщить(""+ТекущееВремя()+" начинаем обработку регистра "+РегОст+" всего  строк "+КолСтрок);
			//
			Если ИдетТест=1 Тогда
				ТЗ.ВыбратьСтроку();
				Продолжить;
			КонецЕсли;
			
			//
          //  
            //Делаем движение по этим остаткам, тем самым делаем полную копиб регистров на данное число
            Для А=1 по ТЗ.КоличествоСтрок() Цикл
                Состояние("Обрабатывается "+Строка(А)+" из "+Строка(КолСтрок));
                Для А1=1 по КолИзмерений Цикл
                    Рег=РегистрПроведения.Измерение(А1);
					Значение = ТЗ.ПолучитьЗначение(А,А1);
					Если ТипЗначения(Значение)=12 Тогда
						// документ всё равно будет удален подменяем текущим
						Значение  = ТекущийДокумент();
					КонецЕсли;
					
                    ГлавРЕГ.УстановитьАтрибут(Рег.Идентификатор,ТЗ.ПолучитьЗначение(А,А1));
                КонецЦикла;   
                Для А2=1 по КолРесурсов Цикл
                    Рег=РегистрПроведения.Ресурс(А2);
                    ГлавРЕГ.УстановитьАтрибут(Рег.Идентификатор,ТЗ.ПолучитьЗначение(А,А2+КолИзмерений));
				КонецЦикла;
				
                ГлавРЕГ.ДвижениеПриходВыполнить();
            КонецЦикла;
		КонецЦикла;
		Сообщить(""+ТекущееВремя()+" завершено");
    Иначе
        Предупреждение("Данный документ нельзя перепровести !!!");
        СтатусВозврата(0);
    КонецЕсли;
...Показать Скрыть
# Ответить
23. victuan 30.11.2011 06:50
(0) Ты уж определись 10 Гиг у тебя сворачиваются за 5 мин или за 15 мин? Такую противоречивую информацию ты даешь в кратком и полном описании своей обработки.

(7) "А давайте вместе доведем её до ума". А с чего ты решил, что она достойна доведения до ума? Зачем это делать вообще, если есть аналогичные достойные обработки, "доведенные до ума"?
# Ответить
24. nkvg_a 13.12.2011 19:42
Спасибо. Мне помогла ваша обработка. Подработал и свернул комплексную.
# Ответить
25. vas5780 19.04.2012 07:58
Попробую ей потренироваться на Аспект-Ювелир
# Ответить
26. vas5780 10.05.2012 11:53
не подошла обработка :(
# Ответить
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл