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