Имя: Пароль:
1C
1С v8
Неправильно считает ВсегоСкидка
0 o-bol
 
07.01.12
10:03
Помогите разобраться. Скидку считает верно, а в сумму скидки выводит последнюю скидку по документу. Вот код:

ВсегоСкидка  = 0;
        Скидка=0;
       Если ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.ОтчетОРозничныхПродажах")ИЛИ ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.РеализацияТоваровУслуг")Тогда

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

           ОбластьМакета.Параметры.Скидка = ОбщегоНазначения.ФорматСумм(Скидка);
           ОбластьМакета.Параметры.СуммаТовара = ОбщегоНазначения.ФорматСумм(СтрокаРасхода.СуммаДокумента);
           ОбластьМакета.Параметры.СуммаТовара = ОбщегоНазначения.ФорматСумм(СтрокаРасхода.Расход);
           мТабДок.Вывести(ОбластьМакета);
           
       КонецЕсли;
       
   КонецЦикла;

   Расход = ТЗРасходы.Итог("Расход");
   
   ОбластьМакета = Макет.ПолучитьОбласть("ИтогоРасход");
   ОбластьМакета.Параметры.РасхСтоимостьВсего = ОбщегоНазначения.ФорматСумм(Расход);
   ОбластьМакета.Параметры.ВсегоСкидка        = ОбщегоНазначения.ФорматСумм(ВсегоСкидка);
                                                 
   мТабДок.Вывести(ОбластьМакета);
1 Rie
 
07.01.12
10:10
(0) Так а где начало цикла (Для СтрокаРасхода Из ...)?
Судя по всему, ты в _каждой строке_ ВсегоСкидка инициализируешь нулём и заново насчитываешь - вот и выводится последняя.
2 zak555
 
07.01.12
10:12
запрос с цикле ?
3 o-bol
 
07.01.12
10:50
Если убрать из Цикла, тогда выдает ошибку:
{Форма.Форма.Форма(249)}: Преобразование значения к типу Число не может быть выполнено
         ВсегоСкидка  = Выборка.Скидка+ВсегоСкидка;
4 o-bol
 
07.01.12
10:52
ОбластьМакета = Макет.ПолучитьОбласть("Строка");

       Для Каждого СтрокаРасхода Из ТЗРасходы Цикл
       ОбластьМакета.Параметры.Докум = СтрокаРасхода.Док;
       ОбластьМакета.Параметры.Расшифровка = СтрокаРасхода.Док;
       ОбластьМакета.Параметры.ДатаДокумента = СтрокаРасхода.ДатаДок;
       ОбластьМакета.Параметры.НомерДокумента = СтрокаРасхода.НомерДок;
       
   ВсегоСкидка  = 0;
   Скидка=0;
       Если ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.ОтчетОРозничныхПродажах")ИЛИ ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.РеализацияТоваровУслуг")Тогда

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

   Расход = ТЗРасходы.Итог("Расход");
   
   ОбластьМакета = Макет.ПолучитьОбласть("ИтогоРасход");
   ОбластьМакета.Параметры.РасхСтоимостьВсего = ОбщегоНазначения.ФорматСумм(Расход);
   ОбластьМакета.Параметры.ВсегоСкидка        = ОбщегоНазначения.ФорматСумм(ВсегоСкидка);
                                                 
   мТабДок.Вывести(ОбластьМакета);
5 Rie
 
07.01.12
11:01
(4) У тебя ещё праздники? :-)

ВсегоСкидка = 0;
Для Каждого СтрокаРасхода Из ТЗРасходы Цикл
   //...
   Пока Выборка.Следующий() Цикл
       //...
       ВсегоСкидка = ВсегоСкидка+Выборка.Скидка;
   КонецЦикла;
   //...
КонецЦикла;
//...
ОбластьМакета.Параметры.ВсегоСкидка = ОбщегоНазначения.ФорматСумм(ВсегоСкидка);
//...

Ну и учти замечание из (2) насчёт запроса в цикле.
6 zak555
 
07.01.12
11:02
ТЗРасходы это ТЧ дока ?
9 o-bol
 
07.01.12
11:40
Спасибо Rie. Вот так работает:

ОбластьМакета = Макет.ПолучитьОбласть("Строка");
       
       ВсегоСкидка  = 0;
       Для Каждого СтрокаРасхода Из ТЗРасходы Цикл
       ОбластьМакета.Параметры.Докум = СтрокаРасхода.Док;
       ОбластьМакета.Параметры.Расшифровка = СтрокаРасхода.Док;
       ОбластьМакета.Параметры.ДатаДокумента = СтрокаРасхода.ДатаДок;
       ОбластьМакета.Параметры.НомерДокумента = СтрокаРасхода.НомерДок;
       
       Если ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.ОтчетОРозничныхПродажах")ИЛИ ТипЗнч(СтрокаРасхода.Док)=Тип("ДокументСсылка.РеализацияТоваровУслуг")Тогда

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

                                   КонецЕсли;
                                КонецЦикла;
                   
           ОбластьМакета.Параметры.Скидка = ОбщегоНазначения.ФорматСумм(Скидка);
           ОбластьМакета.Параметры.СуммаТовара = ОбщегоНазначения.ФорматСумм(СтрокаРасхода.СуммаДокумента);
           ОбластьМакета.Параметры.СуммаТовара = ОбщегоНазначения.ФорматСумм(СтрокаРасхода.Расход);
            мТабДок.Вывести(ОбластьМакета);
           
       КонецЕсли;
   
   
   КонецЦикла;
10 Rie
 
07.01.12
11:42
(9) Но всё же подумай над тем, что это можно уложить в один запрос, а циклами - лишь перебирать результат запроса.
11 o-bol
 
07.01.12
11:55
Спасибо, подумаю на досуге.