Предлагаю вариант, как быстро сделать итоги в динамическом списке, например в форме списка журнала документов.
Итак, мне необходимо вставить итог по колонке СуммаКОплате в динамическом списке формы списка журнала документов. Для этого в модуле формы списка журнала документов создаем новую процедуру, я назвал ее РассчитатьИтоги(), и вставляем в неё такой код:
Процедура РассчитатьИтоги()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ЭтотОбъект.ЭтаФорма.Элементы.СуммаКОплате.ТекстПодвала = "Итого: " + Формат(Результат.Итог("СуммаКОплате"),"ЧДЦ=2; ЧН=-");
КонецПроцедуры
Затем делаем вставку вызова этой процедуры в любом обработчике событий, например СписокПриАктивизацииСтроки()
На этом всё, должно работать. Проверялась на релизах 8.3.10.2667, 8.3.11.2899.
Было жеhttps://infostart.ru/public/568012/
(1) Здесь намного короче
Но лучше так не делать, хотя заказчику это бывает трудно объяснить. Правда потом он сам всё понимает, когда перелистывание страниц дин.списка превращается в диафильм.
(3) Далее можно этот алгоритм совершенствовать. Если это нужно.
(4) а если сделать не в СписокПриАктивизацииСтроки(), а через ПодключитьОбработчикОжидания?
(5) Не пробовал. Скорее всего тоже можно.
(6) Если у вас есть доступ к ИТС, тогда вэтой статье вы получите объяснение почему в вашем случае надо использовать «Подключить обработчик ожидания».
(7) Я понимаю, о чём Вы. Более расширенное представление об этом вhttps://infostart.ru/public/568012/ , где можно и подключить обработчик ожидания, и ограничить используемые в обработке ресурсы в структуре СКД. Но я уже ранее сказал, дальше можно совершенствовать алгоритм…
(8)
Имеется ввиду в убрать из Схемы все поля, по которым не нужно получать итог?
И это тоже. Если использовать процедуру ПодключитьОбработчикОжидания, тогда надо сделать так:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания(«ПриИзменении»,1);
КонецПроцедуры
&НаКлиенте
Процедура ПриИзменении()
РассчитатьИтоги();
КонецПроцедуры
&НаСервере
Процедура РассчитатьИтоги()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,
Настройки,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ЭтотОбъект.ЭтаФорма.Элементы.СуммаКОплате.ТекстПодвала = «Итого: » + Формат(Результат.Итог(«СуммаКОплате»),»ЧДЦ=2; ЧН=-«);
КонецПроцедуры
Работает.
Ещё промежуточные итоги можно в запросе получить. Не сильно бьет по производительности и проблем с перемоткой не будет. А общие итоги лучше выводить как Вы написали, но есть у дин списка «путь к данным подвала»
По моему для системы лучше сделать на форме кнопку или пункт меню обновить итоги и пусть пользователь сам их получает. А то такие вызовы даже с промежутком в 1 сек да еще и с тасканием формы на сервер… Слишком затратно
(13) Разработчик сам решает, каким событием воспользоваться. Моя задача была показать путь быстрого и правильного решения, с использованием СКД. Одними запросами здесь проблему не решить, потому что пользователь может использовать фильтры, поиск и так далее… Ну а частота пересчета итогов и на какое событие повесить этот пересчет — это на усмотрение разработчика, вариантов множество.
И как обойти? Конечно же работа на тонком клиенте, ибо облачно вокруг.
(15) Процедура РассчитатьИтоги должна выполняться на сервере, т.е. перед ней должна стоять строка &НаСервере. А вот вызвать эту процедуру можно из Вашей процедуры, которая априори должна выполняться на клиенте.
Было бы не плохо если отображало итоги по выделенным строкам 🙂
Ставлю +