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

Тема в разделе "1C и всё что с ней связано", создана пользователем Дайнеко, 21 мар 2011.

  1. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

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

    Andruha Гость

    озвучь весь запрос
     
  3. puh14

    puh14 Well-Known Member
    1C Team

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

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


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

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

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

    vbs Well-Known Member

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

    Добавлено:
    А СуммаВСтроке нужна ? Если ее выкинуть, эффект пропадает
     
  5. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    О - еще идея родилась
    если в документе всегда есть хоть одна строка то
    Функция СуммаВоз = Сумма(СуммаВШапке) когда (Док.НомерСтроки = 1);
    выдаст то что надо.
     
  6. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Проверил. Не работает.

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

    Дайнеко Well-Known Member
    1C Team

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

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

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

    Думаю. :what?:
     
  8. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    ну тогда через внешнюю функцию - но это точно костыль
     
  9. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Наверное, так. Заставлю запрос не влазить в ТЧ, а сумму строк буду вытягивать.

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Лучше минус поставь деятелям, которые подобный косяк слепили :what?:
     
  11. Hryv

    Hryv Гость

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Насколько я понимаю, там выше еще есть группировка по клиенту, для которого тоже нужна сумма по накладным - а без функции это не выйдет.
     
Загрузка...

Поделиться этой страницей