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