Итоги в динамическом списке

Программирование - Работа с интерфейсом

Предлагаю вариант, как быстро сделать итоги в динамическом списке, например в форме списка журнала документов.

Итак, мне необходимо вставить итог по колонке СуммаКОплате в динамическом списке формы списка журнала документов. Для этого в модуле формы списка журнала документов создаем новую процедуру, я назвал ее РассчитатьИтоги(), и вставляем в неё такой код:

Процедура РассчитатьИтоги()
    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    ЭтотОбъект.ЭтаФорма.Элементы.СуммаКОплате.ТекстПодвала =  "Итого: " + Формат(Результат.Итог("СуммаКОплате"),"ЧДЦ=2; ЧН=-");
КонецПроцедуры

Затем делаем вставку вызова этой процедуры в любом обработчике событий, например СписокПриАктивизацииСтроки()

На этом всё, должно работать. Проверялась на релизах 8.3.10.2667, 8.3.11.2899.

См. также

Комментарии
1. Геннадий Жаркой (ifal) 220 28.05.18 17:13 Сейчас в теме
2. Сергей Зарайкин (CXY) 302 28.05.18 17:19 Сейчас в теме
(1) Здесь намного короче
jONES1979; +1 Ответить
3. A M (DarkUser) 28.05.18 18:44 Сейчас в теме
Но лучше так не делать, хотя заказчику это бывает трудно объяснить. Правда потом он сам всё понимает, когда перелистывание страниц дин.списка превращается в диафильм.
ЧерныйКот; Plotks2017; Orlando Skibraves; AlexGroovy; ivanov660; olbu; t278; +7 Ответить
4. Сергей Зарайкин (CXY) 302 29.05.18 05:16 Сейчас в теме
(3) Далее можно этот алгоритм совершенствовать. Если это нужно.
5. Ildar Yusupov (ildary) 29.05.18 10:03 Сейчас в теме
(4) а если сделать не в СписокПриАктивизацииСтроки(), а через ПодключитьОбработчикОжидания?
6. Сергей Зарайкин (CXY) 302 29.05.18 11:10 Сейчас в теме
(5) Не пробовал. Скорее всего тоже можно.
7. Бубузяка (Бубузяка) 62 30.05.18 09:42 Сейчас в теме
(6) Если у вас есть доступ к ИТС, тогда в этой статье вы получите объяснение почему в вашем случае надо использовать "Подключить обработчик ожидания".
8. Сергей Зарайкин (CXY) 302 30.05.18 10:43 Сейчас в теме
(7) Я понимаю, о чём Вы. Более расширенное представление об этом в https://infostart.ru/public/568012/ , где можно и подключить обработчик ожидания, и ограничить используемые в обработке ресурсы в структуре СКД. Но я уже ранее сказал, дальше можно совершенствовать алгоритм...
9. Глеб Зломанов (Glebis) 10 30.05.18 11:09 Сейчас в теме
(8)
ограничить используемые в обработке ресурсы в структуре СКД
Имеется ввиду в убрать из Схемы все поля, по которым не нужно получать итог?
10. Сергей Зарайкин (CXY) 302 30.05.18 12:40 Сейчас в теме
И это тоже. Если использовать процедуру ПодключитьОбработчикОжидания, тогда надо сделать так:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ПриИзменении",1);
КонецПроцедуры

&НаКлиенте
Процедура ПриИзменении()
РассчитатьИтоги();
КонецПроцедуры


&НаСервере
Процедура РассчитатьИтоги()

Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,
Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

ЭтотОбъект.ЭтаФорма.Элементы.СуммаКОплате.ТекстПодвала = "Итого: " + Формат(Результат.Итог("СуммаКОплате"),"ЧДЦ=2; ЧН=-");

КонецПроцедуры

Работает.
12. Никита Заранко (nikita0832) 12 06.06.18 15:28 Сейчас в теме
Ещё промежуточные итоги можно в запросе получить. Не сильно бьет по производительности и проблем с перемоткой не будет. А общие итоги лучше выводить как Вы написали, но есть у дин списка "путь к данным подвала"
13. Юрий Пупкин (par_62) 12.06.18 19:50 Сейчас в теме
По моему для системы лучше сделать на форме кнопку или пункт меню обновить итоги и пусть пользователь сам их получает. А то такие вызовы даже с промежутком в 1 сек да еще и с тасканием формы на сервер... Слишком затратно
14. Сергей Зарайкин (CXY) 302 13.06.18 17:31 Сейчас в теме
(13) Разработчик сам решает, каким событием воспользоваться. Моя задача была показать путь быстрого и правильного решения, с использованием СКД. Одними запросами здесь проблему не решить, потому что пользователь может использовать фильтры, поиск и так далее... Ну а частота пересчета итогов и на какое событие повесить этот пересчет - это на усмотрение разработчика, вариантов множество.
Оставьте свое сообщение