gifts2017

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

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

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

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

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

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

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

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


 

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

 

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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