Имя: Пароль:
1C
 
Задваиваются суммы в запросе
0 kalisto
 
08.02.10
11:15
Помогите, плиз. Что-то я туплю.
Есть запрос:
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ДатаНачала по ДатаКонца;
   |Фирма            = Регистр.ТранспортныеРасходы.Фирма;
   |УпрАналитика    = Регистр.ТранспортныеРасходы.Фирма.УпрАналитика;
   |ЮрЛицо        = Регистр.ТранспортныеРасходы.Фирма.ЮрЛицо;
   |Контрагент        = Регистр.ТранспортныеРасходы.Контрагент;
   |Перевозчик        = Регистр.ТранспортныеРасходы.Перевозчик;
   |Склад            = Регистр.ТранспортныеРасходы.Склад;  
   |Реализация     = Регистр.ТранспортныеРасходы.ЗаявкаЗаказ;
   |ВидПеревозки    = Регистр.ТранспортныеРасходы.ВидПеревозки;
   |Док            = Регистр.ТранспортныеРасходы.ТекущийДокумент;
   |Вес            = Регистр.ТранспортныеРасходы.Вес;
   |Объем            = Регистр.ТранспортныеРасходы.Объем;
   |Сумма            = Регистр.ТранспортныеРасходы.Сумма;      
   |КолвоМест        = Регистр.ТранспортныеРасходы.КолвоМест;
   |Проект            = Регистр.ТранспортныеРасходы.ЗаявкаЗаказ.Проект;";    
   
   ТекстЗапроса = ТекстЗапроса +
   "Функция ОбщВес = Сумма(Вес);
   |Функция ОбщОбъем = Сумма(Объем);
   |Функция ОбщСумма = Сумма(Сумма);
   |Функция ОбщКолвоМест = Сумма(Колвомест);
   |Функция ОбщСуммаРеализ = Сумма(Подсчитать(Запрос.Реализация));";

Функция Подсчитать(ЗаявкаЗаказ)    
   ДокН = СоздатьОБъект("Документ");
   ДокН.ВыбратьПодчиненныеДокументы(ДатаНачала, ДатаКонца, ЗаявкаЗаказ);
   Пока ДокН.ПолучитьДокумент() = 1 Цикл
       Если ((ДокН.Вид() = "Реализация") или (ДокН.Вид() = "ПоступлениеТМЦ")) и (ДокН.Проведен() = 1) Тогда            
           ОбщСумма = ОбщСумма + ДокН.Сумма;                    
       КонецЕсли;    
   КонецЦикла;  
   Возврат ОбщСумма*1000;
КонецФункции

Сумма, которую возвращает функция 123 т.р., а в отчет по группировкам выводит в два раза больше. Где может быть ошибка.
1 1Сергей
 
08.02.10
11:16
это не весь запрос
2 kalisto
 
08.02.10
11:16
еще там есть группировки
3 1Сергей
 
08.02.10
11:17
(2) классно
4 kalisto
 
08.02.10
11:17
НетОш = 1; // нет ошибок при наложении фильтров
   Если ВидРазделителя = 1 Тогда
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",ВыбРазделитель1,"ВыбРазделитель1",ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
   ИначеЕсли ВидРазделителя = 2 Тогда                                                  
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",ВыбРазделитель2,"ВыбРазделитель2",ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
   ИначеЕсли ВидРазделителя = 3 Тогда                                                  
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",ВыбРазделитель3,"ВыбРазделитель3",ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
       НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
   КонецЕсли;
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Контрагент",ВыбКонтрагент,"ВыбКонтрагент",ТекстЗапроса,Загол);
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Перевозчик",ВыбПеревозчик,"ВыбПеревозчик",ТекстЗапроса,Загол);
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",ВыбСклад,"ВыбСклад",ТекстЗапроса,Загол);
   НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Проект",,,ТекстЗапроса,Загол);
5 kalisto
 
08.02.10
11:19
Процедура УстановитьГруппировкиЗапроса(ТекстЗапроса, ТекстЗагол)
   СписокГруппировок = СоздатьОбъект("СписокЗначений");
   
   Для Сч=1 По Группировки.РазмерСписка() Цикл
       Если Группировки.Пометка(Сч)=1 Тогда
           ПредставлениеГрупп="";
           ТекстГрупп=Группировки.ПолучитьЗначение(Сч,ПредставлениеГрупп);
           Если  (ТекстГрупп = "Контрагент") или (ТекстГрупп = "Перевозчик") или (ТекстГрупп = "Склад") Тогда
               ТекстБезГрупп = " без групп";
           Иначе
               ТекстБезГрупп = "";
           КонецЕсли;
           ТекстЗапроса    = ТекстЗапроса    + "Группировка "+ТекстГрупп+ТекстБезГрупп+";";  
           ТекстЗагол        = ТекстЗагол    + ?(ТекстЗагол="",""," / ")+ПредставлениеГрупп;
           СписокГруппировок.ДобавитьЗначение(ТекстГрупп,ПредставлениеГрупп);
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры // УстановитьГруппировкиЗапроса()
6 1Сергей
 
08.02.10
11:22
Покажи получившийся текст запроса непосредственно перед командой Выполнить
7 kalisto
 
08.02.10
11:28
//{{ЗАПРОС(Сформировать)
Период с ДатаНачала по ДатаКонца;
Фирма            = Регистр.ТранспортныеРасходы.Фирма;
УпрАналитика    = Регистр.ТранспортныеРасходы.Фирма.УпрАналитика;
ЮрЛицо        = Регистр.ТранспортныеРасходы.Фирма.ЮрЛицо;
Контрагент        = Регистр.ТранспортныеРасходы.Контрагент;
Перевозчик        = Регистр.ТранспортныеРасходы.Перевозчик;
Склад            = Регистр.ТранспортныеРасходы.Склад;  
Реализация     = Регистр.ТранспортныеРасходы.ЗаявкаЗаказ;
ВидПеревозки    = Регистр.ТранспортныеРасходы.ВидПеревозки;
Док            = Регистр.ТранспортныеРасходы.ТекущийДокумент;
Вес            = Регистр.ТранспортныеРасходы.Вес;
Объем            = Регистр.ТранспортныеРасходы.Объем;
Сумма            = Регистр.ТранспортныеРасходы.Сумма;      
КолвоМест        = Регистр.ТранспортныеРасходы.КолвоМест;
Проект            = Регистр.ТранспортныеРасходы.ЗаявкаЗаказ.Проект;Функция ОбщВес = Сумма(Вес);
Функция ОбщОбъем = Сумма(Объем);
Функция ОбщСумма = Сумма(Сумма);
Функция ОбщКолвоМест = Сумма(Колвомест);
Функция ОбщСуммаРеализ = Сумма(Подсчитать(Запрос.Реализация));
Условие (Подсчитать(Запрос.Реализация) > 0);Группировка Фирма;Группировка Контрагент без групп;Группировка Проект;Группировка Реализация;
8 1Сергей
 
08.02.10
11:37
эх, не знаю я российских конфигураций.
попробуй вот это:

Процедура УстановитьГруппировкиЗапроса(ТекстЗапроса, ТекстЗагол)
   СписокГруппировок = СоздатьОбъект("СписокЗначений");
   
   Для Сч=1 По Группировки.РазмерСписка() Цикл
       Если Группировки.Пометка(Сч)=1 Тогда
           ПредставлениеГрупп="";
           ТекстГрупп=Группировки.ПолучитьЗначение(Сч,ПредставлениеГрупп);
           //Если  (ТекстГрупп = "Контрагент") или (ТекстГрупп = "Перевозчик") или (ТекстГрупп = "Склад") Тогда
           Если  (ТекстГрупп = "Контрагент") или (ТекстГрупп = "Перевозчик") или (ТекстГрупп = "Склад") или (ТекстГрупп = "Проект") Тогда //* может быть дело в этом
               ТекстБезГрупп = " без групп";
           Иначе
               ТекстБезГрупп = "";
           КонецЕсли;
           ТекстЗапроса     = ТекстЗапроса     + "Группировка "+ТекстГрупп+ТекстБезГрупп+";";  
           ТекстЗагол         = ТекстЗагол     + ?(ТекстЗагол="",""," / ")+ПредставлениеГрупп;
           СписокГруппировок.ДобавитьЗначение(ТекстГрупп,ПредставлениеГрупп);
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры // УстановитьГруппировкиЗапроса()
9 kalisto
 
08.02.10
12:00
я думаю, это не поможет.
10 1Сергей
 
08.02.10
12:08
Вообще мне кажется, что конструкция
Функция ОбщСуммаРеализ = Сумма(Подсчитать(Запрос.Реализация));
- это такая жуткая тормозилка всего запроса
11 kalisto
 
08.02.10
12:19
Я согласна, но мне так нужно, что бы итоги сумм по группам для реализаций выводились.
12 kalisto
 
08.02.10
12:20
вернее, суммы реализаций для всех групп
13 1Сергей
 
08.02.10
12:20
(11) Задваиваются по всем группировкам?
14 Vlad_1717
 
08.02.10
12:53
(7) А зачем тебе в запросе переменные

УпрАналитика    = Регистр.ТранспортныеРасходы.Фирма.УпрАналитика;
ЮрЛицо         = Регистр.ТранспортныеРасходы.Фирма.ЮрЛицо;
Перевозчик        = Регистр.ТранспортныеРасходы.Перевозчик;
Склад            = Регистр.ТранспортныеРасходы.Склад;  
ВидПеревозки    = Регистр.ТранспортныеРасходы.ВидПеревозки;

ведь по ним дальше никаких движений... или в Подсчитать(Запрос.Реализация) используешь?
15 kalisto
 
08.02.10
12:54
(14)они потом нужны будут
16 Vlad_1717
 
08.02.10
12:57
(15) Попробуй добавить группировку по
Док            = Регистр.ТранспортныеРасходы.ТекущийДокумент;

И там посмотри суммы.
17 kalisto
 
08.02.10
13:07
Группировка по Док помогла. Спасибо. Теперь я поняла, в чем была проблема.
Закон Брукера: Даже маленькая практика стоит большой теории.