Запрос по документу умножает сумму

Дайнеко

Well-known member
19.11.2009
951
0
#1
Вляпался как молодой:
Код:
	|СуО = Документ.Расходная.СуммаВСтроке;
|СуВ = Документ.Расходная.СуммаВШапке;
|Функция СуммаОтг = Сумма(СуммаВСтроке);
|Функция СуммаВоз = Сумма(СуммаВШапке);
|Группировка Кли Без Групп;
|Группировка Док;
Т.е. надо вывести сумму по клиенту, затем по каждому документу. Проблема с СуммаВШапке
При выводе Запрос.СуммаВоз умножает сумму на количество строк в док-те. А Запрос.СуВ содержит сумму из первого док-та.

Умом то я понимаю, что из-за "СуммаВСтроке" запрос пробегает по всем строкам ТЧ и происходит увеличение СуммаВоз. Как заставит суммировать только по документам?
 

puh14

Well-known member
11.07.2008
1 412
0
#3
если бредово |Функция СуммаВоз = Сумма(СуммаВШапке) когда (Док.НомерСтроки = 0);

менее бредово - написать внешнюю функцию по расчету сумм в строках и использовать в запросе её (хотя это более медленно)
типа
Функция СуммаСтрок(ВыбДок)
Док = СоздатьОбъект("Документ");
Док.НайтиДокумент(ВыбДок);
Возврат док.Итог("СуммаВСтроке"); // ну тут по обстоятельствам, это просто пример
КонецФункции


а в запросе
|Функция СуммаВоз = СуммаСтрок(Док);

ещё подумаю - может есть более простой и быстрый способ.

да есть - туплю. Не используй для суммы в шапке функцию - добавь её в группировку после документа.
ещё вариант - рассчитать количество строк в документе через функцию счетчик и делить сумму СуммаВоз на счетчик.
 

vbs

Well-known member
18.02.2007
1 708
1
#4
Согласен - бред полный. Похоже, просто запрос отрабатывает с ошибкой. Проверил на похожей базе -
всегда функция СУММА умножает реквизит шапки на количество строк ТЧ.
Вылечить-то можно...

Добавлено:
Умом то я понимаю, что из-за "СуммаВСтроке" запрос пробегает по всем строкам ТЧ и происходит увеличение СуммаВоз
А СуммаВСтроке нужна ? Если ее выкинуть, эффект пропадает
 

puh14

Well-known member
11.07.2008
1 412
0
#5
О - еще идея родилась
если в документе всегда есть хоть одна строка то
Функция СуммаВоз = Сумма(СуммаВШапке) когда (Док.НомерСтроки = 1);
выдаст то что надо.
 

vbs

Well-known member
18.02.2007
1 708
1
#6
Функция СуммаВоз = Сумма(СуммаВШапке) когда (Док.НомерСтроки = 1);
Проверил. Не работает.

Добавлено: И еще интересный эффект - если две функции Сумма и обе наложены на реквизит шапки - обе умножают на количество строк
 

Дайнеко

Well-known member
19.11.2009
951
0
#7
Вижу, что гении накидали мыслей. Давайте утвердим факт: Если в запросе нет данных из строчной части, он суммирует только шапочки.
Я его не проверял, поверим VBS "А СуммаВСтроке нужна ? Если ее выкинуть, эффект пропадает ".

Я понимаю механику 1С:
1) построила виртуальную таблицу. Если нет данных из строк, ее размер равен ко-ву доков. Если есть - то суммарный массив из всех строк.
2) в поля этой таблицы натыкала данные из строк и шапок. Например, "Клиент, Склад, СуммаВШапке" будет в каждой строке.
3) Тупо просуммировала, забыв, откуда данные взялись.

Эх! Не хочется переделывать отчет из 10 строк на другие приемы: 2 запроса, свернуть таблички и т.п. Вот я, как puh14, пытался зацепить "Когда (ПустоеЗначение(Товар))". Но не зацепило. Надеялся, что виртуальная табличка строится так:
- данные из шапки. Переменные Товар,Количество,СуммаСтроки есть но пустые
- данные строк
Т.е. строк = КолвоДоков + СуммарноеСтрок

Думаю. :what?:
 

puh14

Well-known member
11.07.2008
1 412
0
#8
ну тогда через внешнюю функцию - но это точно костыль
 

Дайнеко

Well-known member
19.11.2009
951
0
#9
у тогда через внешнюю функцию - но это точно костыль
Наверное, так. Заставлю запрос не влазить в ТЧ, а сумму строк буду вытягивать.

Спасибо, ребяты! vbs и Puh14, если плюсов для коллекции мало, то могу и подарить.
 
H
#11
А что потом с результатами запроса делается?

Если документ "|Группировка Док" всегда остается доступен, то почему бы не использовать Запрос.Док.СуммаВШапке?
 

puh14

Well-known member
11.07.2008
1 412
0
#12
Если документ "|Группировка Док" всегда остается доступен, то почему бы не использовать Запрос.Док.СуммаВШапке?
Насколько я понимаю, там выше еще есть группировка по клиенту, для которого тоже нужна сумма по накладным - а без функции это не выйдет.