Имя: Пароль:
1C
1С v8
Списание по партиям
0 skupidom
 
21.08.19
11:52
Коллеги, что не правильно в реализации, прошу Вашей критики:
ДвиженияРН = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей();    
    ДвиженияРН.Отбор.Регистратор.Установить(Ссылка);
    ДвиженияРН.Очистить();
    ДвиженияРН.Записывать = Истина;
    
    ЗапросРН = Новый Запрос;
    ЗапросРН.Текст = "ВЫБРАТЬ
    |    РТУТовары.Номенклатура КАК Номенклатура,
    |    МАКСИМУМ(РТУТовары.Количество) КАК Количество,
    |    МАКСИМУМ(РТУТовары.Сумма) КАК Сумма
    |ПОМЕСТИТЬ ПартияРТУ
    |ИЗ
    |    Документ.РТУ.Товары КАК РТУТовары
    |ГДЕ
    |    РТУТовары.Ссылка = &РТУ
    |
    |СГРУППИРОВАТЬ ПО
    |    РТУТовары.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    ПартииТоваровОстатки.Номенклатура КАК Номенклатура,
    |    ПартииТоваровОстатки.Партия КАК Партия,
    |    СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    |    СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток,
    |    МАКСИМУМ(ПартияРТУ.Количество) КАК КоличествоРТУ,
    |    МАКСИМУМ(ПартияРТУ.Сумма) КАК СуммаРТУ
    |ИЗ
    |    РегистрНакопления.ПартииТоваров.Остатки(
    |            &ТекДата,
    |            Номенклатура В
    |                (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                    ПартияРТУ.Номенклатура КАК Номенклатура
    |                ИЗ
    |                    ПартияРТУ КАК ПартияРТУ)) КАК ПартииТоваровОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ ПартияРТУ КАК ПартияРТУ
    |        ПО ПартииТоваровОстатки.Номенклатура = ПартияРТУ.Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровОстатки.Номенклатура,
    |    ПартииТоваровОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПартииТоваровОстатки.Партия.МоментВремени
    |ИТОГИ
    |    СУММА(КоличествоОстаток),
    |    СУММА(СуммаОстаток),
    |    СУММА(КоличествоРТУ),
    |    СУММА(СуммаРТУ)
    |ПО
    |    Номенклатура,
    |    Партия";     
    ЗапросРН.УстановитьПараметр("РТУ",Ссылка);
    ЗапросРН.УстановитьПараметр("ТекДата",Ссылка.МоментВремени());
    ВыборкаНоменклатура = ЗапросРН.Выполнить().Выбрать(); // ВыборкаНоменклатура
    Пока ВыборкаНоменклатура.Следующий() Цикл
        
        Если ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.КоличествоРТУ Тогда
            Возврат;        
        КонецЕсли;
        
        ИтогКолВоНомен = ВыборкаНоменклатура.КоличествоОстаток;
        
        ВыборкаПартия = ВыборкаНоменклатура.Выбрать();    
        Пока ВыборкаПартия.Следующий() Цикл
            
            ОстатокКоличествоРН = ВыборкаПартия.КоличествоОстаток;
            Если НЕ ОстатокКоличествоРН > 0 Тогда
                Продолжить;            
            КонецЕсли;    
            
            КоличествоСписатьПоРТУ = ВыборкаПартия.КоличествоРТУ;
            Если КоличествоСписатьПоРТУ > ВыборкаПартия.КоличествоОстаток Тогда
                КолВоСписываем = ВыборкаПартия.КоличествоОстаток;
                СуммаСписания  = (ВыборкаПартия.СуммаРТУ / ВыборкаПартия.КоличествоРТУ) * ВыборкаПартия.КоличествоОстаток;
            Иначе
                КолВоСписываем = КоличествоСписатьПоРТУ;
                СуммаСписания  = ВыборкаПартия.СуммаРТУ;
            КонецЕсли;    
            
            НовоеДвижениеРасход              = ДвиженияРН.ДобавитьРасход();
            НовоеДвижениеРасход.Период          = Ссылка.МоментВремени();
            НовоеДвижениеРасход.Партия          = Ссылка;
            НовоеДвижениеРасход.Регистратор  = Ссылка;
            НовоеДвижениеРасход.Номенклатура = ВыборкаПартия.Номенклатура;
            НовоеДвижениеРасход.Количество   = КолВоСписываем;
            НовоеДвижениеРасход.Сумма        = СуммаСписания;
            
            ИтогКолВоНомен = ИтогКолВоНомен - КолВоСписываем;
            
        КонецЦикла;    
        
        ДвиженияРН.Записать();
        
    КонецЦикла;
1 RomanYS
 
21.08.19
11:58
(0) За что глаз зацепился
  
ДвиженияРН.Записывать = Истина; //зачем??? Это же не проведение документа

ДвиженияРН.Записать();  //в цикле???
2 skupidom
 
21.08.19
12:08
согласен, а еще есть ?
3 RomanYS
 
21.08.19
12:16
(2) содержательную часть даже читать лень.
Но многократное использование "МАКСИМУМ" сильно напрягает.
4 skupidom
 
21.08.19
12:23
согласен
5 skupidom
 
21.08.19
12:24
в целом логика не нарушена, все корректно ?
6 RomanYS
 
21.08.19
12:31
(5) все корректно ? Конечно, нет!

НовоеДвижениеРасход.Партия          = Ссылка; //бред
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой