Итоговая сумма в динамических списках (список документов, список справочников)

Опубликовал Алексей Северянин (Ledokol-alt) в раздел Программирование - Практика программирования

Итоговая сумма в динамических списках (список документов, список справочников) с учетом текущего отбора.

Данный запрос актуальный для динамических списков!

Столкнулся с тем что нужно было показать итоговую сумму в списке документов с учетом текущего отбора, а возможности у платформы нет (в динамич. списках), пришлось наваять запрос и передать ему отбор.

Этот компактный запрос позволит рассчитать сумму проведенных документов в списке документов с учетом текущего отбора и показать его как текст подвала колонки.

Для начала нужно поставить галочку "Подвал" в свойствах списка. И в предопределенной процедуре ОбновлениеОтображения(), формы списка, написать следующее:

    ПостроительЗапроса = Новый ПостроительЗапроса;
   
    ТекстПостроителя = "ВЫБРАТЬ
    |    ЗаявкаНаКассовыйРасход.Номер Как Номер,
    |    ЗаявкаНаКассовыйРасход.ПометкаУдаления Как ПометкаУдаления,
    |    ЗаявкаНаКассовыйРасход.Проведен КАК Проведен, ";
    РеквизитыЗКР = Метаданные.Документы.ЗаявкаНаКассовыйРасход.Реквизиты;
    Для Индекс = 0 По РеквизитыЗКР.Количество()-1 Цикл
        ТекстПостроителя = ТекстПостроителя + "    ЗаявкаНаКассовыйРасход." + СокрЛП(РеквизитыЗКР[Индекс].Имя) + " КАК " + СокрЛП(РеквизитыЗКР[Индекс].Имя) + " ";
        Если РеквизитыЗКР.Количество()-1 <> Индекс Тогда
            ТекстПостроителя = ТекстПостроителя + ",";
        КонецЕсли;
    КонецЦикла;
    ТекстПостроителя = ТекстПостроителя + "
    |    ИЗ Документ.ЗаявкаНаКассовыйРасход КАК ЗаявкаНаКассовыйРасход
    |    ГДЕ Проведен = Истина";
    ПостроительЗапроса.Текст = ТекстПостроителя;
    ОписаниеИсточникаДанных= Новый ОписаниеИсточникаДанных(ДокументСписок);
    ПостроительЗапроса.ИсточникДанных = ОписаниеИсточникаДанных;
   
    ПостроительЗапроса.Выполнить();
    тз = ПостроительЗапроса.Результат.Выгрузить();
    СуммаПоТЗ = Формат(тз.Итог("СуммаДокумента"), "ЧЦ=14; ЧДЦ=2");
    ЭлементыФормы.ДокументСписок.Колонки.СуммаДокумента.ТекстПодвала = СокрЛП(СуммаПоТЗ);


 

ЗаявкаНаКассовыйРасход - заменить на документ в котором делаеться.

 

Если большой список документов, можно повесить этот код на кнопку "рассчитать" и при нажатии будет рассчитывать сумму.

Надеюсь пригодится этот скромный труд.

См. также

Добавить вознаграждение
Комментарии
1. Алексей Северянин (Ledokol-alt) 124 07.10.09 14:29 Сейчас в теме
Плюсуем кому понравилось и пригодилось! ;)
2. Ярослав Радкевич (WKBAPKA) 200 07.10.09 14:58 Сейчас в теме
Сразу вопросы:
1. Зачем СОКРЛП()? У текстовых реквизитов установлена фиксированная длина?
2. При большом объеме базы список будет жутко тормозить, т.к. обновление отображения будет происходить каждый раз при изменении размеров формы или перемещения по строкам.
Мое мнение, использовать такой подход для расчета имеет смысл только для документов с выбранным интервалом, т.е. нет необходимости вешать его на обновление отображения.

Правда, что то я сумневаюсь, что если у документа есть реквизит "Сумма", что по нему в подвале нельзя получить итоговое значение.
Опять же, почему нельзя посчитать итог в запросе?

Вообщем много почему!!!
3. Сергей Ожерельев (Поручик) 3471 07.10.09 15:14 Сейчас в теме
Вот именно что, почему в событии ОбновлениеОтображения(), а не в ПриПолученииДанных?
4. Ярослав Радкевич (WKBAPKA) 200 07.10.09 15:35 Сейчас в теме
5. Артур Аюханов (artbear) 847 07.10.09 16:25 Сейчас в теме
Каждый раз в цикле юзать ДокументСписок.Отбор[Индекс] совсем не гуд :(
Поручик; +1 Ответить 1
6. Ярослав Радкевич (WKBAPKA) 200 07.10.09 19:12 Сейчас в теме
похоже человек только учиться... видать бывший семерочник :)
7. Яков Коган (Yashazz) 1957 07.10.09 19:29 Сейчас в теме
Советую изучить ИсточникДанных и ОписаниеИсточникаДанных, при использовании которых данная задача превращается в тривиальную.
mr zafod; Ledokol-alt; +2 Ответить 2
8. Kom-off (Kom-off) 08.10.09 09:55 Сейчас в теме
9. Алексей Северянин (Ledokol-alt) 124 12.10.09 00:04 Сейчас в теме
(2) 1 - Метод СокрЛП() используеться для перестрахования, Ресурсов много он не ест, зато дает стопроцентный результат (возвращает ТЕКСТ без ПРОБЕЛОВ) что для запроса и нужно. 2 - при большом объеме базы рекомендую вешать не в предопределенную процедуру ОбновлениеОтображения(), а на кнопку, чтоб пользователь рассчитывал сам эту сумму. Или если есть вариант получше, я с радостью выслушаю.
10. Алексей Северянин (Ledokol-alt) 124 12.10.09 00:09 Сейчас в теме
(3) Потому что предопределенной процедуры ПриПолученииДанных() нет в форме списка документа. А я повторяюсь что это код для получения итоговой суммы в динамических списках (список документов, список справочников).
11. Алексей Северянин (Ledokol-alt) 124 12.10.09 00:10 Сейчас в теме
(5) есть другие варианты с радостью выслушаю :)
К сожалению, я других вариантов не вижу, при условию что мне нужно передать текущий отбор.
12. Алексей Северянин (Ledokol-alt) 124 12.10.09 00:13 Сейчас в теме
(6) Век живи, век учись. "Семерочником" всегда лучше быть чем двоечником :D
А если серьезно, то не вижу логики в ваших словах. Из бывших "семерочников" часто получаются настоящие "восмерочники".
13. Алексей Северянин (Ledokol-alt) 124 12.10.09 00:52 Сейчас в теме
(7) Спасибо! Пригодился ИсточникДанных, с помощью которого удалось избежать лишнего цикла. +1
14. Артур Аюханов (artbear) 847 12.10.09 10:07 Сейчас в теме
(13) Уже намного лучше.
1. Для оптимизации (все-таки код будет очень часто вызываться) лучше весь блок до ПостроительЗапроса.Выполнить() вынести в отдельный метод, вызываемый в ПриОткрытии.
2. Совсем нелогично использование запроса и выгрузки в ТЗ и подсчет суммы :(
считай итоговую сумму сразу в запрос :) - будет совсем шустро.
15. Артур Аюханов (artbear) 847 12.10.09 10:10 Сейчас в теме
Кстати, автор прав, а (3) нет :)
16. Сергей Ожерельев (Поручик) 3471 12.10.09 10:28 Сейчас в теме
(15), (10) Извините-с, х..ню-с сморозил. :(
17. Артур Аюханов (artbear) 847 15.10.09 16:26 Сейчас в теме
(0) Автор, прочти http://www.kb.mista.ru/article.php?id=471
думаю, станет более понятна схема с построителем и динамическим списком.
18. Алексей Северянин (Ledokol-alt) 124 15.10.09 20:41 Сейчас в теме
(17) Нормальная статейка, подтвердил свои знания )))
19. Артур Аюханов (artbear) 847 16.10.09 16:41 Сейчас в теме
20. Алексей Северянин (Ledokol-alt) 124 16.10.09 18:31 Сейчас в теме
(19) Да, согласен, что часть кода можно вынести в процедуру ПриОткрытии(), только до строки "ОписаниеИсточникаДанных= Новый ОписаниеИсточникаДанных(ДокументСписок);" иначе не будет обновляться итоговая сумма. И итог можно в запросе рассчитать. :)
21. Илья Ткаченко (tka4enk0) 134 03.04.13 01:28 Сейчас в теме
Для динамического списка с произвольным запросом работает (управляемые формы)??? У меня почему-то не взлетело.
ОписаниеИсточникаДанных= Новый ОписаниеИсточникаДанных(ДокументСписок);
ДокументСписок - Это элемент формы???
22. Алексей Северянин (Ledokol-alt) 124 01.06.13 18:46 Сейчас в теме
(21) tka4enk0, для управляемых форм этот код не пойдет.
ДокументСписок - это тип "ДокументСписок[ИмяДокумента]".