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

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

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

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