вторник, 21 августа 2012 г.

Очистка остатков корректировкой записей регистра

1) Создаем пустой док с нужными регистрами
2) Обработкой заполняем этот док.

Пример кода:
Если В_Док.Пустая() Тогда
        Предупреждение("В док пусто");
        Возврат
    КонецЕсли;
   
    Группа = Справочники.Номенклатура.НайтиПоКоду("А240716    ");
    Если Группа.Пустая() или Группа.ЭтоГруппа=Ложь Тогда
        Сообщить("Либо не нашли по коду, либо найденная - не группа:"+Группа.Наименование);
        Возврат
    КонецЕсли;
    Об = В_Док.ПолучитьОбъект();
    ТовНаСл = Об.Движения.ТоварыНаСкладах;
    ТовОрг = Об.Движения.ТоварыОрганизаций;
   
    ТовНаСл.Очистить();
    ТовОрг.Очистить();
   
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.СерияНоменклатуры,
    |    ТоварыНаСкладахОстатки.Качество,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, ) КАК ТоварыНаСкладахОстатки
    |ГДЕ
    |    ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ(&Номенклатура)
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.СерияНоменклатуры,
    |    ТоварыНаСкладахОстатки.Качество
    |   
    |
    |УПОРЯДОЧИТЬ ПО
    |    ТоварыНаСкладахОстатки.Номенклатура.Наименование
    |");
   
    Запрос.УстановитьПараметр("НаДату", КонецДня(В_Док.Дата));
    Запрос.УстановитьПараметр("Номенклатура", Группа);
   
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Запись = ТовНаСл.Добавить();
        Запись.Активность=Истина;
        Запись.Период=В_Док.Дата;
        Запись.ВидДвижения=ВидДвиженияНакопления.Расход;
        Запись.Склад=Выборка.Склад;
        Запись.Номенклатура = Выборка.Номенклатура;
        Запись.Качество = Справочники.Качество.Новый;
        Запись.СерияНоменклатуры = Выборка.СерияНоменклатуры;
        Запись.Количество = Выборка.КоличествоОстаток;
    КонецЦикла;
   
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |    ТоварыОрганизацийОстатки.Организация,
    |    ТоварыОрганизацийОстатки.Номенклатура,
    |    ТоварыОрганизацийОстатки.СерияНоменклатуры,
    |    ТоварыОрганизацийОстатки.Качество,
    |    СУММА(ТоварыОрганизацийОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыОрганизаций.Остатки(&НаДату, ) КАК ТоварыОрганизацийОстатки
    |ГДЕ
    |    ТоварыОрганизацийОстатки.Номенклатура В ИЕРАРХИИ(&Номенклатура)
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыОрганизацийОстатки.Номенклатура,
    |    ТоварыОрганизацийОстатки.Качество,
    |    ТоварыОрганизацийОстатки.Организация,
    |    ТоварыОрганизацийОстатки.СерияНоменклатуры
    |   
    |
    |УПОРЯДОЧИТЬ ПО
    |    ТоварыОрганизацийОстатки.Номенклатура.Наименование
    |");
   
    Запрос.УстановитьПараметр("НаДату", КонецДня(В_Док.Дата));
    Запрос.УстановитьПараметр("Номенклатура", Группа);
   
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Запись = ТовОрг.Добавить();
        Запись.Активность=Истина;
        Запись.Период=В_Док.Дата;
        Запись.ВидДвижения=ВидДвиженияНакопления.Расход;
        Запись.Организация=Выборка.Организация;
        Запись.Номенклатура = Выборка.Номенклатура;
        Запись.Качество = Справочники.Качество.Новый;
        Запись.СерияНоменклатуры = Выборка.СерияНоменклатуры;
        Запись.Количество = Выборка.КоличествоОстаток;
    КонецЦикла;
   
    Попытка
        Об.Записать()
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;