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

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

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

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

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

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

16 Comments

  1. ifal
  2. CXY

    (1) Здесь намного короче

    Reply
  3. DarkUser

    Но лучше так не делать, хотя заказчику это бывает трудно объяснить. Правда потом он сам всё понимает, когда перелистывание страниц дин.списка превращается в диафильм.

    Reply
  4. CXY

    (3) Далее можно этот алгоритм совершенствовать. Если это нужно.

    Reply
  5. ildary

    (4) а если сделать не в СписокПриАктивизацииСтроки(), а через ПодключитьОбработчикОжидания?

    Reply
  6. CXY

    (5) Не пробовал. Скорее всего тоже можно.

    Reply
  7. Бубузяка

    (6) Если у вас есть доступ к ИТС, тогда в этой статье вы получите объяснение почему в вашем случае надо использовать «Подключить обработчик ожидания».

    Reply
  8. CXY

    (7) Я понимаю, о чём Вы. Более расширенное представление об этом в https://infostart.ru/public/568012/ , где можно и подключить обработчик ожидания, и ограничить используемые в обработке ресурсы в структуре СКД. Но я уже ранее сказал, дальше можно совершенствовать алгоритм…

    Reply
  9. Glebis

    (8)

    ограничить используемые в обработке ресурсы в структуре СКД

    Имеется ввиду в убрать из Схемы все поля, по которым не нужно получать итог?

    Reply
  10. CXY

    И это тоже. Если использовать процедуру ПодключитьОбработчикОжидания, тогда надо сделать так:

    &НаКлиенте

    Процедура ПриОткрытии(Отказ)

    ПодключитьОбработчикОжидания(«ПриИзменении»,1);

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

    &НаКлиенте

    Процедура ПриИзменении()

    РассчитатьИтоги();

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

    &НаСервере

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

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

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

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,

    Настройки,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый

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

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

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

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

    Работает.

    Reply
  11. nikita0832

    Ещё промежуточные итоги можно в запросе получить. Не сильно бьет по производительности и проблем с перемоткой не будет. А общие итоги лучше выводить как Вы написали, но есть у дин списка «путь к данным подвала»

    Reply
  12. par_62

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

    Reply
  13. CXY

    (13) Разработчик сам решает, каким событием воспользоваться. Моя задача была показать путь быстрого и правильного решения, с использованием СКД. Одними запросами здесь проблему не решить, потому что пользователь может использовать фильтры, поиск и так далее… Ну а частота пересчета итогов и на какое событие повесить этот пересчет — это на усмотрение разработчика, вариантов множество.

    Reply
  14. insurgut
    {Документ.ЗаказПокупателя.Форма.ФормаДокумента.Форма(46)}: В обработчике ТаблицаОплатПриАктивизацииСтрокиПосле используется вызов контекстного серверного метода формы

    И как обойти? Конечно же работа на тонком клиенте, ибо облачно вокруг.

    Reply
  15. CXY

    (15) Процедура РассчитатьИтоги должна выполняться на сервере, т.е. перед ней должна стоять строка &НаСервере. А вот вызвать эту процедуру можно из Вашей процедуры, которая априори должна выполняться на клиенте.

    Reply
  16. deutsch2008

    Было бы не плохо если отображало итоги по выделенным строкам 🙂

    Ставлю +

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *