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

Опубликовал 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
Бесплатно

См. также

Мастер печатных форм (Управляемое приложение) v 1.8
[1С 8] Мегапрайс: Расширенная установка цен номенклатуры (анализ цен и переоценка, на основании прайсов, закупок, партий...
Алкогольная декларация для "1С:УТ 10.3, УТ 11, КА 8", с подписью, шифрованием и форматно-логическим контролем
SubSys: Показатели работы менеджеров (анализ покупателей) - комплексный анализ продаж и долгов. УТ10/КА/УПП Реинкарнация...
Загрузка прайса МЕРЛИОН в 1С (интеграция с веб-сервисом)
Видеозаписи конференции IER 2013 в подарок ко Дню Программиста!
Продажи и валовая прибыль для 1С:Бухгалтерии 3 (2.0) внешний отчёт
Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ПостроительDOM
Управление ИТ отделом 8, редакция 3.0
Внешняя история изменений (журнал изменений) и откат версий всех ссылочных объектов, констант и регистров сведений для 8...
Справка о среднем заработке по месяцам для 1С 8.2 Зарплата и Управление Персоналом
Расчет пени для предоставления в суд

Комментарии

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
не подошла обработка :(
# Ответить
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл