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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с ДинамическимСписком в управляемых формах 1С часто возникает задача отображения итоговой суммы по определенной колонке. Стандартные инструменты ДинамическогоСписка ограничены тем, что он подгружает данные порциями для обеспечения высокой производительности. Поэтому простого свойства «итог в подвале» для всей выборки не существует. Давайте разберем, как реализовать этот функционал, учитывая все фильтры, которые пользователь задает в поиске или через панель отборов.

Основные ограничения динамического списка

Важно понимать, что ДинамическийСписок не является классической таблицей, хранящей все данные в оперативной памяти. Он работает через механизм КомпоновкиДанных, выполняя запросы к СУБД по мере прокрутки списка. Именно поэтому обработчики событий, такие как ПриПолученииДанныхНаСервере, не позволяют получить доступ ко всей выборке целиком — они работают только с текущей порцией данных. Попытка посчитать сумму в этом событии приведет к неверному результату, так как вы увидите только видимые строки.

Решение задачи через получение исполняемой схемы СКД

Для того чтобы учесть текущие отборы (включая строку поиска, которую пользователь ввел в поле поиска списка), нам необходимо «заставить» систему сгенерировать запрос, который учитывает текущее состояние настроек списка. Мы можем получить эти настройки программно, сформировать КомпоновщикМакета и выполнить его для получения данных в ТаблицуЗначений. Рассмотрим пошаговый алгоритм реализации.

  1. Создайте на форме кнопку «Рассчитать итоги».
  2. В обработчике нажатия кнопки на сервере вызовите получение исполняемой схемы и настроек из элемента формы типа ДинамическийСписок.
  3. Используйте КомпоновщикМакетаКомпоновкиДанных, чтобы превратить эти настройки в исполняемый макет.
  4. Выведите данные в ТаблицуЗначений, чтобы затем произвести математическое суммирование по нужной колонке.

Рассмотрим пример реализации кода для получения итогов:


&НаСервере
Процедура РассчитатьИтогиНаСервере()
    // Получаем схему и настройки непосредственно из элемента формы
    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    
    // Создаем компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в таблицу значений
    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ); 
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Теперь ТЗ содержит все отфильтрованные строки, можно считать сумму
    СуммаИтог = ТЗ.Итог("ИмяКолонкиСуммы");
    
    // Выводим результат в реквизит формы, отображаемый в подвале
    Объект.ИтоговаяСумма = СуммаИтог;
КонецПроцедуры

Важные рекомендации по производительности

Хотя предложенный способ позволяет решить задачу, необходимо помнить о нагрузке на систему:

Использование ПолучитьИсполняемыеНастройкиКомпоновкиДанных() — это наиболее эффективный способ «подхватить» все фильтры, установленные пользователем, включая стандартную строку поиска, которую платформа 1С автоматически добавляет в настройки динамического списка.

← На главную