Имя: Пароль:
1C
1С v8
правильно подсчитать сумму для каждого документа
0 alexser94
 
29.12.16
11:56
Есть задача: перенести документы Требование-накладная из одной бухгалтерской базы Бухгалтерия 8.3 в другую.
для этого был написан запрос, который вытаскивает данные по этому документу и документу-основанию Поступление товаров и услуг для того, чтобы формировать сумму документа Требование-накладная.
Как сделать так, чтобы сумма считалась правильно по всем документам, учитывая что в документе поступления может быть несколько строк в табличной части. Как для каждого документа подсчитывать сумму? а то сейчас получается, что сумма берется итоговая и записывается для каждого документа одинаковая.
Офис_Запрос.Text =  
       "ВЫБРАТЬ
       |    ТребованиеНакладная.Номер,
       |    ТребованиеНакладная.Дата,
       |    ТребованиеНакладная.ПометкаУдаления,
       |    ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(ТребованиеНакладная.Организация)) КАК Организация,
       |    ВЫРАЗИТЬ(ТребованиеНакладная.Комментарий КАК СТРОКА(200)) КАК Комментарий,
       |    ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(ТребованиеНакладная.Ссылка)) КАК Ссылка,
       |    ТребованиеНакладнаяМатериалы.ДокументОприходования.Номер,
       |    ТребованиеНакладнаяМатериалы.ДокументОприходования.Дата,
       |    ТребованиеНакладнаяМатериалы.ДокументОприходования,
       |    ТребованиеНакладная.ПодразделениеЗатрат.Код КАК МВЗ,
       |    ТребованиеНакладнаяМатериалы.Номенклатура,
       |    ПоступлениеТоваровУслугТовары.Цена,
       |    ТребованиеНакладнаяМатериалы.Количество,
       |    ПоступлениеТоваровУслугТовары.Количество КАК КоличествоПост,
       |    ПоступлениеТоваровУслугТовары.Номенклатура.Наименование,
       |    ПоступлениеТоваровУслугТовары.Сумма
       |ИЗ
       |    Документ.ТребованиеНакладная.Материалы КАК ТребованиеНакладнаяМатериалы
       |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ТребованиеНакладная КАК ТребованиеНакладная
       |        ПО ТребованиеНакладнаяМатериалы.Ссылка = ТребованиеНакладная.Ссылка
       |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
       |        ПО (ПоступлениеТоваровУслугТовары.Ссылка = ТребованиеНакладнаяМатериалы.ДокументОприходования.Ссылка)
       |            И (ПоступлениеТоваровУслугТовары.Номенклатура = ТребованиеНакладнаяМатериалы.Номенклатура)
       |ГДЕ
       |    ТребованиеНакладная.Дата МЕЖДУ &ДатаНач И &ДатаКон
       |    И ТребованиеНакладная.ПометкаУдаления = ЛОЖЬ
       |    И ТребованиеНакладная.Проведен = ИСТИНА";
Офис_Запрос.УстановитьПараметр("ДатаНач", ДатаНачала);
    Офис_Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);  
    КОМРезультат = Офис_Запрос.Выполнить();

    КОМТЗВыборка = КОМРезультат.Выгрузить();
    стрТЗВыборка = СоединениеДругаяБаза.ЗначениеВСтрокуВнутр(КОМТЗВыборка);
    ТЗВыборка = ЗначениеИзСтрокиВнутр(стрТЗВыборка);
    мас = новый Массив(ТЗВыборка.Количество());
    ии=0;
    Для каждого Стр Из ТЗВыборка Цикл
        сумма=0;
        суммаПост = 0;
        средн = 0;
        КолПост = 0;
        КолТреб = 0;
        Сч = 0;
        Для каждого Стр1 Из ТЗВыборка Цикл    
            если Стр.Номер = Стр1.Номер тогда
                если ЗагружатьПоОрганизации1 = Справочники.Организации.НайтиПоКоду(Лев(Стр.Организация,4)) тогда
                                        
                    если Стр.НоменклатураНаименование = Стр1.НоменклатураНаименование тогда
                        сч=сч+1;
                        мас[ии]=сч;
                    КонецЕсли;
                    
    КонецЕсли;
        
    конецесли;
КонецЦикла;
ии=ии+1;
КонецЦикла;


ии=0;
Для каждого Стр Из ТЗВыборка Цикл    
    если ЗагружатьПоОрганизации1 = Справочники.Организации.НайтиПоКоду(Лев(Стр.Организация,4)) тогда
                    если мас[ии]>1 тогда
                        суммаПост = суммаПост+ Число(Стр.Сумма);
                        КолПост = КолПост+Стр.КоличествоПост;
                        КолТреб = Стр.Количество;
                    иначе                                    
                        сумма = сумма + Число(Число(Стр.Сумма)*Число(Стр.Количество)/Число(Стр.КоличествоПост));
                     КонецЕсли;
                КонецЕсли;
    ии=ии+1;
КонецЦикла;







Средн = Окр(суммаПост * КолТреб/КолПост,2);
общсумма = сумма+средн;

    
Для каждого Стр Из ТЗВыборка Цикл

если ЗагружатьПоОрганизации1 = Справочники.Организации.НайтиПоКоду(Лев(Стр.Организация,4)) тогда

Новстр = ТребованиеНакладная.Добавить();  
Новстр.НомерДокумента = СокрЛП(Стр.Номер);
        Новстр.ДатаДокумента = Стр.Дата;
        Новстр.Организация = Стр.Организация;
        Новстр.ТипОперации = "108";
        Новстр.Комментарий = Стр.Комментарий;
        Новстр.МВЗ = Стр.МВЗ;    
        Новстр.Себестоимость = общсумма;
        Новстр.ДатаДокОприх = Стр.ДокументОприходованияДата;
        Новстр.НомерДокОприх = Стр.ДокументОприходованияНомер;
    КонецЕсли;
КонецЦикла;

    ТребованиеНакладная.Свернуть("НомерДокумента, ДатаДокумента, Организация, МВЗ,Себестоимость");
    Попытка
        v83.ExecuteBatch("ЗавершитьРаботуСистемы(0)");
    Исключение
    КонецПОпытки;
    //v77 = 0;
    v83 = Неопределено;
1 Джинн
 
29.12.16
11:58
А с чего Вы решили, что с производство списывается партия, образованная документом-основанием, а не согласно учетной политике?
2 alexser94
 
29.12.16
13:49
В учетной политике у нас метод списания - ФИФО, соответственно в документе Требование-накладная у нас заполняется поле ДокументОприходования.
3 Джинн
 
29.12.16
13:52
(2) Вашему ФИФО абсолютно монопенисуален документ оприходования - спишется первая по времени партия, а не указанная Вами. Что в таком случае Вы выгрузите? Лажу?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший