• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Дайнеко
  • Дата начала
Д

Дайнеко

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

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

puh14

если бредово |Функция СуммаВоз = Сумма(СуммаВШапке) когда (Док.НомерСтроки = 0);

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


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

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

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

vbs

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

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

puh14

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

vbs

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

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

Дайнеко

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

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

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

Думаю. :what?:
 
P

puh14

ну тогда через внешнюю функцию - но это точно костыль
 
Д

Дайнеко

у тогда через внешнюю функцию - но это точно костыль

Наверное, так. Заставлю запрос не влазить в ТЧ, а сумму строк буду вытягивать.

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

Hryv

А что потом с результатами запроса делается?

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

puh14

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

Насколько я понимаю, там выше еще есть группировка по клиенту, для которого тоже нужна сумма по накладным - а без функции это не выйдет.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!